12

次の簡単な表があります。

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" はポリゴン タイプですが、式はジオメトリ タイプです

これは不自由です。だから私の最初の質問は次のとおりです。

  1. 本当にキャストする必要がありますか?

とにかく、キャストした後は動作します。そして今、単純な 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 の呼び出しを怠って、自分でジオメトリ列を追加するだけでは、天国は禁じられています)。

4

2 に答える 2

11

ポリゴンは、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)

これはポリゴンの最小境界円であり、Postgrescircleタイプとして表されます。すべての幾何演算子はここに文書化されています:http://www.postgresql.org/docs/8.3/interactive/functions-geometry.html ベースポリゴンには投影データ、SRIDなどがないため、PostGISで動作する場合おそらく、デフォルトでプリセットに設定され、幸運に恵まれているだけです。しかしもちろん、地理空間以下のスケールのジオメトリが必要な場合もたくさんあります。

于 2009-06-19T00:31:46.480 に答える
9

わかりました、奇妙なことに、私は次のはるかに単純な構文が機能することを発見しました:

insert into tbl_test (poly) values ('(0,0),(0,10),(10, 10), (0, 0)')

select * from tbl_test where poly @> '(2, 8)'

しかし、私はこれらの関数と演算子のセットの違いを理解するのに苦労しています。この短い構文(実際にはOpenGISに準拠していません)は、同じ空間インデックスなどを利用していますか?

于 2009-06-18T13:39:59.890 に答える