Menemukan rekaman duplikat di lapangan menggunakan ArcGIS untuk Desktop?


9

Saya mencari rekaman duplikat dalam file dbf berdasarkan atribut yang disebut 'ID'. Saya memiliki berbagai file dbf dari 500.000 catatan hingga 1,5 juta dan saya tahu ada sejumlah duplikat.

Saya ingin menambahkan bidang 'Duplikat' yang bertuliskan Ya atau Tidak (atau 1 atau 0 baik-baik saja) ketika atribut ID ada di tempat lain. Menggunakan skrip python berikut dalam Field Calculator menghasilkan 1 untuk entri duplikat dan 0 untuk entri unik;

uniqueList = []
def isDuplicate(inValue):
  if inValue in uniqueList:
    return 1
  else:
    uniqueList.append(inValue)
    return 0
isDuplicate(!FIELD_NAME!)

Namun, catatan pertama, misalnya, 5 ID duplikat juga akan dikembalikan sebagai 0 (4 berikutnya dianggap duplikat). Saya perlu semua 5 ditandai sebagai duplikat karena ID ada di tempat lain.

Menggunakan kode berikut akan memberi Anda penghitungan tambahan berapa kali ID terjadi dengan 1 yang berarti kejadian pertama dan seterusnya;

UniqueDict = {}
def isDuplicateIndex(inValue):
    UniqueDict.setdefault(inValue,0)
    UniqueDict[inValue] += 1
    return UniqueDict[inValue]

isDuplicateIndex( !YOUR_FIELD! )

Saya hanya ingin 1 (atau Ya) jika ID dari catatan itu ada di tempat lain! (ArcGIS versi 10.1)

Saya telah melihat jawaban lain seperti skrip Python untuk mengidentifikasi catatan duplikat (tindak lanjut) tetapi tidak cukup berhasil.

Jawaban:


11

Solusi alternatif adalah dengan menggunakan alat " ringkasan statistik " di ArcGIS, kemudian Anda bergabung dengan tabel yang dihasilkan berdasarkan bidang ID Anda. Duplikat akan memiliki "COUNT" lebih besar dari 1, sehingga mudah untuk menghitungnya dengan kalkulator bidang Anda.


Bagaimana metode Anda mencapai menetapkan catatan duplikat pertama yang ditemukan sebagai '0'?
artwork21

@ radouxju Terima kasih atas jawaban Anda, saya dapat melihat jumlah poligon yang duplikat dengan hanya memilih berdasarkan atribut sekarang. Terkejut ini tidak terjadi pada saya ketika semua hal python melakukannya!
Sam

@ artwork21 saya tidak ingin duplikat pertama menjadi 0, saya ingin sesuatu yang memiliki duplikat menjadi 'YA', atau sekarang - sebagaimana adanya - angka yang lebih besar dari 1
Sam

@ Sam, apa yang Anda maksudkan dengan pernyataan ini, "namun catatan pertama, misalnya, 5 duplikat ID juga akan dikembalikan sebagai 0;"?
artwork21

@ artwork21. Maaf, saya pikir kata-kata asli saya tidak terlalu jelas, saya akan mengubah. Apa yang saya coba katakan adalah jika 5 record semuanya memiliki ID yang sama, potongan kode python itu akan mengidentifikasi instance pertama sebagai ID unik dan 4 record berikutnya sebagai duplikat. Saya ingin semua 5 ditandai sebagai duplikat (yaitu ID itu ada di tempat lain)
Sam

1

Solusi alternatif lain ( hanya bekerja dengan lingkungan SDE ) adalah dengan menggunakan fungsionalitas SQL yang ada di ArcGIS untuk menunjukkan rekaman duplikat

Dapatkan Duplikat Catatan di Tabel (Pilih berdasarkan Atribut)

[FIELD_NAME] In (SELECT [FIELD_NAME] FROM [TABLE_NAME] GROUP BY [FIELD_NAME] HAVING Count(*)>1 )

