Chapter 12

WKTとジオメトリとの変換

boiledorange73
boiledorange73
2021.04.20に更新

はじめに

「ジオメトリタイプ一覧をながめる」では、WKTからPostGISで使用されるジオメトリ一覧を示しました。WKTはデータ交換の相互運用を意識して書式が一応標準化されています。他方、PostGIS等の地理空間データベースにおけるジオメトリのデータ形式は、それぞれの設計に負うものですので、統一されていません。相互運用性を高めるためには、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)です。

ジオメトリから文字列へキャストするとどうなる

逆にジオメトリをテキストにキャストした場合にはどうなるでしょう。

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

少なくともWKTに変換されていないことが分かります。

なお、これは後で出てくるEWKB(Extended Well-Known Binary)のHEX表現です。

おわりに

WKTからジオメトリ、ジオメトリからWKTにそれぞれ変換する関数を紹介し、WKTからジオメトリの変換はキャストで済むことを示しました。また、キャストによる変換で必要となるEWKTについても触れました。

後でも述べますが、EWKTの方がよく使います。もっとも、EWKTを理解するには、まずはWKTを理解する必要があるので、ここの記述はおさえておいて下さい。