PostgreSQLを使用したポイントインポリゴンのSQLクエリ
-
06-07-2019 - |
質問
次の簡単な表があります:
CREATE TABLE tbl_test
(
id serial NOT NULL,
poly polygon NOT NULL
)
WITH (OIDS=FALSE);
次に、ポリゴンを含む行を挿入しようとします:
insert into tbl_test values(1, PolyFromText('POLYGON((0 0, 10 10, 10 0, 0 0))'))
このエラーに遭遇する:
列" poly"タイプはポリゴンですが、式はジオメトリタイプです
ラメはどれですか。だから私の最初の質問は:
- 本当にキャストする必要がありますか?
とにかく、キャスト後は動作します。そして今、私は簡単なST_Containsクエリを実行しようとしています:
select id, poly from tbl_test where ST_Contains(poly, Point(GeomFromText('POINT(9 2)')))
エラーが発生するもの:
ERROR: function st_contains(polygon, point) does not exist
LINE 1: select id, poly from tbl_test where ST_Contains(poly, Point(...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
私は何をすべきか?
次の機能:
select st_contains(st_geomfromtext('POLYGON((0 0, 10 10, 10 0, 0 0))'), st_geomfromtext('POINT(0 0)'))
しかし、これはおそらく両方の引数がGeometry型であるためです。テーブルデータに対する実際のクエリは機能しません。
回答:
ドイ!問題は、私が作成したDBがpostgisテンプレートDBに基づいていないことでした(したがって、関連する関数やジオメトリ列テーブルなどがありませんでした)。 最後に、GISをサポートするためにPostGISで何百もの関数、行、およびいくつかのテーブルをDBに追加する必要があるという方法は、完全に不十分であることに注意してください。スキーマのバックアップがより複雑になり、非常にエラーが発生しやすくなります(AddGeometryColumnを呼び出して、自分でジオメトリ列を追加するだけのことをお勧めしません)。
解決
ポリゴンは、PostGISの上に構築される基本的なPostgresタイプです。 PostGIS関数 select AddGeometryColumn(...)
でジオメトリ列を有効にします。それ以外の場合は、直線ポリゴンを使用しています:
=> create table gt (id int, space polygon);
=> insert into gt values (1, '((2,2),(3,4),(3,6),(1,1))');
INSERT 0 1
=> select point(space) from gt where id = 1;
point
-------------
(2.25,3.25)
(1 row)
これはポリゴンの中心点です
=> select circle(space) from gt where id = 1;
circle
--------------------------------
<(2.25,3.25),1.93994028704315>
(1 row)
これは、ポリゴンの最小境界円で、Postgresの circle
タイプとして表されます。すべての幾何演算子は、こちら:http://www.postgresql.orgに文書化されています。 /docs/8.3/interactive/functions-geometry.html ベースポリゴンには投影データやSRIDなどがありません。したがって、PostGISで動作する場合は、おそらくデフォルトにプリセットされており、幸運です。しかし、もちろん、単純にサブ地理空間スケールのジオメトリが必要な場合がたくさんあります。
他のヒント
わかりました。奇妙なことに、次のはるかに単純な構文が機能することがわかりました。
insert into tbl_test (poly) values ('(0,0),(0,10),(10, 10), (0, 0)')
select * from tbl_test where poly @> '(2, 8)'
しかし、私はこれらの関数と演算子のセットの違いを理解するのに苦労しています。この短い構文(実際にはOpenGISに準拠していない)は、同じ空間インデックスなどを利用していますか?