PostGIS 基本教學
Dec 16, 2022
建立一個 sequence:
CREATE SEQUENCE demo_id_seq;
建立一個 demo 表格,並讓 id 隨著剛剛的 sequence 自動增加、還有一個 name 欄位:
CREATE TABLE demo ( id INTEGER PRIMARY KEY DEFAULT nextval('demo_id_seq'), name VARCHAR(40) );
增加 location 欄位,使用 4326 的 SRID:
SELECT AddGeometryColumn('demo', 'location', 4326, 'POINT', 2);
建立索引:
CREATE INDEX demo_location_idx on demo using GIST (location);
新增點位:
ST_GeomFromText
的函式,他可以把文字轉成座標。
另外因為我們使用經緯度,所以使用 4326 這個 SRID。
# 101 座標
INSERT INTO demo(name, location) VALUES ('Taipei 101', ST_GeomFromText('POINT(121.5646380 25.0339138)', 4326));
# ntust 台科座標
INSERT INTO demo(name, location) VALUES ('ntust', ST_GeomFromText('POINT(121.5394628 25.0130727)', 4326));
資料查詢
# 查詢兩點距離
SELECT ST_Distance( ST_Transform((SELECT location FROM demo WHERE name='Taipei 101'), 900913), ST_Transform((SELECT location FROM demo WHERE name='ntust'), 900913) )as distance;
#查詢和臺北101相距 4000 公尺內的點(排除掉自己)
SELECT * FROM demo WHERE ST_Distance( ST_Transform(location, 900913), ST_Transform((SELECT location FROM demo WHERE name='Taipei 101'), 900913) ) < 4000 and name<>'Taipei 101';