Nur Kanäle auswählen, die an Stauseen angeschlossen sind?


8

Ich habe eine Polygonschicht aus Wasserreservoirs und eine Polylinienschicht aus Kanälen.

In meinen Daten stammen einige Kanäle aus Stauseen und führen zu anderen Kanälen. Auf der anderen Seite gibt es einige Kanäle, die isoliert oder mit nichts verbunden sind. (Wie es dazu kam, ist eine Geschichte für einen anderen Tag)

Ich muss die isolierten Kanäle und die Kanalnetze (dh die verbundenen Kanäle) löschen, die nicht mit einem Reservoir verbunden sind.

Ich gehe davon aus, dass ich eine Art Netzwerk-Tracing verwenden muss, bin mir aber nicht sicher, wo ich anfangen soll.

Ich habe ArcGIS Desktop zusammen mit Network Analyst, um diese Aufgabe zu lösen.

Wie würden Sie diese Aufgabe erledigen?

Antworten:


6

Ich bin mir nicht sicher, wie genau Ihr Kanal-Shapefile aussieht, aber so würde ich das ohne Network Analyst machen:

In dem wahrscheinlichen Fall, dass Ihre Canals.shp-Polylinien in separate, aber verbundene Segmente aufgeteilt sind, verwenden Sie Dissolve , um sie zu trennen. Führen Sie dann Select by Location aus und suchen Sie in Canals.shp nach Features, die INTERSECT oder BOUNDARY_TOUCHES mit Reservoirs.shp verbinden.


Leider gibt es kein Feld, das nützlich genug ist, um das Dissolve Tool
Devdatta Tengshe

2
Erstellen Sie dann ein neues Feld (kurz int) und lösen Sie es auf seine Standardeinstellung (0) auf
Brad Nesom

5

Ich würde dies als zwei getrennte Probleme betrachten. Zunächst müssen die einzelnen Liniensegmente in verbundene Komponenten aufgelöst werden; Nur alle auf einem Standardwert aufzulösen, funktioniert nicht. Dies ist ein graphentheoretisches Problem, und wir wollen die "Subgraphen für verbundene Komponenten".

Ich bin mir sicher, dass es eine Möglichkeit gibt, dies mit einem Netzwerkanalysten zu hacken, aber ich würde es vorziehen, es wie das Grafikproblem zu behandeln, das es ist. Erfinden Sie das Rad nicht neu, installieren Sie einfach das hervorragende Networkx-Python-Modul und versuchen Sie Folgendes:

from networkx import Graph, connected_components
G = Graph()
# iterate through your feature class and build a graph
for row in featureclass:
    # we need a unique representation for each edges start and end points
    start = row.shape.getpart()[0]
    end = row.shape.getpart()[-1]
    G.add_edge(start,end,oid=row.oid)

# get the connected components
Components = connected_components(G)

# we now have a "list of lists" containing edges grouped by their component
# there's several ways to apply this to the feature class...eg
for i, connected in enumerate(Components):
    # assign id = i to the group by writing it to a field for all members 
    # of that component (the row oid is an attribute of the edge)

Der zweite Schritt wäre das Auflösen und Auswählen nach Ort, wie von dmahr vorgeschlagen

Ich habe eine ähnliche Technik viele Male erfolgreich angewendet. Die Graphentheorie ist fantastisch und löst viele GIS-Probleme. Networkx ist ein großartiges Tool, um dies in Python zu implementieren.


Hätte es nicht besser sagen können. +1
Allan Adair
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.