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

如何我可以通过QGIS还是PostGIS来实现?我不担心精度会略微下降(在几米之内),并且希望将单线显示在当前平行线之间(理想情况下是其中心)。

谢谢。

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



#1 楼

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♦
13年2月13日在5:56

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

–刘易斯
13年2月13日在18:51



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

– RyanKDalton
13年2月13日在19:08

#2 楼

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

#3 楼

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

这是解决问题的一种方法,设置一个地理仪器(对我来说,这是一条名为“ road_border”的道路,宽11 m,类型-线(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),
      tblg 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 tblg b ON ST_Within(a.geom, b.geom);


并查看结果。

祝大家好运:-),

原始解决方案...

这个脚本叫做-ST_RoadAxisFromDelaunayTriangulation ...