Controllando la "connessione" del file shapefile in ArcMap?


9

Ho ereditato uno shapefile di linea in ArcMap utilizzato per rappresentare una rete stradale. Il problema è che la rete stradale è piuttosto grande ed è impossibile per me:

  1. Indica se la fine di ogni linea (segmenti di strada) è "connessa" a uno spigolo, vertice o alla fine di un'altra linea (segmento di strada); e
  2. Indica se l'intera rete stradale è "connessa", ovvero posso tracciare un percorso da qualsiasi punto della rete stradale a qualsiasi altro punto della rete stradale?

C'è un modo per farlo in ArcMap? Cioè, c'è una funzione che mi permetterà di evidenziare segmenti di linea che non si collegano ad altri segmenti di linea o qualcosa di simile che mi consentirebbe di rispondere alle due domande precedenti?

Risposte:


14

Sì, ma in qualche modo. ArcGis non ha più una topologia a nodi di linea che consente all'utente di dire quanti archi (linee) sono collegati alle loro estremità (nodi).

Controllare è una cosa, ma che ne dici di risolvere invece? Se si apre la classe di entità geografiche in ArcMap e si utilizzano le linee planarizzate (dare una tolleranza) e le linee verranno spezzate e divise all'intersezione, risparmiando molto lavoro. Se non si desidera dividere le linee, prendere in considerazione lo strumento Integrazione ma fare attenzione a utilizzare una tolleranza molto piccola, aggancerà le estremità insieme ma può far scattare anche le linee insieme. Prima di utilizzare Integrate mantenere un backup in quanto può distruggere i tuoi dati!

Ora, per trovare le estremità disconnesse usa Feature Vertices in Punti per ottenere i punti finali e quindi Raccogli eventi che ti daranno una classe di caratteristiche con il numero di punti finali presenti, in questa fase qualsiasi evento di 1 è sospetto, quindi dovrai separare questi fuori.

Per capire se dovrebbe essere collegato è l'attività successiva, usa Genera vicino alla tabella (di nuovo con una tolleranza adeguata) e l'opzione di più vicino = TUTTO usando gli eventi con un conteggio di 1 rispetto alle linee originali, quindi usando Statistiche riassuntive puoi trovare per ogni punto il conteggio dei record che utilizzano IN_FID come campo caso e NEAR_FID come campo statistico con un tipo di statistica "COUNT".

Per semplificare l'estrazione dalla tabella vicina i record con una distanza maggiore di 0 utilizzando Selezione tabella . Ogni evento troverà la linea che l'ha generata ma la distanza sarà 0, se è collegata correttamente ad un'altra linea (a un vertice) la distanza sarà anche 0, quindi ora qualsiasi evento che ha un record rimanente nella tabella vicina è eventualmente disgiunto ma questi dovranno essere visualizzati manualmente.


Grazie. Verificherò queste funzioni quando tornerò a lavoro domani e riferirò di nuovo.
derNincompoop,

3
"Feature Vertice to Point" ha un'opzione per emettere Dangle Points. Penso che questo semplificherà il tuo flusso di lavoro.
Klewis,

Wow @klewis, quando è apparso? Certamente non c'era in 9.3. Ben individuato!
Michael Stimson,

4

Un altro approccio consiste nell'utilizzare la topologia MAP. Ho rovesciato questo pezzetto di codice VBA che avrebbe identificato i bordi pendenti. Se vedi bordi pendenti all'interno della rete piuttosto che le estremità previste della rete, ci deve essere una disconnessione.

Esempio di selezione di bordi pendenti

Il codice si basa sulla tua installazione di VBA, sulla modalità di modifica e sull'aggiunta del livello polilinea alla topologia della mappa.

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

