ルーティング可能なネットワークを単純化する方法は?


24

ネットワークグラフがあり、エッジの数を減らすという意味で単純化する必要があります。アイデアは、近くにあるノードをマージし、接続している短いエッジを削除することです。

PostGISまたはGRASSでこれをどのように達成できますか?または、このようなネットワークを自動的に簡素化するためのより良いアプローチはありますか?

既にST_SnapToGrid関数を試しましたが、結果に満足できません(グレー=オリジナル、黒=スナップ):

ここに画像の説明を入力してください


1
これは、ネットワークベースの分析を簡素化するためですか、それとも表示目的ですか?前者の場合、どのような分析が実行されますか?
whuber

最短経路分析用です。
暗闇

2
最短経路アルゴリズムの多くはO(E + V)であるため、おそらくこの単純化さえ必要ないでしょうか?他の極端な場合、そのような分析のために、あなたはしばしば劇的にもっと積極的な単純化を行うことができます。たとえば、3つの平行なセグメントとその左に隣接するセグメント(H-in-a-boxのように見える)のセットは、それらのセグメント内に始点または終点がない場合、三角形に置き換えることができます。これは、(抽象)グラフに対するそのような操作のための(非GIS)コードがあると確信しているためです。
whuber

エッジのジオメトリ(曲線など)を維持したいですか、それともトポロジ+ノードXYだけで十分ですか?また、異なるZのノード(フライオーバーなど)がスナップしないようにする必要がありますか?
AnserGIS

トポロジーが重要です。ジオメトリは少し変わることがあります。Zオーダーはそのままでなければなりません。
暗闇

回答:


7

私がこれまで来た中で最も近いのはこれです:

v.clean input=roads output=snap5rmline tool=snap,rmline thresh=5 

5メートルの公差で道路をスナップし、長さゼロの線をすべて削除します。ある頂点にかなりランダムにスナップするため、最適なソリューションではありません。

ここに画像の説明を入力してください


確かに、結果は多分正確ではありませんが、それを使用v.cleanは面白いです、共有するためのおかげで
SIMO

そのイメージは草の中に作成されていますか?
NetConstructor.com

この画像は、QGISで視覚化されたGRASS v.cleanの結果を示しています。
暗闇

「奇妙な交差点」や勾配のある道路の維持に関する問題はありますか?
dassouki

v.clean後のST_SnapToGridの処理はどうですか?
kttii

5

GRASS v.generalizeを試しましたか?

v.generalizemethod属性で一般化アルゴリズムを選択できます。束があります:ダグラス、douglas_reduction、lang、reduction、reumann、boyle、sliding_averaging、distance_weighting、チャイケン、エルミート、ヘビ、ネットワーク、変位

そして、追加のパラメータとしてはthresholddegree_threshangle_thresh(選択されたアルゴリズムに応じて)あなたが正確な結果を得るために役立つかもしれません。

ここにチュートリアルがあります。


リンクありがとうございます。私はそれを試してみましたが、メソッドとしきい値のどの組み合わせが私が探している結果をもたらすかは本当にわかりません。
暗闇

私が本当にやりたいv.generalizeメソッドを見つけることができません。
暗闇

2
残念なことに、このコマンドには多くのアルゴリズムが豊富にありますが、前に言ったように、期待される結果を得るためのセットアップはおそらく非常に複雑です。多分、一般化アルゴリズムの第一人者ですか?ヘビの方法も試しましたか?
シモ

ここではアルゴの達人ではありませんが、過去に作成したv.genralizeの実行の一部には、ヘビ法が最適であると思います。
maning

1
記録のために、GRASS SVNでは今日の時点でパラメーターが簡略化されています。GRASS 6.4.2の一部になるため。
markusN

4

私はこれをやっていませんが、方向性を提案できると思います。

  1. グラフ用にPostGISを使用してトポロジを作成します。
  2. 2つのエッジのみを持つすべてのノードを検索します。
  3. エッジを癒します。

ST_ModEdgeHealは、一方のエッジを他方にマージします。ST_NewEdgeHealは、両方を新しいエッジに置き換えます。

PostGISトポロジマニュアル


@Seanに感謝します。それは2つのエッジをマージする以外に何をしますか?短いエッジを削除してノードをスナップする方法についてのアイデアはありますか?
暗闇

@Underdark、単純なものは見当たりません。PL / SQLですべて実行できますが、おそらくそれは役に立ちません。最初にST_SnapToGridを実行できますか?
ショーン

1

@underdark、Sextanteで行を高密度化するツールを作成したことがわかります。したがって、ポイントの1つを「ランダムに」スナップすることを避けるために、次のアルゴリズムをお勧めします。

長さに基づいて削除する線分を選択します。

これらのセグメントごとに、中間点にポイントを作成します

小さなセグメントを削除する

これで、PostGISでST_Snapを使用できます(こちらの例を参照)。

編集:あなたの場合、擬似ノード(2行のみを接続するノード)を削除するために最初にv.netを使用することもできます


擬似ノードを削除するためにv.netを使用する方法について詳しく説明してください。ありがとう
-osmjit

0

MichaëlMichaudがOpenJUMP開発者リストでこれを分析した方法を転送します。

> Interesting question. There has been so much research works about
> generalization that it is surely not a simple task. I have tested the
> following approach with mitigated results :
> - make the layer planar with the noder plugin
> - detect small cycles with the graph plugin
> - merge adjacent cycles
> - create a point inside each cycles surface
> - remove network segments along these cycles (query + DE-9IM)
> - detect roads touching the cycles
> - project the center points of cycles to the road endpoints ==> replace small roundabout by simple nodes
> 
> Possible improvements (probably need a dedicated plugin)
> - make it work on non planar graph (or just remove bridges/tunnels from the graph)
> - replace small edges between two nodes with degree 3+ by a single node,    not only small cycles
> - process iteratively starting with smallest edges/cycles

この回答を投稿していただきありがとうございます。グラフを強制的に平面にする理由を少し混乱させています。結局のところ、街路網は平面グラフ(橋、トンネル)ではありません。
暗闇

MichaëlがOpenJUMP用に作成した既存のグラフツールで高速テストを行い、現時点では非平面グラフをサポートしていないためです。QGISとGRASSに非平面グラフをサポートする同様のツールがある場合は、最初の手順をスキップしてください。
user30184

これは正しいアプローチだと思います-ネットワークを平面グラフに分離します。各平面グラフでは、問題はより単純です。たとえば、上記のアプローチを使用するか、短い道路エッジのTINを単純に三角測量して除草することができます。次に、道路の端を再度抽出し、レイヤーを結合します。
AnserGIS 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.