Contoh:

ID In (SELECT ID FROM GISDATA.MY_TABLE GROUP BY ID HAVING Count(*)>1 )

Bisakah Anda membuatnya bekerja di geodatabase file? Kueri bekerja dengan sukses di geodatabase pribadi, tetapi ketika saya mencoba menjalankannya dalam file geodatabase gagal dengan pesan "Pernyataan SQL yang tidak valid digunakan." Sunting: sesuai dengan tautan dokumentasi , hanya subqueries terbatas yang didukung dalam file geodatabases.
isburns

Permintaan disalin langsung dari posting Anda dan referensi tabel dan nama bidang yang benar. Permintaan ini valid ketika saya menghapus HAVING COUNT(*) > 1. Saya benar-benar tidak melihat cara untuk membuatnya berfungsi di file geodatabases. Saya tahu artikel teknologi ini agak tanggal, tetapi tampaknya menjadi sumber pernyataan SQL Anda dan ini menunjukkan bahwa itu tidak berfungsi di file geodatabases. Saya siap memvotasikan jawaban Anda jika saya dapat membuatnya berfungsi dalam file gdb, atau klarifikasi ditambahkan untuk menunjukkan bahwa mereka adalah pengecualian.
isburns

@ isburns Saya salah, bekerja di lingkungan SDE dan tidak mengajukan geodatabase. Satu hal yang dapat Anda lakukan sebagai solusinya adalah membawa data tabel ke Excel menemukan duplikat dan kemudian bergabung dengan daftar dupes kembali di ArcGIS yang kemudian hanya akan menampilkan catatan itu, tidak ideal tetapi berfungsi.
Penyerang Tristan

1
Terima kasih atas pembaruannya. Saya memutakhirkan jawaban Anda karena itu berfungsi dan cukup sederhana dan cepat di geodatabases yang didukung. Saya tahu itu ada di komentar sekarang, tetapi Anda mungkin ingin juga mengedit posting itu sendiri untuk menunjukkan bahwa itu berfungsi di geodatabases pribadi dan SDE tetapi tidak mengajukan geodatabases atau shapefile.
isburns

0

Script berikut membuat bidang baru dengan jumlah kemunculan setiap nilai dari bidang yang ditentukan. Jadi, misalnya, jika Anda memiliki "Paris" 6 kali di bidang itu, setiap baris dengan "Paris" akan mendapatkan 6.

import arcpy

arcpy.env.workspace=r"D:\test.gdb"
infeature="sample_feature"
field_in="sample_field"
field_out="COUNT_"+field_in

#create the field for the count values
arcpy.AddField_management(infeature,field_out,"SHORT")

#creating the list with all the values in the field, including duplicates
lista=[]
cursor1=arcpy.SearchCursor(infeature)
for row in cursor1:
    i=row.getValue(field_in)    
    lista.append(i)
del cursor1, row

#updating the count field with the number on occurrences of field_in values
#in the previously created list
cursor2=arcpy.UpdateCursor(infeature)
for row in cursor2:
    i=row.getValue(field_in)
    occ=lista.count(i)   
    row.setValue(field_out,occ)
    cursor2.updateRow(row)
del cursor2, row
print ("Done.")

Ini dapat dengan mudah dimodifikasi sehingga Anda dapat memiliki "Ya" atau 1 jika hitung> 1, tetapi saya rasa memiliki nomor hitung yang sebenarnya lebih bermanfaat.

Edit Nanti: Atau Anda bisa menggunakan ini di kalkulator lapangan. Kode skrip Pra-Logika:

infeature="sample_feature" #change with the name of your feature
lista=[]
field="sample_field" #change with your field with duplicates
cursor1=arcpy.SearchCursor(infeature)
for row in cursor1:
    i=row.getValue(field)    
    lista.append(i)
del cursor1, row

def duplicates(field_in):        
    occ=lista.count(field_in)
    return occ

bidang duplikat =

duplicates(!sample_field!)
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.