Analisis GIS untuk menemukan geometri duplikat

9

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).

masukkan deskripsi gambar di sini

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.

GIS_DBA
sumber
Anda dapat mencoba menjelajahi Alat Identifikasi Hapus . Namun, itu memerlukan tingkat lisensi perusahaan. Anda dapat meninjau beberapa opsi lain yang tersedia di Artikel Teknis 36031 Apakah ArcGIS menyediakan cara untuk mengidentifikasi atau menghapus fitur-fitur dengan geometri duplikat, taruhan terbaik Anda adalah Data Reviewer Extenstion . tak satu pun dari alat ini akan membahas geometri perpecahan Anda
MDHald
juga, Anda harus mempertimbangkan bahwa komponen tabular tidak akan dibandingkan dalam alat identik yang dihapus. Saya tahu ini bukan jawaban tapi semoga membantu dalam pemecahan masalah.
MDHald
Apakah data dalam database? Jenis apa?
Russell di ISC
Salah satu opsi mungkin menggunakan Intersect Tool (seperti yang dijelaskan dalam jawaban ini ) di ArcMap, yang akan menampilkan setiap lokasi yang tumpang tindih. Itu akan membutuhkan secara manual memeriksa dan memutuskan poligon yang akan dihapus, tetapi dalam kasus duplikat yang tidak tepat saya pikir Anda harus tetap melakukannya.
Erica
4
Penggunaan istilah 'rangkap' agak menyesatkan dalam pertanyaan ini. Untuk salinan yang tepat, identik, dan bertumpuk, maka ya, itu adalah (atau bisa jadi - atribut mungkin berbeda) duplikat dan karena yang lain menyarankan alat Delete atau Find Identical mungkin membantu jika Anda memiliki tingkat lisensi tersebut. Tetapi jika mereka diimbangi sama sekali, atau bentuk yang berbeda, mereka tidak benar-benar duplikat per se. Jika Anda memiliki lisensi Advanced, saya akan melihat topologi geodatabase, menjalankan pemeriksaan Must Not Overlap. Tanpa Advanced, mungkin hal yang sama dapat dilakukan dengan QGIS dan sebuah plugin seperti yang disarankan oleh Luigi.
Chris W

Jawaban:

4

di QGIS, plugin Pemeriksa Topologi dapat dengan mudah menyelesaikan masalah Anda

Luigi Pirelli
sumber
3
Saya setuju topologi mungkin merupakan solusi tunggal terbaik untuk masalah pembersihan data. Namun Anda mungkin ingin sedikit memperluas jawaban Anda dengan memberikan tautan ke plugin dan deskripsi singkat tentang apa itu topologi atau apa dan pemeriksaan mana yang akan Anda jalankan. Saya khawatir jawaban Anda karena diketik kemungkinan akan ditandai sebagai kualitas rendah.
Chris W
ok: deskripsi plugin ada di sini: docs.qgis.org/2.2/en/docs/user_manual/plugins/… dan "tidak boleh tumpang tindih" dapat mendekati masalah. Panduan video plugin ada di sini: youtube.com/watch?v=huhkTZkoKC8 .
Luigi Pirelli
6

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 , containsdan equaluntuk mendapatkan sifat-sifat geometri.

  1. Mulailah dengan membuat fungsi untuk mengatur alur kerja dengan lebih baik dan untuk pengulangan

    def findOverlaps(x):

  2. Buka kursor pencarian untuk mengulangi geometri fitur individual

    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:

  3. gunakan itertools.combinations()untuk mengembalikan elemen berikutnya dari input iterablecur

    for feature1,feature2 in itertools.combinations(cur, 2):

  4. Mengakses properti geometri dengan metode berikut: equals(), overlaps(), dan contains(). Ini diatur dalam urutan logis - Anda dapat mengubah ini untuk memenuhi tujuan spesifik Anda jika perlu.

        if feature1[1].equals(feature2[1]):
            print "{} equals {}".format(feature1[0],feature2[0])
        if feature1[1].overlaps(feature2[1]):
            print "{} overlaps {}".format(feature1[0],feature2[0])
        if feature1[1].contains(feature2[1]):
            print "{} contains {}".format(feature1[0],feature2[0])
  5. Menjalankannya...

enter code herefindOverlaps (fc)


import itertools, arcpy

fc = r'C:\path\to\your\fc'

def findOverlaps(x):
    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:
        for feature1,feature2 in itertools.combinations(cur, 2):
            if feature1[1].equals(feature2[1]):
                print "{} equals {}".format(feature1[0],feature2[0])
            if feature1[1].overlaps(feature2[1]):
                print "{} overlaps {}".format(feature1[0],feature2[0])
            if feature1[1].contains(feature2[1]):
                print "{} contains {}".format(feature1[0],feature2[0])

findOverlaps(fc)

masukkan deskripsi gambar di sini

Tangkapan layar menunjukkan berbagai fitur yang tumpang tindih, tumpang tindih & identik, dan unik.

masukkan deskripsi gambar di sini

Harun
sumber
2

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.

myList = []
rows = arcpy.UpdateCursor("layername")
for row in rows:
  if str(row.UniqueIdentifier) in myList:
    #value duplicated
    row.DuplicateColumnName = "y"
  else:
    #not there, add it
    myList.append(row.UniqueIdentifier)
  rows.updateRow(row)

(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.

Branco
sumber
Saya berasumsi itu poligon. Jika garis, Anda bisa menggunakan panjang. Poin paling mudah dengan koordinat X / Y.
Branco
2
Saya berpikir tentang "fitur area yang sama", juga, tetapi menurut saya kemungkinan jejak kaki bldg mungkin memiliki cukup banyak jenis bentuk yang sama untuk membuat kecocokan yang tidak diinginkan. Saya pikir ini akan meningkatkan peluang untuk lebih menyempurnakan hal-hal dengan persimpangan fitur MBR. Yaitu, jika mereka memiliki area yang sama (dan mungkin fitur yang sama) DAN MBR mereka berpotongan, maka mungkin mereka dua generasi dari fitur yang sama. Apakah itu masuk akal?
elrobis
2

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:

SELECT a.id, b.id from buildings a, buildings b WHERE 
  ST_INTERSECTS(a.geom, b.geom) AND a.id < b.id;

Ini akan menemukan persimpangan. Jika Anda menginginkan kesetaraan total, ganti ST_Intersects dengan ST_Equals. Atau, cukup gabungkan keduanya:

SELECT a.id, b.id from buildings a, buildings b WHERE 
   (ST_INTERSECTS(a.geom, b.geom) OR ST_EQUALS(a.geom, b.geom)) 
   AND a.id < b.id;

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.

John Powell
sumber
Jika Anda tidak memiliki atribut yang unik di shapefile, Anda dapat menggunakan a.rowidbukan a.id. rowidadalah kata kunci dalam SQLite yang akan memberi Anda ID internal dari dataset.
LuWi
1

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!

Johanna
sumber