¿Verificando la "conectividad" del archivo de forma de línea en ArcMap?


9

Heredé un archivo de forma de línea en ArcMap que se usa para representar una red de carreteras. El problema es que la red de carreteras es bastante grande y me es imposible:

  1. Indica si el final de cada línea (segmentos de carretera) está "conectado" a un borde, vértice o al final de otra línea (segmento de carretera); y
  2. Indique si toda la red de carreteras está "conectada", es decir, ¿puedo rastrear una ruta desde cualquier punto de la red de carreteras a cualquier otro punto de la red de carreteras?

¿Hay alguna manera de lograr esto en ArcMap? Es decir, ¿hay una función que me permita resaltar segmentos de línea que no se conectan a otros segmentos de línea, o algo similar que me permita responder las dos preguntas anteriores?

Respuestas:


14

Sí, pero más o menos. ArcGis ya no tiene una topología de nodo de línea que permite al usuario saber cuántos arcos (líneas) están conectados en sus extremos (nodos).

Comprobar es una cosa, pero ¿qué tal arreglarlo? Si abre la clase de entidad en ArcMap y luego usa líneas planarizadas (otorgue una tolerancia) y las líneas se ajustarán y dividirán en la intersección, ahorrará mucho trabajo. Si no desea dividir las líneas, considere la herramienta Integrar, pero tenga cuidado de usar una tolerancia muy pequeña, juntará los extremos pero puede hacer que las líneas también se junten. ¡Antes de usar Integrate, guarde una copia de seguridad ya que puede destruir sus datos!

Ahora, para encontrar los extremos desconectados, utilice los vértices de características a los puntos para obtener los puntos finales y luego recopile eventos que le proporcionarán una clase de entidad con el número de puntos finales presentes, en esta etapa cualquier evento de 1 es sospechoso, por lo que deberá separarse estos fuera.

Para determinar si debería estar conectado es la siguiente tarea, use Generar tabla cercana (nuevamente con una tolerancia adecuada) y la opción de más cercano = TODO usando los eventos con un conteo de 1 contra las líneas originales, luego usando Resumen de estadísticas puede encontrar para cada punto, el recuento de registros utilizando IN_FID como campo de caso y NEAR_FID como campo de estadísticas con un tipo estadístico de "COUNT".

Para hacer más fácil como el extracto de la mesa cerca de los registros con una distancia mayor que 0 usando Seleccionar tabla . Cada evento encontrará la línea que la generó, pero la distancia será 0, si está conectada correctamente a otra línea (en un vértice) la distancia también será 0, por lo que ahora cualquier evento que tenga un registro restante en la tabla cercana es posiblemente disjuntos, pero estos deberán verse manualmente.


Gracias. Revisaré estas funciones cuando llegue a trabajar mañana e informe de nuevo.
derNincompoop

3
"Caracterizar vértice a punto" tiene una opción para generar puntos colgantes. Creo que esto simplificará su flujo de trabajo.
klewis

Wow @klewis, ¿cuándo apareció eso? Ciertamente no estaba allí en 9.3. ¡Bien descrito!
Michael Stimson

4

Otro enfoque es utilizar la topología MAP. Golpeé este bit de código VBA para identificar los bordes colgantes. Si ve bordes colgantes dentro de la red en lugar de los extremos esperados de la red, entonces debe haber una desconexión.

Ejemplo de selección de bordes colgantes

El código depende de que tenga instalado VBA, esté en modo de edición y haya agregado la capa de polilínea a la topología del mapa.

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

Me gusta ese código, si no te importa, copiaré algunos bits de eso; El beneficio de hacerlo de esta manera es que está activo y, a medida que se corrigen los errores, desaparecerán, lo malo es que si una línea cuelga, se muestra, ya sea que un extremo esté conectado o la línea esté completamente desconectada. ¿Puedo sugerirle que cambie el código si muestra el nodo "valencia" (cuántas líneas conectadas) o solo los nodos colgantes (esa es mi estación de trabajo que sale de nuevo!) ... eso sería increíble ... pero solo si el OP tiene la capacidad de VBA / VB.net.
Michael Stimson

1
Uno podría ajustar el código y obtener bordes que tienen una valencia de 1 en ambos extremos para encontrar una línea completamente desconectada, o variaciones como un 1 en 1 extremo y un 2 en el otro, ¿depende de la red, supongo?
Hornbydd

2

Esta es una publicación antigua, pero creo que la solución más simple es:

  1. Disuelve tu entidad de polilínea
  2. Use la opción Usar vértices de puntos a puntos con colgar
  3. Unir por ubicación espacial la entidad de polilínea original a la capa de puntos resultante. Use la opción "Intersected by it".

El resultado tendrá un campo "Recuento" para cada línea en su capa. si la cuenta es mayor que 1, la línea no está "conectada" al resto de las líneas.

Conceptualmente: el paso 2 aquí crea puntos en los vértices con un solo borde conectado (una línea "entrando", cero "saliendo"). Dado que cada línea dentro de la red "conectada" tendrá como máximo 1 vértice, cualquier línea con más de 1 no es parte de la red y, por lo tanto, no está "conectada".


Este método produce muchos falsos positivos. Digamos que una carretera conduce a un cruce en T. La parte superior de la T tendrá dos vértices colgantes. Si toma las características con una cuenta de dos y luego las intersecta nuevamente con la red de carreteras, las que no se tocan son las islas.
woot

En realidad, la segunda intersección sobre la que escribí arriba solo encuentra caminos aislados. No sería averiguar si la red tiene varias partes
woot

1

Aquí hay un método que se me ocurrió, con la ayuda de algunos amigos, usando Model Builder y Gephi. Paso 1 ArcModel crea una tabla de enlaces / bordes (agregando nodos en cada línea superpuesta si lo desea) Paso 2 Importación Gephi de enlaces / bordes y luego agregando ID de componentes Paso 3 ArcModel agrega ID de componentes a la línea original

Paso 1 captura de pantalla Paso 1 Toma todas las características de entrada y las divide en las intersecciones para garantizar la presencia de un nodo de red y crea una tabla para importar a Gephi. Estos son los pasos: Proceso: Función a línea (puede tomar múltiples entradas) Proceso: Proceso de varias partes a una sola parte: Proceso de reparación de geometría: Agregar coordenadas de inicio y final (Agregar atributos de geometría) Proceso: Agregar campo "Origen" Proceso: Agregar campo "Destino" Proceso: Calcular "Fuente" (como startX y startY) Proceso: Calcular "Target" (como end X y endY) Proceso: Eliminar campos (limpiar campos adicionales para evitar confusiones) Proceso: Tabla GDB a CSV

Step2Gephi_Screenshot Paso 2 Proceso de Gephi (descarga gratuita): importe la salida de CSV con campos de nodo con nombre de origen y destino como enlaces. Ejecute componentes calculados como no dirigidos (en herramientas estadísticas). Exporte CSV del laboratorio de datos para nodos (incluya ID de nodo e ID de componente)

Paso 3: Toma la salida de Gephi y agrega el atributo componente / red a las líneas originales Proceso: Tabla a Tabla (ingiere la salida de Gephi en la Geodatabase para estructurar ID de objeto únicos) Proceso: Campo de unión (Los valores del nodo de origen se unieron con la salida de Gephi para completar el número de componente en las líneas) Simbolizar por componente

La limpieza después de este punto probablemente será un proceso manual de examinar dónde se producen las desconexiones a lo largo de las líneas y si la desconexión es una separación válida del mundo real o simplemente una falla de datos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.