Chapter 13

EWKTとジオメトリとの変換

boiledorange73
boiledorange73
2020.10.26に更新

はじめに

「WKTとジオメトリとの変換」で、"EWKT"という書式について若干触れました。

ここでは、EWKTがどういうものかを説明します。

EWKTとはWKT+SRID情報

EWKT (Extended WKT)は、PostGIS独自の仕様で、OGC WKTとは上位互換となっています。

WKTにSRID(「空間参照系の概要」をご参照下さい)は依然としてついていません。EWKTでは、先頭にSRID=(数字);POINT(...)といったふうに、WKTの前にSRIDを指定して、;で区切ることで、そのジオメトリのSRIDが指定できます。

OGC標準であるST_GeomFromText()を使う場合は、関数の第2引数にSRIDを指定できるので問題ありませんが、PostGIS独自のキャストによる変換では、文字列に何としてもSRIDを埋め込む必要があったため、このような書式が生まれたのだと思います。

他にも、ほんの少し違うところがあります。WKTが2次元座標にしか対応していない時に、EWKTはタイプ名に座標次元を組み合わせることで3次元座標、4次元座標に対応できるように拡張しましたが、この際、POINTZとかPOINTM等としました。現在のWKTは3次元、4次元に対応しているのですが、POINT Z等とタイプ名と座標次元とに空白を入れます。このように、ほんの少しの違いがあります。

まとめると、現在では、EWKTはWKTにSRID情報を追加できるもの、ととらえてください。

ジオメトリからEWKTへの変換

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

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

              st_asewkt               
--------------------------------------
 SRID=3857;POLYGON((2 2,2 1,1 1,2 2))
(1 行)

EWKTからジオメトリへの変換

ST_GeomFromEWKT(text)で変換するか、キャストを使います。関数については、ST_...FromTextをタイプ別に用意していません。SQL/MMから外れるのですが、EWKT自体が外れているものなので、気にしないようにします。

db=# SELECT ST_GeomFromEWKT('SRID=4326;POINT(135 35)');
                  st_geomfromewkt                   
----------------------------------------------------
 0101000020E61000000000000000E060400000000000804140
(1 行)

db=# SELECT 'SRID=4326;POINT(135 35)'::GEOMETRY;
                      geometry                      
----------------------------------------------------
 0101000020E61000000000000000E060400000000000804140
(1 行)

おわりに

EWKTについて説明しました。基本的にはSRID情報が付加されたWKTと考えて差し支えありません。

正直なところ、WKTよりEWKTの方が使います。テキストデータからダンプデータを生成する際には、EWKTをそのまま書き込むようにしています。そうすると、格納時に勝手にジオメトリにキャストして格納してくれます。

ただし、バイナリデータを扱う際にはWKB/EWKBを使います。