Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@takahi

ST_GeomFromEWKTとST_GeometryFromTextのどちらを使うべきか

More than 3 years have passed since last update.

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で標準化されているものではありません。両者の包含関係は下図の用になります。 スクリーンショット 2017-01-28 22.29.17.png

EWKTの拡張内容

PostGIS 1.5で拡張されたもの

  • SRIDの記述
  • 3次元データへの対応
  • 曲線ストリング(CIRCULARSTRING)の対応

PostGIS 2.0から拡張されたもの

  • 多面体サーフェス
  • 三角形と不整三角形網(TIN)

記述例

ST_GeomFromEWKTとST_GeometryFromTextの具体的な利用法を記載します。

Well-known textの記述例

北緯35度、東経140度のポイントデータを記述する場合、型と座標を下記のように表現します。

wkt_point
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 が返却される事が期待出来ます。

EWKT_Test
-- 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と同様の動作を確認しました。

1
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
takahi
このサイトの掲載内容は私個人の見解であり、必ずしも私が所属する会社、組織、団体の立場、戦略、意見を代表するものではありません。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?