Memeriksa "keterhubungan" garis shapefile di ArcMap?

9

Saya mewarisi shapefile garis di ArcMap yang digunakan untuk mewakili jaringan jalan. Masalahnya adalah jaringan jalan cukup besar dan tidak mungkin bagi saya untuk:

  1. Katakan apakah ujung setiap garis (ruas jalan) "terhubung" ke salah satu ujung, ruas, atau ujung garis lain (ruas jalan); dan
  2. Katakan apakah seluruh jaringan jalan "terhubung" - yaitu, dapatkah saya melacak rute dari titik mana saja di jaringan jalan ke titik lain di jaringan jalan?

Apakah ada cara untuk mencapai ini di ArcMap? Yaitu, apakah ada fungsi yang akan memungkinkan saya untuk menyoroti segmen garis yang tidak terhubung ke segmen garis lain, atau sesuatu yang serupa yang memungkinkan saya untuk menjawab dua pertanyaan di atas?

derNincompoop
sumber

Jawaban:

14

Ya, tapi semacam itu. ArcGis tidak lagi memiliki topologi garis-simpul yang memungkinkan pengguna untuk mengetahui berapa banyak busur (garis) yang terhubung di ujungnya (simpul).

Mengecek adalah satu hal, tetapi bagaimana cara memperbaikinya? Jika Anda membuka kelas fitur di ArcMap dan kemudian menggunakan garis planarize (beri toleransi) dan garis akan tersentak dan terbelah di persimpangan - menghemat banyak pekerjaan. Jika Anda tidak ingin membagi garis maka pertimbangkan alat Integrasi tetapi hati-hati untuk menggunakan toleransi yang sangat kecil, itu akan mematahkan ujungnya tetapi dapat membuat garis juga patah bersama-sama. Sebelum menggunakan Integrate, simpan cadangan karena dapat menghancurkan data Anda!

Sekarang, untuk menemukan ujung-ujung yang terputus gunakan Feature Vertices to Points untuk mendapatkan titik akhir dan kemudian Kumpulkan Acara yang akan memberi Anda kelas fitur dengan jumlah titik akhir yang ada, pada tahap ini setiap kejadian 1 dicurigai sehingga Anda harus memisahkan ini keluar.

Untuk mengetahui apakah itu harus terhubung adalah tugas berikutnya, gunakan Generate Near Table (lagi dengan toleransi yang sesuai) dan opsi terdekat = SEMUA menggunakan peristiwa dengan hitungan 1 terhadap baris asli, kemudian menggunakan Ringkasan Statistik yang dapat Anda temukan untuk setiap titik, jumlah rekaman menggunakan IN_FID sebagai bidang kasus dan NEAR_FID sebagai bidang statistik dengan tipe statistik "COUNT".

Untuk membuat seperti ekstrak lebih mudah dari tabel dekat catatan dengan jarak lebih besar dari 0 menggunakan Pilih Tabel . Setiap peristiwa akan menemukan garis yang menghasilkannya tetapi jarak akan menjadi 0, jika itu terpasang dengan benar ke garis lain (pada titik) jaraknya juga akan 0, jadi sekarang setiap peristiwa yang memiliki catatan yang tersisa di tabel dekat adalah mungkin terpisah tetapi ini harus dilihat secara manual.

Michael Stimson
sumber
Terima kasih. Saya akan memeriksa fungsi ini ketika saya masuk kerja besok dan melaporkan kembali.
derNincompoop
3
"Fitur Vertice to Point" memiliki opsi untuk menampilkan Poin Menjuntai. Saya pikir ini akan menyederhanakan alur kerja Anda.
klewis
Wow @ KLewis, kapan itu muncul? Jelas tidak ada di 9.3. Terlihat dengan baik!
Michael Stimson
4

Pendekatan lain adalah dengan menggunakan topologi MAP. Saya mengetuk sedikit kode VBA ini yang akan mengidentifikasi tepi yang menggantung. Jika Anda melihat ujung yang menggantung di dalam jaringan daripada ujung yang diharapkan dari jaringan maka harus ada pemutusan.

Contoh memilih tepi yang menggantung

