如何将附近和平行的道路线(例如,双行车道)合并/折叠为一条直线?


23

我有一个来自OSM的shapefile,其中包含城市中的所有道路。较大的道路(如双行车道)似乎有2条平行线。我想将它们折叠/合并为1行,以便可以在外部3D应用程序中很好地导出和渲染它们(两条重叠的路很复杂,在3D中看起来很奇怪)。

如何使用QGIS或PostGIS实现呢?我不担心精度会略有下降(在几米之内),我希望最终的单条线位于当前平行线之间(理想情况下为中心)。

谢谢。

(这是我要合并的两条道路的示例)

在此处输入图片说明

Answers:


3

ESRI具有可折叠的双车道到中心线工具。您可以获得与OSM一起使用的廉价版本。否则,您可以选择要素并另存为新图层。从用于导出的图层中删除选定的内容。缓冲特征在包括第二车道的车道一侧的范围内。将shapefile与原始文件合并,连接任何损坏的拓扑。

如果您可以编码和/或编写脚本,则可以通过节点匹配,通过段匹配来平均节点上通道之间的中心线,并以编程方式输出中心线,然后以编程方式删除用于生产过程的所选特征,检查并修复损坏的拓扑,然后完成。

我找到了一个包含的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收合中心线工具?我找不到 我唯一能找到的是此页面的“编辑双车道”部分。
Fezter

ArcGIS帮助会生成没有参考的唯一链接,就像我看到的链接链接一样,因此...转到resources.arcgis.com/en/help/main/10.1/index.html并搜索将双线折叠为中心线(覆盖),原始链接来自讨论,可能会因为您需要ArcGIS for Desktop Advanced而出现错误:需要安装ArcInfo Workstation
刘易斯

1
除非明确使用Arc7 coverage数据,否则大多数用户不应使用“ Coverage”工具(需要Workstation)。相反,在大多数情况下,请使用将双线折叠到中心线(制图)
RyanDalton

2

您可以尝试使用Mike Migurski的Skeletron。这是一个开放源代码工具,他可用于Terrain地图样式等事物。


1

也许这不是一个非常优雅的解决方案,它基于回答问题的方法:https : //gis.stackexchange.com/a/295348/120129

这是解决您的问题的一种方法,设置一个地理仪器(对我来说,这是一条名称为“ road_border”的道路,宽11 m,类型-线(MultiLineString)),

运行一个geoinstrument :-),

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 ...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.