Well-known textからGEOMETRY型への変換関数
CSV等のテキストデータから、PostGISのジオメトリ型を生成する場合、Well-known text形式で記述することにより、ポイント、ライン、ポリゴン等の多彩な表現が可能です。
PostGISでは、ST_GeometryFromText関数とバージョン1.5から追加されたST_GeomFromEWKTの2つがあります。本投稿は両者の違いを認識し、より使いこなせればと思い調査いたしました。
WKTとEWKTの関係
- Well-known text(WKT) : Open Geospatial Consortium (OGC) により策定された標準化された規格であり、PostGIS以外にもDB2等の他のRDBでも用いられています。
- Enhance Well-known text(EWKT) : PostGISが独自に拡張(Enhance)したWKTで標準化されているものではありません。両者の包含関係は下図の用になります。
EWKTの拡張内容
PostGIS 1.5で拡張されたもの
- SRIDの記述
- 3次元データへの対応
- 曲線ストリング(CIRCULARSTRING)の対応
PostGIS 2.0から拡張されたもの
- 多面体サーフェス
- 三角形と不整三角形網(TIN)
記述例
ST_GeomFromEWKTとST_GeometryFromTextの具体的な利用法を記載します。
Well-known textの記述例
北緯35度、東経140度のポイントデータを記述する場合、型と座標を下記のように表現します。
POINT(140 35)
Well-known textからGeometry型への変換
標準的なWKTの場合に於いては、2つの関数に違いはありません。
- ST_GeometryFromTextの場合
SELECT ST_GeometryFromText('POINT(140 35)')
- ST_GeomFromEWKTの場合
SELECT ST_GeomFromEWKT('POINT(140 35)')
ジオメトリオブジェクトにSRIDを設定
旧日本測地系(4301)を設定してみます。EWKTには直接SRIDを表記可能です。
- ST_GeometryFromTextの場合
-- 第2引数を用いる方法
SELECT ST_GeometryFromText('POINT(140 35)' , 4301 );
-- ST_SetSRIDを用いる方法
SELECT ST_SetSRID( ST_GeometryFromText('POINT(140 35)'), 4301 );
- ST_GeomFromEWKTの場合
SELECT ST_GeomFromEWKT('SRID=4301;POINT(140 35)');
EWKTのSRIDを記載するにはWKTの前にSRID=番号;
という書式で表記します。
PostGISでの動作実験
ST_GeometryFromTextにEWKTを入力した場合どうなるか調査しました。ST_GeometryFromTextがEWKTを受け入れない仕様でしたら、下記のSQLはエラーが返って来ることが期待されます。
SRIDの入力を拒否するのであれば、SRIDが未知であるため1行目は-1 が返却される事が期待出来ます。
-- test1
SELECT ST_GeometryFromText('SRID=4301;POINT(140 35 10 1)');
-- test2
SELECT ST_GeomFromEWKT('SRID=4301;POINT(140 35 10 1)') ;
-- test3
SELECT 'SRID=4301;POINT(140 35 10 1)'::geometry ;
-- test4
SELECT CAST( 'SRID=4301;POINT(140 35 10 1)' AS geometry ) ;
-- test5
SELECT 'SRID=4301;POINT(140 35 10 1)'::geography ;
No | テストケース | 動作結果 | WARNING出力 |
---|---|---|---|
1 | ST_GeometryFromTextにEWKT | ◯ | 有り |
2 | ST_GeomFromEWKTにEWKT | ◯ | |
3 | EWKTをキャスト演算子でキャスト | ◯ | |
4 | EWKTをキャスト関数でキャスト | ◯ | |
5 | EWKTをキャスト演算子でGEOGRAPHY型にキャスト | △ |
(動作確認時の環境 PostGIS 2.1 USE_GEOS=1 USE_PROJ=1 USE_STATS=1 )
-
テストケース1 ST_GeometryFromTextについては、
WARNING: OGC WKT expected, EWKT provided - use GeomFromEWKT() for this
というEWKTが入力されていることへのWARNINGメッセージが出力されました。 - テストケース5 GEOGRAPHY型にキャストされましたが、旧日本測地系のSRIDが指定しましたが、測地変換はされませんでした。
まとめ
「どちらを使うべきか?」という検討では、現在のPostGISの動作ではST_GeometryFromTextもEWKTを受け入れますが、WARNINGメッセージが出力されることが確認されました。EWKTを利用する際には、ST_GeometryFromTextやST_GeomFromTextは利用しないほうが良いと思われます。
また、キャスト演算子やキャスト関数では、ST_GeomFromEWKTと同様の動作を確認しました。