PostGISを利用してみる。

使用するのは
 PostgreSQL8.2.3
 PostGIS1.2

PostgreSQLPostGISのインストール手順は省きます。


PostGISを利用するにはデータベース作成時に「template_postgis」をテンプレートに指定します。

createdb -U postgres -E UTF-8 -T template_postgis SampleDB


つづいて以下のようなテーブルを作成します。

カラム名
idserial
pointgeometry
linegeometry
polygongeometry

まずはテーブルを作成します。

CREATE TABLE SAMPLE (id SERIAL);


上記ではidのみを作成しました。
次にジオメトリを使用する場合は

AddGeometryColumn(table_name, column_name, srid, type, dimension)

を使用します。

引数は以下の通り
table_name : 追加するテーブル名
column_name : 追加するカラム名
srid : SPATIAL_REF_SYSテーブルに存在する値(不明時には-1)
type : 型
dimension : 次元


上記を参考にAddGeometryColumn関数を使用するとSAMPLEテーブルにカラムが追加されます。

SELECT AddGeometryColumn('sample', 'point', 4326, 'POINT', 2);
SELECT AddGeometryColumn('sample', 'line', 4326, 'LINESTRING', 2);
SELECT AddGeometryColumn('sample', 'polygon', 4326, 'POLYGON', 2);

次にINSERT文

INSERTする際に以下の関数を使用して、文字列からgeometry型に変換します。

GeomFromText("文字列", srid)


INSERT文のサンプルです。

INSERT INTO SAMPLE (point, line, polygon) VALUES (GeomFromText('POINT(50 50)', 4326), GeomFromText('LINESTRING(1 1, 99 99)', 4326), GeomFromText('POLYGON((25 25, 75 25, 75 75, 25 75, 25 25))', 4326));


ここで

GeomFromText('POLYGON((25 25, 75 25, 75 75, 25 75, 25 25))', 4326)

ポリゴンだけが小括弧2つで囲まれていますが

GeomFromText('POLYGON((25 25, 75 25, 75 75, 25 75, 25 25), (30 30, 70 30, 70 70, 30 70, 30 30))', 4326)

のように複数書くことが出来るらしいです。
ちなみに小括弧を1つにするとエラーが発生します。(ここではまった><)


登録したジオメトリを取得します。

SELECT AsText(polygon) AS polygon FROM SAMPLE;


AsText関数を使用します。

AsText(カラム名)


AsText関数を使用しないと以下のようになってしまいます。

SELECT polygon AS polygon FROM SAMPLE;

polygon
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0103000020E61000000100000005000000000000000000394000000000000039400000000000C0524000000000000039400000000000C052400000000000C0524000000000000039400000000000C0524000000000000039400000000000003940
ST_Intersects(geometry1, geometry2)

この関数を使用することで一定の領域に含まれているか調べます。

geometry1とgeometry2が共通領域を持っていればTrueを返します。(geometry1∩geometry2が存在する場合True)

SELECT CASE WHEN ST_Intersects(point, polygon)
            THEN '含まれている'
            ELSE '含まれていない'
       END
  FROM SAMPLE;

上記のSQLを実行すれば「含まれている」が表示されると思います。