Using PostGIS¶
次の例では、PostGIS関数を使用して空間オブジェクトを作成および照会します。 PostGIS関数の詳細については、 official PostGIS documentation を参照してください。
次のコマンドは、GISデータとジオメトリ列を保持するroads
という名前のテーブルを作成します。
CREATE TABLE roads ( ID int4, NAME varchar(128) );
PostGIS AddGeometryColumn 関数を使用して、テーブルに列を追加します。
SELECT AddGeometryColumn( roads, geom, -1, GEOMETRY, 2 );
次のSQLコマンドを使用して、テーブルroads
にデータを挿入します。このデータは、 Linestring
(2点間の線)のタイプのジオメトリで構成されています。
INSERT INTO ROADS (ID,GEOM,NAME ) VALUES (1,ST_GeomFromText(LINESTRING(0 10,0 0),-1),Beacon Road);
INSERT INTO ROADS (ID,GEOM,NAME ) VALUES (2,ST_GeomFromText(LINESTRING(0 0,0 10),-1),Violet Road);
INSERT INTO ROADS (ID,GEOM,NAME ) VALUES (3,ST_GeomFromText(LINESTRING(0 0,10 0),-1),Skelton Street);
INSERT INTO ROADS (ID,GEOM,NAME ) VALUES (4,ST_GeomFromText(LINESTRING(0 0,10 10),-1),Fifth Avenue);
INSERT INTO ROADS (ID,GEOM,NAME ) VALUES (5,ST_GeomFromText(LINESTRING(0 10,0 0),-1),Main Street);
INSERT INTO ROADS (ID,GEOM,NAME ) VALUES (6,ST_GeomFromText(LINESTRING(10 0,0 0),-1),Lipton Street);
GIST
ファンクションを使用して、ジオメトリ列にインデックスを作成できます。
CREATE INDEX roads_index ON roads using GIST (geom);
AsText(geometry) は、ジオメトリのテキスト表現を返すPostGIS関数です。
SELECT id, ST_AsText(geom) AS geom, name FROM ROADS order by id;
__OUTPUT__
id | geom | name
- ---+-----------------------+----------------
1 | LINESTRING(0 10,0 0) | Bacon Road
2 | LINESTRING(0 0,0 10) | Violet Road
3 | LINESTRING(0 0,10 0) | Skelton Street
4 | LINESTRING(0 0,10 10) | Fifth Avenue
5 | LINESTRING(0 10,0 0) | Main Street
6 | LINESTRING(10 0,0 0) | Lipton Street
(6 rows)
インデックスが作成されたら、クエリで && 演算子を使用できます。
SELECT NAME, ST_AsText(GEOM) FROM ROADS WHERE GEOM && SetSRID(BOX3D(10 10,10 10)::box3d,-1);
__OUTPUT__
name | astext
- -------------+-----------------------
Fifth Avenue | LINESTRING(0 0,10 10)
(1 row)
BOX3D 関数を使用して、境界ボックスを指定します。 &&
演算子は、インデックスを使用して、結果セットを指定された領域と重なる境界ボックスを持つジオメトリのみにすばやく削減します。
~=
演算子を使用して、2つのジオメトリが幾何学的に同一かどうかを確認できます。
SELECT ID, NAME FROM roads WHERE GEOM ~= ST_GeomFromText(LINESTRING(0 10,0 0),-1) order by id;
__OUTPUT__
id | name
- ---+-------------
1 | Bacon Road
5 | Main Street
(2 rows)