Mi piace quel codice, se non ti dispiace, ne copierò alcune parti; Il vantaggio di farlo in questo modo è che è attivo e man mano che gli errori vengono risolti scompaiono, la parte negativa è se una linea pende quindi viene mostrato - se un'estremità è connessa o la linea è completamente disconnessa. Posso suggerire che cambiate il codice per visualizzare il nodo "valenza" (quante linee collegate) o solo i nodi penzolanti (quella è la mia workstation che esce di nuovo!) ... sarebbe fantastico ... ma solo se l'OP ha funzionalità VBA / VB.net.
Michael Stimson,

1
Si potrebbe modificare il codice e ottenere i bordi che hanno la valenza di 1 su entrambe le estremità per trovare una linea completamente disconnessa, o variazioni come un 1 su 1 estremità e un 2 sull'altra, dipende dalla rete immagino?
Hornbydd,

2

Questo è un vecchio post, ma penso che la soluzione più semplice sia:

  1. Sciogli la tua funzione polilinea
  2. Utilizzare l' opzione Vertici delle funzioni verso i punti con Ciondola
  3. Unisci per posizione spaziale la funzione polilinea originale al livello punti risultante. Utilizzare l'opzione "Intersezionato da esso".

Il risultato avrà un campo "Conta" per ogni riga del tuo livello. se il conteggio è maggiore di 1, la linea non è "connessa" al resto delle linee.

Concettualmente: il passaggio 2 qui crea punti ai vertici con un singolo bordo collegato (una linea "entra", zero "esce"). Poiché ogni linea all'interno della rete "connessa" avrà al massimo 1 di tali vertici, qualsiasi linea con più di 1 non fa parte della rete e non è quindi "connessa".


Questo metodo produce molti falsi positivi. Dire che una strada conduce a un incrocio a T. La parte superiore della T avrà due vertici penzolanti. Se prendi le caratteristiche con un conteggio di due e poi le intersechi di nuovo con la rete stradale, quelle che non toccano sono isole.
Woot

In realtà, il secondo incrocio di cui ho scritto sopra trova solo strade isolate. Non scoprirà se la rete ha più parti
woot

1

Ecco un metodo che ho ideato, con l'aiuto di alcuni amici, usando Model Builder e Gephi. Passaggio 1 ArcModel creazione di una tabella di collegamenti / spigoli (aggiunta di nodi su ogni riga si sovrappongono se desiderato) Passaggio 2 Importazione Gephi di collegamenti / spigoli quindi aggiunta di ID componente Passaggio 3 ArcModel aggiunge gli ID componente alla riga originale

Step1screenshot Passaggio 1 Accetta tutte le funzionalità di input per suddividerle agli incroci per garantire la presenza di un nodo di rete e creare una tabella da importare in Gephi. Ecco i passaggi: Processo: Feature To Line (può accettare più input) Processo: Multipart To Singlepart Processo: Repair Geometry Process: Aggiungi inizio End coords (Aggiungi attributi Geometry) Processo: Aggiungi campo "Origine" Processo: Aggiungi campo "Target" Processo: Calcola "Origine" (come startX e startY) Processo: Calcola "Destinazione" (come end X e endY) Processo: Elimina campi (pulisci i campi extra per evitare confusione) Processo: Tabella GDB in CSV

Step2Gephi_Screenshot Step 2 Processo Gephi (download gratuito) -importa output CSV con campi nodo denominati Source e Target come collegamenti -Esegui componenti calcolati come non indirizzati (in Strumenti statistici) -Esporta CSV da Data Laboratory for Nodes (include ID nodo e ID componente)

Passaggio 3: prende l'output di Gephi e aggiunge l'attributo componente / rete alle linee originali Processo: da tabella a tabella (ingerisci l'output di Gephi in Geodatabase per strutturare ID oggetto univoci) Processo: Unisci campo (i valori del nodo di origine uniti all'output di Gephi per popolare il numero del componente nelle linee) Simboleggia per componente

La pulizia dopo questo punto sarà probabilmente un processo manuale per esaminare dove si stanno verificando le disconnessioni lungo la linea e se la disconnessione è una separazione del mondo reale valida o solo un difetto dei dati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.