web-dev-qa-db-ja.com

PostGISでの最短距離計算の問題

PostGIS pgroutingで作業している間、2つの道路(線)間の距離を計算するために、_shortest_path_関数を使用しています。

ロジックはstart_point(Start_id)end_point(end_id)に基づいていますが、私のデータでは、行文字列には(linestring(1 1,2 2,3 3,4 4,5 5)など)のような多くの内部ポイントが含まれています。

したがって、開始点を_(1 1)_とし、終点を_(5 5)_とします。別の行が_(5 5)_で始まる場合、linestring(5 5,6 6)のようなルートとして表示されます。

ただし、_(2 2,3 3,4 4)_のようにラインストリング内に交差点があるラインは、接続されているとは見なされません。

たとえば、次の道路テーブルを使用します。

_id         name                way
1          A                   linestring(1 1,2 2,3 3,4 4,5 5)
2          B                   linestring(5 5,6 6)
3          c                   linestring(2 1,2 2,2 3)
_

_shortest_path_関数をポイント_(1 1)_から_(6 6)_に適用すると、パスが決定されます。しかし、_(1 1)_から_(2 3)_の場合、何も見つかりません。 _(1 1,2 2,2 3)_ルートが見つかりません。

関数が線の始点と終点だけでなく、各セグメントの内部点を考慮するようにするには、何をする必要がありますか?

2
Deepak M

たぶんこれはあなたを始めるのに役立つでしょうが、これが私がこれを通してどのように考えているかです。

交差しない限り、2本の直線が端よりも中央で近くなる球面三角法については考えられません。各道路の頂点と最も近い点に検索を絞り込むことができると思います。他の道路のその頂点。あなたの道路は大円に沿った線分としてモデル化されていると思います。

したがって、これが完全な解決策であるとは思いませんが、私が検討しているのは次のとおりです。

  1. これらの線は交差していますか?すべての交差点がデータベースにそのようにリストされていると仮定すると、いいえと仮定できます。
  2. もしそうなら、それが最も近いポイントです。
  3. そうでない場合は、両方の道路の頂点を取得し、もう一方の線分に垂直な線を描画して、交差点までの距離を計算します。あなたの最短点はこれらの線の最小値になります。

それが最良の答えのようです。ポイントを計算する必要があります。 PostGISでこれを行う魔法の方法はわかりませんが、球面三角法が助けになるかもしれません。もちろん、距離が十分に小さい場合は、平面トリガーで十分な場合があります。

1
Chris Travers