11

私はそのような問題を抱えており、誰かが私を助けてくれるなら私はいいでしょう。GISTインデックス付きのポイントテーブルがあります。それらのポイントは時間とともに変化しません。

特定のラインストリングの近くにあるポイントをフェッチしたいと思います。例:ラインストリングが道路であり、ポイントが道路に沿ったポイであると想像してください。指定された道路から5kmの距離にあるpoiを取得したいと思います。それらのポアを正しい順序(道路に沿った運転順序)で取得したいと思います。画像を見てください:

画像

ポイント1から5までの特定の道路について、道路から最大5 kmの位置にあるPOIを、道路に沿ってポイント1から5の順にフェッチしたいと思います。したがって、結果は次のようになります。

POI_ID
1
5
6
8
9
10
12
13

これにより、最小のコストで道路に沿って移動しているときにどのPOIにアクセスできるかがわかります。

誰かがpostgresとpostgisでそれを行う方法についていくつかのアイデアを持っていますか?

4

2 に答える 2

15

テーブル(LINESTRING) および(POINT)geomでメートルの投影 SRID を使用するジオメトリ列があると仮定すると、道路 (id = 123) から 5 km 以内のすべての POI を検索するクエリは次のようになります。roadpoi

SELECT poi.*, ST_Distance(road.geom, poi.geom)/1000.0 AS distance_km
FROM road, poi
WHERE road.id = 123 AND ST_DWithin(road.geom, poi.geom, 5000.0)
ORDER BY ST_LineLocatePoint(road.geom, poi.geom),
         ST_Distance(road.geom, poi.geom);

の最初のORDER部分ST_LineLocatePointは、ポイントが LINESTRING に沿っている場所に応じて、0.0 から 1.0 の間の分数を使用します。道路の方向が「間違った方向」に進んでいる場合は、追加DESCして順序を逆にします。2 番目の ORDER 部分は距離に基づいており、ポイントが LINESTRING の開始/終了をわずかに過ぎている場合に使用できます (ST_LineLocatePointそれぞれ 0.0 または 1.0 を返します)。

geographyこのクエリは、度ではなくメートルを自動的に計算するため、経度/緯度の値を持つタイプを使用している場合にも機能する可能性があります。詳細については、ドキュメントをご覧ください。

于 2012-04-24T00:31:10.797 に答える
0

昨年夏の PostgreSQL 9.1 リリースの KNN-GIST 機能を利用でき、PostGIS バージョン 2.0 でサポートされているようです。

http://blog.opengeo.org/2011/09/28/indexed-nearest-neighbour-search-in-postgis/

于 2012-04-23T20:56:11.797 に答える