PostGISの使用¶
次の例では、PostGIS関数を使用して空間オブジェクトを作成およびクエリします。PostGISの一部である関数の詳細については、`PostGISの公式ドキュメント<https://postgis.net/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;
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);
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;
id | name
----+-------------
1 | Bacon Road
5 | Main Street
(2 rows)