Kode bergantung pada Anda menginstal VBA, berada dalam mode edit dan telah menambahkan lapisan polyline ke topologi peta.

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
sumber
Saya suka kode itu, jika Anda tidak keberatan saya akan menyalin beberapa bit dari itu; Manfaat dari melakukannya dengan cara ini adalah bahwa ia hidup dan ketika kesalahan diperbaiki mereka akan menghilang, bagian yang buruk adalah jika garis menggantung maka ditampilkan - apakah salah satu ujung terhubung atau garis benar-benar terputus. Bolehkah saya menyarankan Anda mengubah kode jangan menampilkan simpul "valensi" (berapa banyak garis yang terhubung) atau hanya simpul menjuntai (itu workstation saya keluar lagi!) ... itu akan luar biasa ... tetapi hanya jika OP memiliki kemampuan VBA / VB.net.
Michael Stimson
1
Seseorang dapat mengubah kode dan mendapatkan tepi yang memiliki valensi 1 di kedua ujungnya untuk menemukan garis yang benar-benar terputus, atau variasi seperti ujung 1 at 1 dan 2 di sisi lain, tergantung pada jaringan saya kira?
Hornbydd
2

Ini adalah pos lama, tapi saya pikir solusi paling sederhana adalah:

  1. Larutkan fitur polyline Anda
  2. Gunakan Fitur Fitur Untuk Poin dengan opsi Menjuntai
  3. Bergabung Dengan Lokasi Spasial fitur polyline asli ke lapisan poin yang dihasilkan. Gunakan opsi "Intersected by it".

Hasilnya akan memiliki bidang "Hitung" untuk setiap baris di lapisan Anda. jika Hitungan lebih besar dari 1, garis tidak "terhubung" ke seluruh baris.

Secara konseptual: Langkah 2 di sini membuat titik pada simpul dengan satu ujung yang terhubung (satu baris "masuk", nol "keluar"). Karena setiap baris dalam jaringan "terhubung" akan memiliki paling banyak 1 simpul seperti itu, setiap baris dengan lebih dari 1 bukan bagian dari jaringan dan karenanya tidak "terhubung".

NathanW
sumber
Metode ini menghasilkan banyak kesalahan positif. Katakanlah jalan mengarah ke pertigaan. Bagian atas T akan memiliki dua simpul yang menggantung. Jika Anda mengambil fitur dengan hitungan dua dan kemudian memotongnya lagi dengan jaringan jalan, yang tidak menyentuh adalah pulau.
Woot
Sebenarnya, persimpangan kedua yang saya tulis di atas hanya menemukan jalan yang terisolasi. Tidak akan mengetahui apakah jaringan memiliki beberapa bagian
woot
1

Berikut adalah metode yang saya buat, dengan bantuan beberapa teman, menggunakan Model Builder dan Gephi. Langkah 1 ArcModel membuat tabel tautan / tepian (menambahkan node di setiap baris tumpang tindih jika diinginkan) Langkah 2 Gephi mengimpor tautan / tepian kemudian menambahkan ID komponen. Langkah 3 ArcModel menambahkan ID komponen kembali ke baris asli

Step1screenshot Langkah 1 Membawa semua fitur input membaginya di persimpangan untuk memastikan node jaringan hadir dan membuat tabel untuk diimpor ke Gephi. Berikut adalah langkah-langkahnya: Proses: Feature To Line (dapat mengambil beberapa input) Proses: Multipart Ke Singlepart Proses: Memperbaiki Proses Geometri: Menambahkan awal Koord akhir (Menambahkan atribut Geometri) Proses: Tambahkan Bidang "Sumber" Proses: Tambahkan Bidang "Target" Proses: Hitung "Sumber" (seperti startX & startY) Proses: Hitung "Target" (sebagai akhir X & endY) Proses: Hapus bidang (membersihkan bidang tambahan untuk menghindari kebingungan) Proses: Tabel GDB ke CSV

Step2Gephi_Screenshot Langkah 2 Proses Gephi (unduh gratis) - impor keluaran CSV dengan Sumber dan Target menamai bidang simpul sebagai Tautan - Menjalankan Komponen yang Dihitung sebagai Tidak Terarah (di bawah alat Statistik) - CSV Ekspor dari Laboratorium Data untuk Node (termasuk ID simpul dan ID komponen)

Langkah 3: Mengambil output Gephi dan menambahkan atribut komponen / jaringan ke baris asli Proses: Tabel ke Tabel (menelan output Gephi ke dalam Geodatabase untuk menyusun objekID yang unik) Proses: Gabung Bidang (Nilai simpul sumber yang bergabung dengan output Gephi untuk mengisi nomor komponen ke baris) Melambangkan dengan komponen

Pembersihan setelah titik ini kemungkinan akan menjadi proses manual memeriksa di mana terputusnya terjadi di sepanjang garis dan jika putuskan adalah pemisahan dunia nyata yang valid atau hanya cacat data.

Penjual Jared
sumber