¿Seleccionar solo canales que están conectados a depósitos?

8

Tengo una capa poligonal de depósitos de agua y una capa polilínea de canales.

En mis datos, algunos canales se originan en reservorios y conducen a otros canales. Por otro lado, hay algunos canales que están aislados o no están conectados a nada. (Cómo sucedió esto es historia para otro día)

Necesito eliminar los canales aislados y las redes de canales (es decir, un conjunto de canales conectados) que no están conectados a un depósito.

Supongo que tendré que usar algún tipo de rastreo de red, pero no estoy seguro de por dónde empezar.

Tengo el escritorio ArcGIS, junto con Network Analyst para resolver esta tarea.

¿Cómo harías para esta tarea?

Devdatta Tengshe
fuente

Respuestas:

6

No estoy seguro exactamente de cómo se ve su archivo de forma de canal, pero así es como lo haría sin usar Network Analyst:

En el caso probable de que sus polilíneas Canals.shp se dividan en segmentos separados pero conectados, use Disolver para separarlos. Luego ejecute Seleccionar por ubicación , buscando características en Canals.shp que INTERSECT o BOUNDARY_TOUCHES con Reservoirs.shp.

dmahr
fuente
desafortunadamente, no hay ningún campo que sea lo suficientemente útil como para ejecutar la herramienta Disolver
Devdatta Tengshe
2
luego cree un nuevo campo (short int) y disuelva en su valor predeterminado (0)
Brad Nesom el
5

Enfocaría esto como dos problemas separados. Primero, los segmentos de línea individuales deben disolverse en componentes conectados; simplemente disolverlos todos en un valor predeterminado no funcionará. Este es un problema de teoría de grafos, y lo que queremos son los "subgraficos de componentes conectados".

Estoy seguro de que hay una manera de hackear esto con el analista de redes, pero mi preferencia sería tratarlo como el problema gráfico que es; no reinvente la rueda, solo instale el excelente módulo Python Networkx e intente lo siguiente:

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)

El segundo paso sería disolver y seleccionar por ubicación como lo sugiere dmahr

He usado una técnica similar muchas veces con éxito. La teoría de gráficos es asombrosa y resuelve muchos problemas SIG, y Networkx es una gran herramienta para implementar esto en Python.

Wombat008
fuente
No podría haberlo dicho mejor. +1
Allan Adair