セグメントが重複しているラインストリングからサブラインストリングを抽出する方法


15

問題ステートメント:バスルート(ラインストリングln.the_geomとして定義)およびバス停の場所のセット(pt1.the_geom、pt2.the_geom、... ptn.the_geom)を指定して、バスルートをバス停の間のセグメントに分割します。 。2つのpostgis関数を使用しています

    ST_line_substring(ln.the_geom,ST_line_locate_point
    ln.the_geom,pt1.the_geom),ST_line_locate_point(ln.the_geom,pt2.the_geom))

バス路線に重複するセクションがない場合、上記はうまく機能します。ただし、セクションが重複している場合、ST_line_locate_pointはポイントをラインストリングのもう一方の端にスナップします。例として、バスがAからBに移動し、ループを形成し、次にBからAに移動します。「A to B」および「B to A」は、すべてのポイントがオーバーラップした並列ルートです。バス停P1とP2の場合、P2は代わりに(反対方向の)ポイントP2 'にマッピングされます。この場合、セグメントは誤って抽出されます(追加のセグメントが含まれる場合)。

このような問題を解決するには?バス路線の重複は、路線のどの部分でも発生する可能性があります... 例


バス路線の終端を特定し、閉じたラインストリングをいずれかの方向のラインに分割する方法はありますか?これにより、セグメントが重複しなくなります。たとえば、最初から線上で最も遠い点を見つけ、その点を使用して線を2つの方向に分けることができます。
ラファエル14年

3
古い質問ですが、セクションの開始点と終点を取得し、ポイントデータセットと結合し、初期ポイントの順序が終了ポイントよりも大きいセクションを削除する必要があるようです。これは理にかなっていますか?
ホルヘサンツ

1
指定されたバス路線のジオメトリWKTを提供してください。
kttii

回答:


1

バスルートが任意のポイントで2回以上重ならないと仮定すると、2番目のラインロケートポイントのラインを逆にして、ラインの最後に最も近いポイントを見つけることで解決できます。ST_LineSubstringクエリで使用するには、これを1から減算する必要があります。例えば

ST_LineSubstring(ln.the_geom,
  ST_LineLocatePoint(ln.the_geom, pt1.the_geom),
  1 - ST_LineLocatePoint(ST_Reverse(ln.the_geom), pt2.the_geom))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.