Überprüfen der "Verbundenheit" des Linienformdateis in ArcMap?

9

Ich habe in ArcMap ein Linien-Shapefile geerbt, das zur Darstellung eines Straßennetzes verwendet wird. Das Problem ist, dass das Straßennetz ziemlich groß ist und es mir unmöglich ist:

  1. Stellen Sie fest, ob das Ende jeder Linie (Straßensegmente) entweder mit einer Kante, einem Scheitelpunkt oder dem Ende einer anderen Linie (Straßensegment) "verbunden" ist. und
  2. Stellen Sie fest, ob das gesamte Straßennetz "verbunden" ist. Kann ich eine Route von einem beliebigen Punkt im Straßennetz zu einem anderen Punkt im Straßennetz verfolgen?

Gibt es eine Möglichkeit, dies in ArcMap zu erreichen? Gibt es eine Funktion, mit der ich Liniensegmente hervorheben kann, die keine Verbindung zu anderen Liniensegmenten herstellen, oder etwas Ähnliches, mit dem ich die beiden oben genannten Fragen beantworten kann?

derNincompoop
quelle

Antworten:

14

Ja, aber irgendwie. ArcGis verfügt nicht mehr über eine Linienknotentopologie, mit der der Benutzer feststellen kann, wie viele Bögen (Linien) an ihren Enden (Knoten) verbunden sind.

Zu überprüfen ist eine Sache, aber wie wäre es stattdessen zu beheben? Wenn Sie die Feature-Class in ArcMap öffnen und dann Linien planarisieren (Toleranz angeben ), werden die Linien an der Kreuzung gefangen und geteilt - das spart viel Arbeit. Wenn Sie die Linien nicht teilen möchten, ziehen Sie das Werkzeug Integrieren in Betracht. Achten Sie jedoch darauf, eine sehr kleine Toleranz zu verwenden. Dadurch werden die Enden zusammengeschnappt, aber die Linien können auch zusammenschnappen. Führen Sie vor der Verwendung von Integrate ein Backup durch, da dies Ihre Daten zerstören kann!

Um getrennte Enden zu finden, verwenden Sie Feature-Eckpunkte zu Punkten , um die Endpunkte abzurufen, und sammeln Sie dann Ereignisse, die Ihnen eine Feature-Class mit der Anzahl der vorhandenen Endpunkte geben. In diesem Stadium ist jedes Ereignis von 1 verdächtig, sodass Sie es trennen müssen diese raus.

Um herauszufinden , ob es sollte angeschlossen wird die nächste Aufgabe ist es , die Verwendung generiert Near Tabelle (wieder mit einer geeigneten Toleranz) und Möglichkeit , am nächsten = ALL die Ereignisse mit einer Zählung von 1 gegen die ursprünglichen Linien verwenden, dann unter Verwendung von Auswertungsstatistik Sie finden für jeden Punkt die Anzahl der Datensätze, die IN_FID als Fallfeld und NEAR_FID als Statistikfeld mit dem Statistiktyp "COUNT" verwenden.

Um dies zu vereinfachen, extrahieren Sie mit Table Select die Datensätze mit einem Abstand größer als 0 aus der Near-Tabelle . Jedes Ereignis findet die Linie, die es generiert hat, aber der Abstand ist 0. Wenn es ordnungsgemäß an eine andere Linie (an einem Scheitelpunkt) angehängt ist, ist der Abstand ebenfalls 0, sodass jetzt jedes Ereignis, bei dem noch ein Datensatz in der Near-Tabelle vorhanden ist, lautet möglicherweise disjunkt, aber diese müssen manuell angezeigt werden.

Michael Stimson
quelle
Vielen Dank. Ich werde diese Funktion überprüfen, wenn ich morgen zur Arbeit komme und mich wieder melde.
derNincompoop
3
"Feature Vertice to Point" bietet die Option, Dangle Points auszugeben. Ich denke, dies wird Ihren Workflow vereinfachen.
Klewis
Wow @klewis, wann ist das aufgetaucht? In 9.3 war es sicher nicht da. Gut erkannt!
Michael Stimson
4

Ein anderer Ansatz ist die Verwendung der MAP-Topologie. Ich habe dieses Stück VBA-Code aufgeschlagen, das baumelnde Kanten identifizieren würde. Wenn Sie baumelnde Kanten innerhalb des Netzwerks sehen und nicht die erwarteten Enden des Netzwerks, muss eine Trennung erfolgen.

Beispiel für die Auswahl baumelnder Kanten

