我在ArcMap中继承了一个线shapefile,用于表示道路网络。问题在于道路网很大,我不可能:
- 判断每条线(路段)的末端是否“连接”到一条边,顶点或另一条线(路段)的末端;和
- 判断整个道路网络是否“连接”-即,我可以跟踪从道路网络上任何点到道路网络上任何其他点的路线吗?
有没有办法在ArcMap中完成此操作?也就是说,是否有一个功能可以让我突出显示与其他线段不连接的线段,或者是否可以让我回答上述两个问题?
我在ArcMap中继承了一个线shapefile,用于表示道路网络。问题在于道路网很大,我不可能:
有没有办法在ArcMap中完成此操作?也就是说,是否有一个功能可以让我突出显示与其他线段不连接的线段,或者是否可以让我回答上述两个问题?
Answers:
是的,但是有点。ArcGis不再具有线节点拓扑,该拓扑使用户能够知道在其末端(节点)连接了多少弧(线)。
检查是一回事,但是如何解决呢?如果在ArcMap中打开要素类,然后使用平面化线(给定公差),则这些线将在相交处对齐并拆分-节省了大量工作。如果您不想分割线,请考虑使用“ 集成 ”工具,但请注意使用很小的公差,它将使端部对齐在一起,但会使线也对齐。在使用Integrate之前,请保留备份,因为备份可能会破坏您的数据!
现在,要查找断开的端点,请使用要素顶点获取端点,然后收集事件,这将为您提供具有存在端点数量的要素类,在此阶段任何可疑事件为1,因此您需要将其分离这些出来。
要确定下一个任务是否应该连接,请使用Generate Near Table(再次具有适当的公差),并使用与原始行计数为1的事件,使用closest = ALL选项,然后使用Summary Statistics找到对于每个点,使用IN_FID作为案例字段并使用NEAR_FID作为统计字段(统计类型为“ COUNT”)的记录计数。
为了更容易地从近表中提取距离,请使用Table Select记录距离大于0的记录。每个事件都将找到生成它的线,但是距离将为0,如果将它正确连接到另一条线(在一个顶点处),距离也将为0,所以现在任何在近表中保留记录的事件都是可能不相交,但是需要手动查看。
另一种方法是使用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
这是旧文章,但我认为最简单的解决方案是:
结果将对图层中的每一行都有一个“计数”字段。如果Count大于1,则该行未“连接”到其余行。
从概念上讲:此处的步骤2在具有单个连接边的顶点处创建点(一条线“进入”,零条“进入”)。由于“连接”网络中的每条线最多具有1个这样的顶点,因此任何多于1条的线都不是网络的一部分,因此也就不是“连接”的。
这是我在一些朋友的帮助下使用Model Builder和Gephi提出的方法。步骤1 ArcModel创建链接/边表(如果需要,可在每条线处添加节点)步骤2 Gephi导入链接/边的线,然后添加组件ID步骤3 ArcModel将组件ID的表添加回原始行
步骤1采取所有输入要素的方法,在相交处将其拆分,以确保存在网络节点,并创建要导入Gephi的表。步骤如下:流程:要素到线(可以接受多个输入)流程:多部分到单部分的流程:修复几何图形流程:添加起始端坐标(添加几何图形属性)流程:添加字段“源”流程:添加字段“目标”过程:计算“源”(作为startX和startY)过程:计算“目标”(作为结束X和endY)过程:删除字段(清理多余的字段以避免混淆)过程:将GDB表转换为CSV
第2步Gephi流程(免费下载)-导入源和目标命名节点字段为链接的CSV输出-以无向方式运行计算的组件(在统计工具下)-从数据实验室为节点导出CSV(包括节点ID和组件ID)
步骤3:获取Gephi输出并将组件/网络属性添加到原始行中流程:从表到表(将Gephi输出到地理数据库中以构造唯一的objectID)流程:联接字段(源节点值与Gephi输出联接以将组件编号填充到行中)按组件符号
在这之后进行清理可能是一个手动过程,该过程将检查断开连接沿线的位置以及断开连接是否是有效的实际隔离或仅是数据缺陷。