次の簡単な表があります。
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 に基づいていないことでした (そのため、関連する関数やジオメトリ カラム テーブルなどがありませんでした)。結論として、PostGIS が何百もの関数、行、およびいくつかのテーブルを DB に追加することを要求する方法は、GIS サポートが完全に不十分であることを述べておきます。これにより、スキーマのバックアップが非常に複雑になり、エラーが発生しやすくなります (AddGeometryColumn の呼び出しを怠って、自分でジオメトリ列を追加するだけでは、天国は禁じられています)。