WKTとジオメトリとの変換

はじめに

WKTとジオメトリとは相互に変換可能でなければなりません、ていうか、相互変換の機能が提供されていないならWKTにする意味がありません。

地理空間を扱うSQL関数の標準は ISO/IEC 13249-3 で定めれています(SQL/MM 3)。また、JISについては JIS X 3006-3が該当します。これらの規格には、WKTとジオメトリとの相互に変換するための関数群が記載されています。そのうち、PostGISで利用可能な関数について紹介します。

ジオメトリからWKT

ST_AsText(geom) で、WKTを出力します。

db=# SELECT ST_AsText(  
  ST_Intersection(  
    'POLYGON((0 0, 2 0, 2 2, 0 0))'::GEOMETRY,  
    'POLYGON((0 1, 2 1, 2 2, 0 2, 0 1))'::GEOMETRY  
  )  
);  

         st_astext            
----------------------------  
 POLYGON((2 2,2 1,1 1,2 2))  
(1 行)  

WKTからジオメトリ

とりあえずこれ知っとけばOK

  • ST_GeomFromText(wkt [,srid])

すべての種類のWKTをジオメトリに変換します。
SRIDは空間参照系IDを示す整数値です。ここでは、とりあえず無視します。

単一ジオメトリ用

次に示す関数は、対応するジオメトリタイプが限られているものです。

  • ST_PointFromText(wkt [,srid])
  • ST_LineFromText(wkt [,srid])
  • ST_PolyFromText(wkt [,srid])
  • ST_BdPolyFromText(wkt, srid)

それぞれ、ポイント、ラインストリング、ポリゴン、ポリゴンを生成します。
最後のST_BdPolyFromTextは、マルチラインストリングのWKTを引数に取り、マルチラインストリングを境界線としたポリゴンを生成します。WKTと生成されるジオメトリタイプが異なる点で注意が必要です。また、PostGIS独自の問題として、sridを必ず取る必要があります。SRIDを指定したくない場合には、0を指定します。

マルチ系ジオメトリ用

  • ST_MPointFromText(wkt [,srid])
  • ST_MLineFromText(wkt [,srid])
  • ST_MPolyFromText(wkt [,srid])
  • ST_BdMPolyFromText(wkt, srid)

それぞれ、マルチポイント、マルチラインストリング、マルチポリゴン、マルチポリゴンを生成します。
最後のST_BdMPolyFromTextは、前述のST_BdPolyFromTextと同じで、マルチラインストリングのWKTを引数に取り、マルチラインストリングを境界線としたポリゴンを生成します。SRIDを指定したくない場合には、0を指定します。

PostGISではWKTからジオメトリの変換はキャストでOK

ここまでで、しれっと'POLYGON((0 0, 2 0, 2 2, 0 0))'::GEOMETRYとか記述している通り、WKT文字列からGEOMETRY型へのキャストでジオメトリが生成されます。

ただし、文字列からキャストされるのは、WKTでなくEWKT (Extended WKT)です。ここでは詳細は省きますが、PostGIS独自の仕様で、OGC WKTとは上位互換となっています。

逆にジオメトリをテキストにキャストした場合には、次のようになります。

db=# SELECT ('POINT Z(1 2 3)'::GEOMETRY)::TEXT;  
                            text                              
------------------------------------------------------------  
 0101000080000000000000F03F00000000000000400000000000000840  
(1 行)  

これは、EWKB(Extended Well-Known Binary)のHEX表現です。ここでは詳細は省きますが、WKTに変換されないことだけ知っておいて下さい。

おわりに

WKTからジオメトリ、ジオメトリからWKTにそれぞれ変換する関数を紹介し、WKTからジオメトリの変換はキャストで済むことを示しました。

ここでは、SRID (空間参照系ID)、EWKT (Extended Well-Known Text)、EWKB (Extended Well-Known Binary)という言葉が出てきましが無視しました。別の機会に譲りたいと思います。

本記事のライセンス


この記事は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。