近くの平行な道路線(たとえば、二重の車道)を1本の線に結合/縮小するにはどうすればよいですか?


23

都市内のすべての道路を含むOSMのシェープファイルがあります。(二重車道のような)より大きな道路には、2本の平行線があるようです。それらを1行に折りたたむ/結合して、外部の3Dアプリケーションでうまくエクスポートしてレンダリングできるようにします(2つのオーバーラップする道路は複雑になり、3Dで奇妙に見えます)。

QGISまたはPostGISでこれを達成するにはどうすればよいですか?精度がわずかに低下する(数メートル以内)ことを心配していません。現在の平行線の間(理想的には中心)に、結果として生じる単一の線があることを望みます。

ありがとうございました。

(ここで、組み合わせたい二重道路線の例を示します)

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

回答:


3

ESRIには、折りたたみ式二重車道から中心線ツールがあります。OSMで使用する安価なバージョンを入手できます。それ以外の場合は、フィーチャを選択して新しいレイヤーとして保存できます。エクスポートに使用したレイヤーから選択したものを削除します。2番目の車線を含む車道の片側の範囲内のバッファーフィーチャ。シェープファイルを元のファイルとマージし、破損したトポロジを接続します。

コードおよび/またはスクリプトを作成できる場合は、ノードマッチングによるセグでノード上のレーン間の中心線を平均し、プログラムで中心線を出力し、生産プロセスに使用される選択されたフィーチャをプログラムで削除し、破損したトポロジを確認して修正することができますできた。

私が含めているarcpyコードのサンプルを見つけました。リンクを見つける方法は以下のコメントにあります。

ESRI ARCGisヘルプに起因

# Name: CollapseDualLinesToCenterline_Example.py
# Description: Creates street centerlines from a street casing coverage.
# Requirements: ArcInfo Workstation

# Import system modules
import arcpy
from arcpy import env

# Set environment settings
env.workspace = "C:/data"

# Set local variables
inCover = "streets"
outCover = "C:/output/centerlines"
maximumWidth = 50

# Execute CollapseDualLinesToCenterline
arcpy.CollapseDualLinesToCenterline_arc(inCover, outCover, maximumWidth, "")

ESRI崩壊センターラインツールにリンクしてください。見つかりませんでした。私が見つけた唯一のものは、このページのデュアル車道の編集セクションでした。
フェスター

ArcGISヘルプは、参照先のないリンクを一意のリンクとして生成するため、resources.arcgis.com / en / help / main / 10.1 / index.htmlにアクセスし、「二重線を中心線に折りたたむ(範囲)」を検索します。元のリンクが議論から来て、あなたがデスクトップの拡張のためのArcGISを必要として間違っている可能性があります:ArcInfoのワークステーションがインストールが必要です
ルイス

1
Arc7カバレッジデータを明示的に操作しない限り、ほとんどのユーザーは「カバレッジ」ツール(Workstationが必要)を使用しないでください。代わりに、ほとんどの場合、二重線を中心線に折りたたむ(カートグラフィ)を使用します。
ライアンダルトン

2

Mike MigurskiのSkeletronを使用してみてください。これは、彼が地形マップスタイルなどに使用するオープンソースツールです。


1

多分それは非常にエレガントなソリューションではありません、それは質問応答の方法に基づいています:/gis//a/295348/120129を

それはあなたの質問を解決する変形の1つであり、ジオインストルメントを設定します(私にとっては、幅11mの「road_border」という名前の道路で、タイプ-ライン(MultiLineString))、

ジオインストゥルメントを実行します:-)、

WITH 
      tbla AS (SELECT id, ((ST_DumpPoints(geom)).geom) geom FROM road_border),
      tblb AS (SELECT (ST_Buffer((ST_Dump(geom)).geom, 0.0001)) geom FROM tbla),
      tblc AS (SELECT ST_Centroid(ST_UnaryUnion(Unnest(ST_ClusterWithin(geom, 0.0001)))) geom FROM tblb),
      tbld AS (SELECT ((ST_Dump(ST_DelaunayTriangles(ST_Collect(geom)))).geom) geom FROM tblc),
      tble AS (SELECT (ST_Boundary(geom)) geom FROM ST_Dump((SELECT ST_Polygonize(geom) geom FROM (SELECT ST_Union(geom) geom FROM
      (SELECT ST_ExteriorRing(geom) geom FROM tbld) AS lines) AS foo))),
      tblf AS (SELECT ST_MakeLine(p1, p2) geom FROM (SELECT ST_PointN(geom, generate_series(1, ST_NPoints(geom)-1)) p1,
      ST_PointN(geom, generate_series(2, ST_NPoints(geom))) p2 FROM tble) AS geom),
      tblj AS (SELECT ST_Buffer((ST_Dump(ST_Union(ST_Buffer(geom, 0.0005)))).geom, -0.0005) geom FROM road_border)
      SELECT ST_Intersection (a.geom, b.geom) geom FROM tblf a JOIN tblj b ON ST_Within (a.geom, b.geom);

結果を確認してください。

皆さん、幸運を祈ります:-)、

元のソリューション...

このスクリプトは、ST_RoadAxisFromDelaunayTriangulationと呼ばれています...

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