Selecionando apenas canais conectados a reservatórios?

8

Eu tenho uma camada de polígono de reservatórios de água e uma camada de polilinha de canais.

Nos meus dados, alguns canais são originários de reservatórios e levam a outros canais. Por outro lado, existem alguns canais isolados ou não conectados a nada. (Como isso aconteceu é história para outro dia)

Preciso excluir os canais isolados e as redes de canais (ou seja, conjunto de canais conectados) que não estão conectados a um reservatório.

Presumo que precisarei usar algum tipo de rastreamento de rede, mas não sei por onde começar.

Eu tenho o ArcGIS desktop, junto com o Network Analyst para resolver esta tarefa.

Como você faria essa tarefa?

Devdatta Tengshe
fonte

Respostas:

6

Não sei exatamente como é o seu shapefile de canal, mas eis como eu faria isso sem usar o Network Analyst:

No caso provável de que suas polilinhas Canals.shp estejam divididas em segmentos separados, mas conectados, use Dissolve para desagregá-las. Em seguida, execute Selecionar por local , localizando recursos em Canals.shp que INTERSECT ou BOUNDARY_TOUCHES com Reservoirs.shp.

dmahr
fonte
Infelizmente, não existe um campo que é bastante útil para executar a ferramenta Dissolver
Devdatta Tengshe
2
em seguida, criar um novo campo (short int) e dissolver por si (0) padrão
Brad Nesom
5

Eu abordaria isso como dois problemas separados. Primeiro, os segmentos de linha individuais devem ser dissolvidos em componentes conectados; apenas dissolver todos eles em um valor padrão não funcionará. Este é um problema da teoria dos grafos, e o que queremos são os "subgráficos de componentes conectados".

Tenho certeza de que há uma maneira de invadir isso com o analista de rede, mas minha preferência seria tratá-lo como o problema do gráfico; não reinvente a roda, basta instalar o excelente módulo python Networkx e tente o seguinte:

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)

O segundo passo seria dissolver e selecionar por local, conforme sugerido por dmahr

Eu usei uma técnica semelhante muitas vezes com sucesso. A teoria dos grafos é impressionante e resolve muitos problemas de SIG, e o Networkx é uma ótima ferramenta para implementar isso em python.

Wombat008
fonte
Não poderia ter dito melhor. 1
Allan Adair