Saya memiliki shapefile besar yang berisi semua bangunan dan rumah di kota tempat saya bekerja (sekitar 90.000 fitur). Data bangunan / rumah disimpan oleh insinyur survei kota dan karena praktik buruk dan akses surveyor yang berbeda ke data itu, banyak bangunan / rumah telah disimpan dua kali dan muncul di peta sebagai duplikat.
Beberapa dari mereka persis digandakan (mereka muncul satu di atas yang lain) sementara yang lain digandakan dengan ruang antara dua objek (seperti satu objek di dalam yang lain - lihat screenshot yang terpasang).
Saya ingin membersihkan data itu sehingga saya hanya memiliki bangunan / rumah yang benar di kota sehingga pertanyaan saya adalah:
Apakah ada analisis GIS atau ekspresi SQL yang dapat saya jalankan untuk menemukan semua fitur yang digandakan (baik yang tepat maupun yang berada di dalam yang lain)? Saya memiliki ArcGIS dan QGIS, jadi saya terbuka untuk semua saran Anda.
Jawaban:
di QGIS, plugin Pemeriksa Topologi dapat dengan mudah menyelesaikan masalah Anda
sumber
Saya akan menggunakan itertools Python dan SearchCursor untuk cara yang sangat efisien untuk menemukan hubungan spasial yang Anda cari. Anda dapat menggabungkan metode geometri
overlaps
,contains
danequal
untuk mendapatkan sifat-sifat geometri.Mulailah dengan membuat fungsi untuk mengatur alur kerja dengan lebih baik dan untuk pengulangan
def findOverlaps(x):
Buka kursor pencarian untuk mengulangi geometri fitur individual
with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:
gunakan
itertools.combinations()
untuk mengembalikan elemen berikutnya dari input iterablecur
for feature1,feature2 in itertools.combinations(cur, 2):
Mengakses properti geometri dengan metode berikut:
equals()
,overlaps()
, dancontains()
. Ini diatur dalam urutan logis - Anda dapat mengubah ini untuk memenuhi tujuan spesifik Anda jika perlu.Menjalankannya...
enter code here
findOverlaps (fc)Tangkapan layar menunjukkan berbagai fitur yang tumpang tindih, tumpang tindih & identik, dan unik.
sumber
Saya punya ide apa yang bisa bekerja untuk Anda. Ini akan didasarkan pada beberapa asumsi, tetapi itu akan membantu mempersempit daftar fitur identik yang mungkin Anda miliki. Ini tidak akan menjadi proses otomatis, tetapi akan membutuhkan melihat duplikat secara manual. Didasarkan pada komentar, sepertinya alat otomatis tidak membandingkan atribut sehingga ini akan membantu Anda tidak secara tidak sengaja menghapus fitur.
Menggunakan ArcMap
(1) Buat salinan shapefile Anda jika terjadi kesalahan.
(2) Tambahkan kolom ke shapefile Anda sebagai ganda.
(3) Hitung area untuk setiap fitur menggunakan format paling deskriptif (paling tepat) yang Anda bisa. Sesuatu di mana pembulatan mungkin tidak menjadi masalah.
(4) Jalankan ringkasan (merangkum) pada kolom itu. Pastikan Anda memilih pengidentifikasi unik di ringkasan dan tandai pertama dan terakhir.
(5) Di tabel output Anda, cari catatan di mana bidang hitung lebih tinggi dari 1.
(6a) Secara manual memeriksa fitur dan ulangi proses sampai tidak ada duplikat lagi.
(6b) Anda bisa saja membuat daftar id unik itu dan menghapus fitur melalui arcpy, tetapi Anda menjalankan kemungkinan memiliki dua fitur tidak dikenal dengan area yang sama.
Teknik Lain Menggunakan ArcPy
Ketika saya sedang membangun jawaban di atas, saya memikirkan kemungkinan bahwa entah bagaimana beberapa penulis data ini mungkin benar-benar menggunakan pengidentifikasi unik yang sama untuk fitur duplikat. JIKA itu yang terjadi, Anda mungkin dapat menemukan duplikat melalui perulangan di arcpy.
Cara saya berpikir tentang melakukan ini menggunakan ArcPy bisa membebani sistem Anda dan mengambil sedikit.
(1) Buat salinan shapefile Anda (untuk berjaga-jaga lagi)
(2) Tambahkan kolom baru untuk menunjukkan duplikat. Sesuatu yang mengambil seperti 'y' atau 'n' atau 0 atau 1 atau apa pun akan berhasil.
(3) Buat daftar dengan python untuk menyimpan pengidentifikasi unik.
(4) Jalankan Kursor Pembaruan (
arcpy.UpdateCursor('LAYERNAME')
). Untuk setiap catatan, periksa daftar Anda untuk melihat apakah itu berisi pengidentifikasi itu dan tandai kolom Anda untuk duplikat jika ada.(5) Kemudian Anda dapat membandingkan atau melakukan apa pun yang Anda inginkan dengan kolom bertanda itu.
Mungkin ada cara yang lebih baik untuk melakukan perbandingan ini, tetapi itu adalah dua yang menurut saya harus berhasil atau paling tidak membantu Anda memulai.
Edit
Berdasarkan komentar oleh elrobis , Anda dapat menggunakan persegi batas minimum untuk semakin mengurangi kemungkinan menghapus fitur yang salah.
Menggunakan ArcMap, Anda dapat menjalankan alat Geometri Batas Minimum dalam Manajemen Data. Setelah memeriksa opsi, saya pikir menggunakan opsi CONVEX_HULL mungkin yang terbaik.
Jika Anda membandingkan bidang MBG_APodX / Y1 , MBG_APod_X / Y2 bersama dengan MBG_Orientation untuk duplikat, Anda harus bisa mendapatkan ide bagus tentang fitur yang digandakan. Saya menyarankan menggunakan metode Summarize yang saya jelaskan di atas untuk membandingkan. Pilih salah satu simpul (koordinat) dari persegi panjang pembatas untuk menemukan duplikat. Anda mungkin mendapatkan beberapa 'kecocokan' yang tidak disengaja, tetapi begitu Anda menambahkan dalam simpul plus orientasi lainnya, itu akan menjadi taruhan yang cukup aman bahwa fitur hasil adalah duplikat.
Meskipun saya belum menggunakannya dan saya tidak yakin dengan hasil dari alat ini, Anda mungkin menemukan memeriksa shapefile yang dihasilkan lebih mudah jika Anda menggunakan alat Ringkasan Statistik di ArcMap. Sepertinya Anda dapat meringkas beberapa kolom seperti itu alih-alih opsi kolom tunggal saya.
Saya tidak berpikir akan ada cara yang sepenuhnya otomatis untuk melakukan ini tanpa khawatir kemungkinan menghapus fitur tidak duplikat. Metode-metode ini akan membantu membatasi jumlah fitur yang perlu Anda tinjau secara manual.
sumber
Anda dapat melakukan ini dalam SQL menggunakan gabungan spasial. Anda tidak menyatakan dialek SQL mana yang Anda gunakan, jadi contoh ini menggunakan Postgres / Postgis, tetapi bisa dengan mudah disesuaikan dengan Oracle atau SQL Server. Mengasumsikan tabel yang disebut bangunan, dengan geometri disimpan dalam kolom yang disebut geom:
Ini akan menemukan persimpangan. Jika Anda menginginkan kesetaraan total, ganti ST_Intersects dengan ST_Equals. Atau, cukup gabungkan keduanya:
Catatan, a.id <b.id berarti Anda hanya mempertimbangkan separuh kasus dalam self join, yang membuatnya a) lebih cepat dan b) memberi Anda daftar yang dapat Anda gunakan untuk menghapus setengah dari poligon yang tumpang tindih tanpa menghapus semuanya . Jelas, ini masih merupakan algoritma O (n²), tetapi dalam praktiknya, akan jauh lebih cepat jika Anda memiliki indeks spasial di tempat - yang benar-benar merupakan persyaratan total untuk setiap kumpulan data non-sepele.
Anda mungkin perlu memijat ini sedikit agar sesuai dengan definisi tumpang tindih - Anda tidak ingin menghapus rumah tetangga yang telah disurvei dengan buruk.
sumber
a.rowid
bukana.id
.rowid
adalah kata kunci dalam SQLite yang akan memberi Anda ID internal dari dataset.Plugin Topology Checker adalah alat yang baik jika digunakan dengan benar. Anda masih harus memiliki pemahaman mendasar tentang data Anda DAN Anda harus membuat 'koreksi' secara manual. Plugin akan menyoroti apa yang dianggapnya sebagai kesalahan. Terserah Anda untuk memeriksa masing-masing dan membuat keputusan yang tepat untuk Anda dan data Anda. Dengan 90.000 item di lapisan Anda, Anda mungkin berada di rumah sebelum Natal!
sumber