地図上の道路の交差点を検出する効率的な方法は何ですか?


14

プロジェクトのソースからマップを受け取る場合がありますが、作成しているC ++アルゴリズムでは、アルゴリズムが道路の交差点(3つ以上の道路セグメントが交わるノード)がどこにあるかを知ることが不可欠です。その上、私が手に入れる地図の多くには、道路の行き過ぎと行き過ぎがあります(つまり、道路が適切に接続されていません)。問題を修正する1つの方法は、Autocadを使用して道路網を「清掃」することです。私が持っている質問は次のとおりです。

  1. マップ内の道路の交差点に関する情報を含むGML形式でマップを取得する効率的な方法(それを実行できるソフトウェアはありますか)はありますか?(特定のノードがジャンクションであることを示すGMLタグがある場合があります)
  2. 道路網を「きれいにする」他の方法はありますか?

同僚はFMEを提案しましたが、それにはスクリプトの作成が含まれ、スクリプトがすべてのマップに対応するのに十分な柔軟性があるかどうかはわかりません。ジャンクションを検出する他の唯一の方法は、ブルートフォースを使用して、どの道路セグメントに共通ノードがあるかを見つけることです。ArcGISは役立ちますか?(使用していませんが、聞いたことはあります)より良い方法があるはずです...


2
自己交差する道路を見つける必要がありますか?縮退ジオメトリ(すべての頂点が一致し、長さがゼロのポリライン)をどのように処理する必要がありますか 交差点が単なる点ではなく線形セグメントである一致線をどのように処理する必要がありますか?
カーククイケンドール

@カーク:あなたが言及した状況に私は少しショックを受けています。私はGISを初めて使用しますが、そのような可能性が存在することさえ知りませんでした。1.自己交差には複数のセグメントが必要です。高架道路でない限り、それらの交差点をジャンクションと見なします。2.縮退したジオメトリが何であるかを視覚化することすらできないので、何に答えるべきかわかりません。3.一致する線は、2本の別々の道路として扱う必要があります。これは、それらが実際の生活にも当てはまるからです。
ナビゲーション

回答:


9

シェープファイルなどの空間形式の道路がある場合は、それらをPostGISにロードし、SQLクエリを使用して道路を自動的に見つけることができます。以前にこれを行ったことがあります。SQLステートメントは、道路ごとに地理的に交差するものを見つけ、交差点ごとに節点を作成するように設計されています。

後でこれをクリーンアップしようとしますが、ここにあなたが取ることができる基本的なフローがあります...

for line in road_layer_lines:
    ilines = get_intersecting_objects(line)
    for iline in ilines:
        road_junctions.extend(get_intersection(line, iline))

ST_ *関数は、PostGIS内でこれを機能させるものです

  • ST_Envelope:与えられたジオメトリのバウンディングボックスを取得します-これはアルゴリズムを高速化するために使用されます。すばやく正確ではないパスでバウンディングボックスを使用して地理的検索を絞り込み、実際のジオメトリで結果をスキャンできます。
  • ST_Intersects:2つのジオメトリが交差するかどうかを決定します
  • ST_Intersection:2つのジオメトリの交差を返します

以下はスニペットです。終了する時間がないため、ここに戻る前に誰かが編集できる可能性があります...

SELECT id, the_geom FROM road_lines
SELECT roads.id FROM road_lines roads WHERE ST_Intersects(roads.the_geom, my_geom)
SELECT ST_Intersection(roads.the_geom, my_geom) FROM road_lines roads WHERE roads.id = my_id

ただ共有:私が出会った別のデータベースはこれです-< oracle.com/technetwork/database/berkeleydb/overview/index.html >。クエリは、アプリケーションに組み込むことができるライブラリとして利用できるため、クエリは非常に高速です。
ナビゲーション

1
@ dmsnell-たぶん、このタスクを達成するために使用されるSQLクエリのタイプの例を提供できますか?
RyanKDalton

11

バッファーを使用して、ポリラインを驚くべき方法で分析できます。これは通常非効率的です-バッファーは多くの追加の頂点を作成しますが、(a)多くのGIS(ベクターまたはラスターベース)で利用可能な手法であり、(b)取得するのが困難な情報を生成できる場合があります。

この場合、道路を少しだけバッファリングし、次に同じ量のマイナスでバッファリングすると、すべての曲がり角すべての交差点の周りに「島」がほとんど残りません。これは幾何学的に簡単に証明できます。

以下に、幅650 mのマップでの10 mのポリラインバッファー(灰色)と-10 mのバッファー(明るい赤)の例を示します。

図1

元のポリラインレイヤーをこれらのアイランドポリゴンと交差させ、セグメントをアイランド識別子で結合し、ピースをカウントします。

図2

明るい黄色のセグメントは高カウントのピースを示し、濃いシアンのセグメントは低カウントのピースを示します。この方法で、(a)すべての曲がりと交差点(自己交差点を含む)およびジャンクション付近(2つのセグメントがまったく合わない左端を参照)を見つけ、(b)曲がりと交差点を区別しました。2つ以上の接続されたセグメントを含む島を選択することにより、ほぼジャンクションを見つけることができます。ベンドには接続されたセグメントのみが含まれます。

バッファリングの対称性により、交差点の島の重心は交差点になります。

このスタイルの分析の美しい側面の1つは、基礎となるポリラインがどのように表されるかを気にかけないことです。単一のフィーチャ、各ラインセグメントの1つのフィーチャ、またはその間のものになります。


6

はい、あなたは確かにFMEでこれを行うことができます。クリーンアップ、交差、およびトポロジを処理する多くの「トランス」があります。この場合、TopologyBuilderトランスフォーマーを試します。

スクリプティングはすべてグラフィック環境で実行されるため、非常に簡単です。

www.safe.comからいつでも試用版を入手できます。

(情報開示:マークアイルランド、別名FMEエバンジェリスト、Safe Software Inc.)


2番目にこれ。FMEは、AutoCADからGMLへの変換とトポロジクリーンアップの両方のこの特定の問題に最適です。それは、その用途において驚くほど普遍的です。
blord-castillo


-1

無料試用版で入手できるArcgisネットワークアナリストは、わずか数回のクリックで10秒以内にこれを行います。


-1

このプロセスは、ネットワークアナリストを使用してArcGISで実行できます。

ArcGISには別の方法もあります。次の手順を実行できます。「Arctoolbox」→「データ管理ツール」→「機能」→「頂点からポイントへの機能」で、必要な操作を実行できます。

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