ネットワークグラフがあり、エッジの数を減らすという意味で単純化する必要があります。アイデアは、近くにあるノードをマージし、接続している短いエッジを削除することです。
PostGISまたはGRASSでこれをどのように達成できますか?または、このようなネットワークを自動的に簡素化するためのより良いアプローチはありますか?
既にST_SnapToGrid関数を試しましたが、結果に満足できません(グレー=オリジナル、黒=スナップ):
ネットワークグラフがあり、エッジの数を減らすという意味で単純化する必要があります。アイデアは、近くにあるノードをマージし、接続している短いエッジを削除することです。
PostGISまたはGRASSでこれをどのように達成できますか?または、このようなネットワークを自動的に簡素化するためのより良いアプローチはありますか?
既にST_SnapToGrid関数を試しましたが、結果に満足できません(グレー=オリジナル、黒=スナップ):
回答:
私がこれまで来た中で最も近いのはこれです:
v.clean input=roads output=snap5rmline tool=snap,rmline thresh=5
5メートルの公差で道路をスナップし、長さゼロの線をすべて削除します。ある頂点にかなりランダムにスナップするため、最適なソリューションではありません。
GRASS v.generalizeを試しましたか?
v.generalize
method属性で一般化アルゴリズムを選択できます。束があります:ダグラス、douglas_reduction、lang、reduction、reumann、boyle、sliding_averaging、distance_weighting、チャイケン、エルミート、ヘビ、ネットワーク、変位。
そして、追加のパラメータとしてはthreshold
、degree_thresh
、angle_thresh
(選択されたアルゴリズムに応じて)あなたが正確な結果を得るために役立つかもしれません。
ここにチュートリアルがあります。
私はこれをやっていませんが、方向性を提案できると思います。
ST_ModEdgeHealは、一方のエッジを他方にマージします。ST_NewEdgeHealは、両方を新しいエッジに置き換えます。
@underdark、Sextanteで行を高密度化するツールを作成したことがわかります。したがって、ポイントの1つを「ランダムに」スナップすることを避けるために、次のアルゴリズムをお勧めします。
長さに基づいて削除する線分を選択します。
これらのセグメントごとに、中間点にポイントを作成します
小さなセグメントを削除する
これで、PostGISでST_Snapを使用できます(こちらの例を参照)。
編集:あなたの場合、擬似ノード(2行のみを接続するノード)を削除するために最初にv.netを使用することもできます
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