Memilih hanya kanal yang terhubung ke reservoir?


8

Saya memiliki lapisan poligon air dan lapisan kanal polyline.

Dalam data saya, beberapa kanal berasal dari reservoir, dan mengarah ke kanal lainnya. Di sisi lain ada beberapa kanal yang terisolasi atau tidak terhubung dengan apa pun. (Bagaimana ini muncul adalah cerita untuk hari lain)

Saya perlu menghapus kanal yang terisolasi dan jaringan kanal tersebut (yaitu set kanal yang terhubung) yang tidak terhubung ke reservoir.

Saya berasumsi bahwa saya harus menggunakan semacam penelusuran jaringan, tetapi saya tidak yakin harus mulai dari mana.

Saya memiliki desktop ArcGIS, bersama dengan Network Analyst untuk menyelesaikan tugas ini.

Bagaimana Anda mengerjakan tugas ini?

Jawaban:


6

Saya tidak yakin persis seperti apa bentuk kanal Anda, tetapi inilah cara saya melakukannya tanpa menggunakan Network Analyst:

Dalam hal kemungkinan bahwa polyline Canals.shp Anda dipecah menjadi segmen yang terpisah namun terhubung, gunakan Dissolve untuk melepaskannya. Kemudian jalankan Select by Location , temukan fitur di Canals.shp yang INTERSECT atau BOUNDARY_TOUCHES dengan Reservoirs.shp.


sayangnya, tidak ada bidang yang cukup berguna untuk menjalankan Alat Larutkan
Devdatta Tengshe

2
kemudian buat bidang baru (int pendek) dan larutkan di atasnya bawaan (0)
Brad Nesom

5

Saya akan mendekati ini sebagai dua masalah terpisah. Pertama, segmen garis individual harus dilarutkan ke dalam komponen yang terhubung; melarutkan semuanya pada nilai default tidak akan berfungsi. Ini adalah masalah teori grafik, dan yang kita inginkan adalah "sub komponen yang terhubung".

Saya yakin ada cara untuk meretas ini dengan analis jaringan, tetapi preferensi saya adalah memperlakukannya seperti masalah grafiknya; jangan reinvent the wheel, cukup instal modul Networkx python yang sangat baik dan coba yang berikut ini:

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)

Langkah kedua adalah membubarkan dan memilih berdasarkan lokasi seperti yang disarankan oleh dmahr

Saya telah menggunakan teknik serupa berkali-kali berhasil. Teori grafik mengagumkan dan menyelesaikan banyak masalah SIG, dan Networkx adalah alat yang hebat untuk mengimplementasikan ini dalam python.


Tidak bisa mengatakannya dengan lebih baik. +1
Allan Adair
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.