2

クエリがあります: (このクエリは、ST_Covers 関数の地理的実装を使用します)

SELECT ST_Covers(ST_GeoGraphyFromText('MULTIPOLYGON(((179 -89,179 89,-179 89,-179 -89,179 -89)))'),ST_GeographyFromText('POINT(20 30)'));

このクエリを実行すると、true が返されるはずですが、false が返されます。PostGIS (またはこのクエリ) のどこが悪いのかわかりません

そして、地理的な実装を幾何学的なものに変更し、クエリを次のように再配置すると:

SELECT ST_Covers(ST_ASTEXT(ST_GeoGraphyFromText('MULTIPOLYGON(((179 -89,179 89,-179 89,-179 -89,179 -89)))')),text('POINT(20 30)'));

正常に動作し、true を返します。

以下のクエリを使用してコンテンツを作成できますが、問題はデータベースが大きすぎると時間がかかりすぎることです

誰か教えてください

クエリ 1 を正しく機能させる方法 (意図したとおり、true を返す)、または

クエリ 2 を大きなテーブルで高速に動作させる方法

(*ST_GeoGraphyFromText('MULTIPOLYGON(((179 -89,179 89,-179 89,-179 -89,179 -89)*)* は、列のデータに置き換えられる地理的データのみを表しているため、削除する必要はありません。テーブル )

クエリ 1 が機能しない他の値は (5 5) (10 10) (-10 -10) などです。

4

1 に答える 1

1

geography幅が 180° を超える型を使用しているため、最初のクエリは失敗します。などのより現実的なものである場合、'MULTIPOLYGON(((100 0,100 50,0 50,0 0,100 0)))'TRUE が返されます。

MultiPolygon 地理タイプの外部リングの最大直径を直接見つける方法はありませんが、次のような方法でこれらの特定のケースを探し出すことができます。

SELECT ST_XMax(geog::geometry) - ST_XMin(geog::geometry) AS width,
       ST_YMax(geog::geometry) - ST_YMin(geog::geometry) AS height
FROM polygons

> 180 のものを調べ、各パーツも > 180 であるかどうかを確認します。もしそうなら、これらは無効な地理と見なされるべきです。


2 番目のクエリが TRUE を返す唯一の理由は、ST_AsText が WKT に変換され、その後 WKB にgeometry型として再解釈される (そして暗黙的ST_Covers(geometry, geometry)に ではなく を呼び出すST_Covers(geography, geography)) ためです。このクエリは、WKB から WKT から WKB に変換するため低速であり、変換の間に精度が失われる可能性があります。これのより高速なバージョンは、 を使用して geography 列をジオメトリにキャストすることです。次に::geometry例を示します。

SELECT ST_Covers(geog::geometry, ST_SetSRID(ST_MakePoint(20, 30), 4326))
FROM polygons

ジオメトリ タイプは、ST_Covers に単純な「平らな地球」のデカルト ロジックを使用します。これが、期待どおりに TRUE と表示される理由です。地理タイプは、より複雑な球体ロジックを使用する別の「丸い地球」ロジックを使用しますが、地球儀が手元にあれば簡単に確認できます。

于 2013-01-20T23:16:55.167 に答える