PostGISでバウンディングボックスクエリを実行していますか?[閉まっている]


22

ほぼ200万行のPostgreSQLテーブルcoordinatesがあり、フォーム内にlong-lat フィールドがありますPOINT(-73.4938 33.2405)

そのフィールドに地理空間インデックスがあると仮定すると、任意の境界ボックス内のすべての行を選択する最も効率的で最速の方法は何ですか?

ボックスはのようなものですSW long-lat: -74.0042 40.7688NE long-lat: -73.8809 40.7984


格納された座標はすでに長い緯度ですか、それともグリッド(X、Y)ですか?
マーティンF 14年

1
単純な数学がここで行うでしょう... point.xがSW.xより大きくNE.xより小さく、point.yがSW.yより大きくNE.yより小さい場合、ポイントは内部にありますMBR。ただし、空間クエリを使用するよりも高速かどうかはわかりません。試してみたいですか?
ミハルツィンマーマン14年

@zimmi:彼は、アイテム単なるポイントであることを実際には述べていません。それらは複雑な形状である可能性があります。
マーティンF 14年

ただし、それら単なるポイントです;-)。これらは、WKBとして保存されたPOINT(-73.4938 33.24059)の形式の長い緯度です。
アヴィシャイ14年

Q(およびA)を編集して、その情報を反映させました。:-)
マーティンF 14年

回答:


24

与えられた境界ボックスの制限が、格納されている座標と同じ空間参照系にあり、必要な空間演算子(交差または包含)がわかっていると仮定します。

SELECT *
FROM   my_table
WHERE  coordinates 
    && -- intersects,  gets more rows  -- CHOOSE ONLY THE
    @ -- contained by, gets fewer rows -- ONE YOU NEED!
    ST_MakeEnvelope (
        xmin, ymin, -- bounding 
        xmax, ymax, -- box limits
        my_srid)

あるいは、「〜を含む」ではなく「〜を含む」という音を好む場合は、WHERE句を反転する必要があります。

WHERE  ST_MakeEnvelope (...)
    ~ -- contains, gets same fewer rows 
    coordinates 

PS:(上記の投稿後OPによって)レコード単純なポイントであるとする、「交差」と「封じ込め」の違いは非常に微妙になり、境界ボックスのエッジのポイントのみに影響すると思います。


それは良い点です。[Contains]は、境界上にあるマップマーカー(ブラウザのクロムなど)を実際に見ることができないため、問題ないはずです。
アヴィシャイ14年

What's the fastest ...?:OP
マグノC

注意してください:&&@ポリゴンジオメトリと交差する際に動作するようには思えません。この場合、使用するST_Intersects(latlng_column,ST_GeomFromText('Polygon ((...))',4326))か、代わりにST_Contains
アレックス

4
SELECT ST_Y(the_geom) AS latitude, ST_X(the_geom) as longitude
from units u where the_geom && ST_MakeEnvelope(left, bottom, right, top, 4326)

1
4326がSRIDであると言う必要はありません。
マグノC 14年

2

どうやら、コメントを追加するのに十分なポイントがないため、このアンサーを使用して、「x> min_xとx <max_xおよびy> min_yとy <max_y」のST_MakeEnvelopeと数学の比較を試しました。 ..平均して、ST_MakeEnvelopeは60ミリ秒かかり、数学の比較は私の特定のbboxクエリで155ミリ秒かかりました。

したがって、空間検索ST_MakeEnvelopeは、数学の比較よりも高速でなければなりません!


1
実際、適切なインデックスを作成すると、min_x、max_x、min_y、max_yははるかに高速になります。非常に大きなデータセット(300万以上のポリゴン)がありINDEX、ST_MakeEnvelopeと(ST_XMax、ST_XMin、ST_YMax、ST_YMin)の両方を使用しましたが、その差は数学にとって非常に有利です。数学は20秒(INDEX +クエリ)未満でしたが、エンベロープ交差は2分以上かかりました(2分に達したとき、空間インデックスのみで40
秒になりました
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.