在ArcMap中检查线shapefile的“连接性”?


9

我在ArcMap中继承了一个线shapefile,用于表示道路网络。问题在于道路网很大,我不可能:

  1. 判断每条线(路段)的末端是否“连接”到一条边,顶点或另一条线(路段)的末端;和
  2. 判断整个道路网络是否“连接”-即,我可以跟踪从道路网络上任何点到道路网络上任何其他点的路线吗?

有没有办法在ArcMap中完成此操作?也就是说,是否有一个功能可以让我突出显示与其他线段不连接的线段,或者是否可以让我回答上述两个问题?

Answers:


14

是的,但是有点。ArcGis不再具有线节点拓扑,该拓扑使用户能够知道在其末端(节点)连接了多少弧(线)。

检查是一回事,但是如何解决呢?如果在ArcMap中打开要素类,然后使用平面化线(给定公差),则这些线将在相交处对齐并拆分-节省了大量工作。如果您不想分割线,请考虑使用“ 集成 ”工具,但请注意使用很小的公差,它将使端部对齐在一起,但会使线也对齐。在使用Integrate之前,请保留备份,因为备份可能会破坏您的数据!

现在,要查找断开的端点,请使用要素顶点获取端点,然后收集事件,这将为您提供具有存在端点数量的要素类,在此阶段任何可疑事件为1,因此您需要将其分离这些出来。

要确定下一个任务是否应该连接,请使用Generate Near Table(再次具有适当的公差),并使用与原始行计数为1的事件,使用closest = ALL选项,然后使用Summary Statistics找到对于每个点,使用IN_FID作为案例字段并使用NEAR_FID作为统计字段(统计类型为“ COUNT”)的记录计数。

为了更容易地从近表中提取距离,请使用Table Select记录距离大于0的记录。每个事件都将找到生成它的线,但是距离将为0,如果将它正确连接到另一条线(在一个顶点处),距离也将为0,所以现在任何在近表中保留记录的事件都是可能不相交,但是需要手动查看。


谢谢。明天上班时,我将检查这些功能并进行报告。
derNincompoop 2014年

3
“特征顶点到点”具有输出“悬垂点”的选项。我认为这将简化您的工作流程。
klewis 2014年

哇@klewis,什么时候出现?在9.3中肯定没有。好眼力!
Michael Stimson 2014年

4

另一种方法是使用MAP拓扑。我把这段VBA代码敲掉了,以识别悬空的边缘。如果你看到悬空的边缘的网络,而不是预期的目的网络则必须有一个脱节。

选择悬空边缘的示例

该代码取决于您是否已安装VBA,处于编辑模式并已将折线图层添加到地图拓扑中。

Public Sub SelectDanglingPolylines()
 ' Description: Takes a polyline dataset and select all dangling polylines.
 '
 ' Requirements: You need to be in edit mode and have added the layer to a MAP TOPOLOGY,
 ' also polyline layer must be first in TOC.
 '
 ' Limitations: Large datasets take a long time to build the cache and may even fail.
 '
 ' Author: Duncan Hornby
 ' Created: 11/12/2011
 '

 ' Get map and then first layer, must be of polyline type
 Dim pMXDocument As IMxDocument
 Set pMXDocument = ThisDocument
 Dim pMap As IMap
 Set pMap = pMXDocument.FocusMap
 Dim pLayer As ILayer
 Set pLayer = pMap.Layer(0)
 Dim pFeatureLayer As IFeatureLayer
 Set pFeatureLayer = pLayer
 Dim pFeatureClass As IFeatureClass
 Set pFeatureClass = pFeatureLayer.FeatureClass
 If pFeatureClass.ShapeType <> esriGeometryPolyline Then
     MsgBox "This code works only with polylines!", vbExclamation, "Wrong data type at layer 0"
     Exit Sub
 End If

 ' Get editor and topology extension
 Dim pEditor As IEditor
 Dim pID As New UID
 Dim pTopologyExtension As ITopologyExtension
 Dim pTEID As New UID
 pID = "esriEditor.editor"
 Set pEditor = Application.FindExtensionByCLSID(pID)
 pTEID = "esriEditorExt.TopologyExtension"
 Set pTopologyExtension = Application.FindExtensionByCLSID(pTEID)
 If pTopologyExtension.CurrentTopology Is Nothing Then Exit Sub

 ' Get a MAP topology not a geodatabase topology
 Dim pMapTopology As IMapTopology
 If TypeOf pTopologyExtension.CurrentTopology Is IMapTopology Then
     Set pMapTopology = pTopologyExtension.MapTopology
 Else
     ' Not a Map Topology
     Exit Sub
 End If

 ' This is the colection that FID are added to
 Dim aColl As New Collection

 ' Build cache
 Application.StatusBar.Message(0) = "Building MAP TOPOLOGY cache, this can take a long time on large datasets..."
 DoEvents
 Dim pGeoDataset As IGeoDataset
 Set pGeoDataset = pFeatureClass
 Dim pEnvelope As IEnvelope
 Set pEnvelope = pGeoDataset.Extent
 pMapTopology.Cache.Build pEnvelope, False

 ' Identify dangling nodes and add polyline FID to collection
 Application.StatusBar.Message(0) = "Identifying dangling nodes..."
 DoEvents
 Dim pEnumTopologyParent As IEnumTopologyParent
 Dim pTopologyNode As ITopologyNode
 Dim pEnumTopologyNode As IEnumTopologyNode
 Set pEnumTopologyNode = pMapTopology.Cache.Nodes
 pEnumTopologyNode.Reset
 Set pTopologyNode = pEnumTopologyNode.Next
 While Not pTopologyNode Is Nothing
 If pTopologyNode.Degree = 1 Then
     ' As this has 1 degree it has only 1 parent polyline
     Set pEnumTopologyParent = pTopologyNode.Parents
     pEnumTopologyParent.Reset
     aColl.Add (pEnumTopologyParent.Next.m_FID) 'Adds polyline FID to collection
 End If
 Set pTopologyNode = pEnumTopologyNode.Next
 Wend

 ' Use collection to select polylines
 Application.StatusBar.Message(0) = "Selecting polylines..."
 DoEvents
 Dim pFeatureSelection As IFeatureSelection
 Set pFeatureSelection = pFeatureLayer
 Dim X As Variant
 For Each X In aColl
     pFeatureSelection.SelectionSet.Add CLng(X)
 Next
 pMXDocument.ActiveView.PartialRefresh esriViewGeoSelection, Nothing, pEnvelope
 Application.StatusBar.Message(0) = ""
 DoEvents