Der Code setzt voraus, dass Sie VBA installiert haben, sich im Bearbeitungsmodus befinden und die Polylinienebene zur Kartentopologie hinzugefügt haben.

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
Hornbydd
quelle
Ich mag diesen Code, wenn es Ihnen nichts ausmacht, kopiere ich ein paar Teile davon. Der Vorteil der es auf diese Weise tun , ist , dass es Live und als Fehler behoben sind , werden sie verschwinden, der schlechte Teil ist , wenn eine Linie baumelt dann wird gezeigt - ob ein Ende verbunden ist oder die Leitung ist vollständig getrennt. Darf ich vorschlagen, dass Sie den Code ändern, indem Sie den Knoten "Valenz" (wie viele verbundene Leitungen) oder nur die baumelnden Knoten (das ist meine Workstation, die wieder herauskommt!) Anzeigen ... das wäre fantastisch ... aber nur, wenn das OP hat VBA / VB.net-Fähigkeit.
Michael Stimson
1
Man könnte den Code optimieren und Kanten mit einer Wertigkeit von 1 an beiden Enden erhalten, um eine vollständig getrennte Leitung zu finden, oder Variationen wie eine 1 an einem Ende und eine 2 am anderen Ende hängen vom Netzwerk ab, denke ich?
Hornbydd
2

Dies ist ein alter Beitrag, aber ich denke, die einfachste Lösung ist:

  1. Lösen Sie Ihre Polylinienfunktion auf
  2. Verwenden Sie die Option Feature-Eckpunkte zu Punkten mit Dangle
  3. Nach räumlicher Position verbinden das ursprüngliche Polylinien-Feature mit der resultierenden Punktebene. Verwenden Sie die Option "Durchgeschnitten".

Das Ergebnis enthält ein Feld "Anzahl" für jede Zeile in Ihrer Ebene. Wenn die Anzahl größer als 1 ist, ist die Leitung nicht mit den übrigen Leitungen "verbunden".

Konzeptionell: In Schritt 2 werden hier Punkte an Scheitelpunkten mit einer einzelnen verbundenen Kante erstellt (eine Linie "geht hinein", null "geht aus"). Da jede Linie innerhalb des "verbundenen" Netzwerks höchstens 1 solchen Scheitelpunkt hat, ist jede Linie mit mehr als 1 nicht Teil des Netzwerks und daher nicht "verbunden".

NathanW
quelle
Diese Methode erzeugt viele falsch positive Ergebnisse. Angenommen, eine Straße führt zu einer T-Kreuzung. Der obere Teil des T hat zwei baumelnde Eckpunkte. Wenn Sie die Merkmale mit einer Anzahl von zwei nehmen und sie dann erneut mit dem Straßennetz schneiden, sind die nicht berührenden Inseln.
woot
Tatsächlich findet die zweite Kreuzung, über die ich oben geschrieben habe, nur vereinzelte Straßen. Es würde nicht herausfinden, ob das Netzwerk mehrere Teile hat
woot
1

Hier ist eine Methode, die ich mit Hilfe einiger Freunde mit Model Builder und Gephi entwickelt habe. Schritt 1 ArcModel Erstellen einer Tabelle mit Links / Kanten (Hinzufügen von Knoten an jeder Linienüberlappung, falls gewünscht) Schritt 2 Gephi-Import von Links / Kanten und anschließendes Hinzufügen von Komponenten-IDs Schritt 3 ArcModel fügt Komponenten-IDs wieder zur ursprünglichen Linie hinzu

Step1screenshot Schritt 1 Alle Eingabemerkmale teilen sie an Kreuzungen auf, um sicherzustellen, dass ein Netzwerkknoten vorhanden ist, und erstellen eine Tabelle, die in Gephi importiert werden soll. Hier sind die Schritte: Prozess: Feature To Line (kann mehrere Eingaben annehmen) Prozess: Multipart To Singlepart Prozess: Geometrie reparieren Prozess: Start-End-Koordinaten hinzufügen (Geometrieattribute hinzufügen) Prozess: Feld "Quelle" hinzufügen Prozess: Feld "Ziel" hinzufügen Prozess: "Quelle" berechnen (als startX & startY) Prozess: "Ziel" berechnen (als Ende X & endY) Prozess: Felder löschen (zusätzliche Felder bereinigen, um Verwirrung zu vermeiden) Prozess: GDB-Tabelle in CSV

Step2Gephi_Screenshot Schritt 2 Gephi-Prozess (kostenloser Download) - CSV-Ausgabe mit benannten Knotenfeldern für Quelle und Ziel als Links importieren - Berechnete Komponenten als ungerichtet ausführen (unter Statistik-Tools) - CSV aus dem Datenlabor für Knoten exportieren (einschließlich Knoten-ID und Komponenten-ID)

Schritt 3: Übernimmt die Gephi-Ausgabe und fügt den ursprünglichen Zeilen ein Komponenten- / Netzwerkattribut hinzu. Prozess: Tabelle zu Tabelle (Gephi-Ausgabe in Geodatabase aufnehmen, um eindeutige Objekt-IDs zu strukturieren) Prozess: Feld verbinden (Quellknotenwerte mit Gephi-Ausgabe verknüpft, um Komponentennummer in Zeilen zu füllen) Symbolisieren durch Komponente

Die Bereinigung nach diesem Punkt wird wahrscheinlich ein manueller Prozess sein, bei dem untersucht wird, wo die Unterbrechungen entlang der Linien auftreten und ob die Trennung eine gültige Trennung in der realen Welt oder nur ein Datenfehler ist.

Jared Sellers
quelle