End Sub

我喜欢该代码,如果您不介意,我会复制其中的一些内容。这样做的好处是它是实时的,并且随着错误的修复它们会消失,最糟糕的部分是如果一条线悬空了,那么就会显示出来-一端是连接的,还是线已完全断开。我可以建议您更改代码以显示节点“价”(连接的线数)还是悬挂节点(那是我的工作站又出来了!)……那太棒了……但仅当OP运行时具有VBA / VB.net功能。
Michael Stimson 2014年

1
一个可以调整代码并获得两端价为1的边来找到一条完全断开的线,或者像1端为1或另一端为2的变体,取决于网络?
Hornbydd 2014年

2

这是旧文章,但我认为最简单的解决方案是:

  1. 溶解折线特征
  2. 使用要素顶点到带有Dangle的选项
  3. 通过空间位置将原始折线要素连接到生成的点图层。使用“相交”选项。

结果将对图层中的每一行都有一个“计数”字段。如果Count大于1,则该行未“连接”到其余行。

从概念上讲:此处的步骤2在具有单个连接边的顶点处创建点(一条线“进入”,零条“进入”)。由于“连接”网络中的每条线最多具有1个这样的顶点,因此任何多于1条的线都不是网络的一部分,因此也就不是“连接”的。


此方法会产生许多误报。假设一条道路通向T型路口。T的顶部将有两个悬垂的顶点。如果您以两个为单位来获取要素,然后再次与道路网相交,则那些没有接触的要素就是岛屿。
活泉

实际上,我在上面写的第二个相交处只能找到孤立的道路。它不会发现,如果网络中有多个部分
活泉

1

这是我在一些朋友的帮助下使用Model Builder和Gephi提出的方法。步骤1 ArcModel创建链接/边表(如果需要,可在每条线处添加节点)步骤2 Gephi导入链接/边的线,然后添加组件ID步骤3 ArcModel将组件ID的表添加回原始行

第一步截图 步骤1采取所有输入要素的方法,在相交处将其拆分,以确保存在网络节点,并创建要导入Gephi的表。步骤如下:流程:要素到线(可以接受多个输入)流程:多部分到单部分的流程:修复几何图形流程:添加起始端坐标(添加几何图形属性)流程:添加字段“源”流程:添加字段“目标”过程:计算“源”(作为startX和startY)过程:计算“目标”(作为结束X和endY)过程:删除字段(清理多余的字段以避免混淆)过程:将GDB表转换为CSV

Step2Gephi_Screenshot 第2步Gephi流程(免费下载)-导入源和目标命名节点字段为链接的CSV输出-以无向方式运行计算的组件(在统计工具下)-从数据实验室为节点导出CSV(包括节点ID和组件ID)

步骤3:获取Gephi输出并将组件/网络属性添加到原始行中流程:从表到表(将Gephi输出到地理数据库中以构造唯一的objectID)流程:联接字段(源节点值与Gephi输出联接以将组件编号填充到行中)按组件符号

在这之后进行清理可能是一个手动过程,该过程将检查断开连接沿线的位置以及断开连接是否是有效的实际隔离或仅是数据缺陷。

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.