ArcGIS for Desktop kullanarak alanda yinelenen kayıtlar mı buldunuz?


9

'ID' adlı özniteliğe dayalı dbf dosyalarında yinelenen kayıtlar arıyorum. 500.000 kayıttan 1.5 milyona kadar çeşitli dbf dosyalarım var ve çoğaltılmış bir dizi olduğunu biliyorum.

Kimlik özniteliği başka bir yerde olduğunda Evet veya Hayır (veya 1 veya 0 iyi) yazan bir alan 'Çoğalt' eklemek istiyorum. Field Calculator'da aşağıdaki python betiğini kullanmak, yinelenen giriş için 1 ve benzersiz giriş için 0 döndürür;

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

Bununla birlikte, örneğin 5 yinelenen kimliğin ilk kaydı da 0 olarak döndürülecektir (sonraki 4 tanesi yinelenen sayılır). Kimliği başka bir yerde var olduğu gibi 5 kopya olarak işaretlemek gerekir.

Aşağıdaki kodu kullanmak, bu kimliğin kaç kez gerçekleştiğine dair artımlı bir sayı verecektir.

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

isDuplicateIndex( !YOUR_FIELD! )

Bu kaydın kimliği başka bir yerde varsa sadece 1 (veya Evet) istiyorum! (ArcGIS sürüm 10.1)

Yinelenen kayıtları (takip) tanımlamak için Python komut dosyası gibi diğer cevaplar gördüm ama oldukça işe yaramıyor.

Yanıtlar:


11

Alternatif bir çözüm, ArcGIS'te mevcut " özet istatistikler " aracını kullanmaktır , o zaman sonuç tablosuna kimlik alanınıza göre katılırsınız. Kopyaların 1'den büyük bir "COUNT" değeri olacaktır, bu nedenle alan hesap makinenizle hesaplamak kolaydır.


Metodunuz, '0' olarak bulunan ilk yinelenen kaydı atamayı nasıl başarıyor?
artwork21

@ radouxju Cevabınız için teşekkürler, şimdi özniteliğe göre seçerek ne kadar çokgen yinelendiğini görebiliyorum. Tüm python şeyler yaptım bu bana olmadı şaşırttı!
Sam

@ artwork21 i 1 yinelenen 0 olmasını istemiyordu, yinelenen bir şey 'EVET' ya da şimdi - olduğu gibi - 1'den büyük bir sayı istedim
Sam

@Sam, bu ifadeyle neyden bahsediyorsunuz?
artwork21

@ artwork21. Özür dilerim, orijinal anlatımın çok net olmadığını düşünüyorum, değiştireceğim. Ne söylemeye çalışıyordum, 5 kayıtların hepsi aynı kimliğe sahipse, bu python kodu parçası 1. örneği benzersiz bir kimlik olarak ve sonraki 4'ü kopya olarak tanımlayacaktı. Ben tüm 5 yinelenen olarak işaretlemek istedim (yani bu kimlik başka bir yerde vardı)
Sam

1

Başka bir alternatif çözüm ( yalnızca SDE ortamlarıyla çalışır ) yinelenen kayıtları göstermek için ArcGIS'teki mevcut SQL işlevselliğini kullanmaktır

Tablodaki Yinelenen Kayıtları Alın (Özelliğe Göre Seç)

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

Misal:

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

Bunu bir dosya coğrafi veritabanında çalıştırabilir misiniz? Sorgu, kişisel bir coğrafi veritabanında başarıyla çalışır, ancak bir dosyayı coğrafi veritabanında çalıştırmayı denediğimde, "Geçersiz bir SQL ifadesi kullanıldı" iletisiyle başarısız oluyor. Düzenleme: Doküman bağlantısına göre , dosya coğrafi veritabanlarında yalnızca sınırlı alt sorgular desteklenir.
Ocak

Sorgu doğrudan postanızdan kopyalanır ve doğru tablo ve alan adlarına başvurur. Ben kaldırdığımda sorgu geçerlidir HAVING COUNT(*) > 1. Gerçekten dosya geodatabases çalışmak için bir yol görmüyorum . Bu teknik makalenin biraz tarihli olduğunu biliyorum , ancak SQL deyiminizin kaynağı gibi görünüyor ve dosya coğrafi veritabanlarında çalışmadığını gösteriyor. Dosya gdbs dosyasında çalışmasını sağlayabilirseniz cevabınızı yükseltmeye hazırım veya istisna olduğunu belirtmek için açıklama eklendi.
Ocak

@isburns Yanılmışım, SDE ortamında çalışıyor ve coğrafi veritabanında değil. Geçici çözüm olarak yapabileceğiniz bir şey, tablo verilerini Excel'e kopyaları bulmak ve daha sonra ArcGIS'te bulunan ve sadece bu kayıtları gösterecek, ideal değil, çalışan dupes listesine katılmaktır.
Tristan Forward

1
Güncelleme için teşekkürler. Yanıtınızı destekledim, çünkü çalışır ve desteklenen coğrafi veri tabanlarında oldukça basit ve hızlıdır. Şimdi yorumlarda olduğunu biliyorum, ancak kişisel ve SDE coğrafi veritabanlarında çalıştığını ancak dosya coğrafi veritabanlarında veya şekil dosyalarında çalışmadığını belirtmek için yayının kendisini de düzenlemek isteyebilirsiniz.
Ocak

0

Aşağıdaki komut dosyası, belirtilen bir alandaki her değerin yineleme sayısını içeren yeni bir alan oluşturur. Yani, ex için, o alanda 6 kez "Paris" varsa, "Paris" ile her satır 6 alacak.

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

Kolayca sahip böylece değiştirilebilir "Evet" ya da 1 ise sayısı> 1, ama gerçek sayım numarasına sahip daha yararlı olduğunu tahmin ediyorum.

Daha Sonra Düzenleme: Veya bunu alan hesaplayıcısında kullanabilirsiniz. Mantık Öncesi kod Kodu:

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

yinelenen alan =

duplicates(!sample_field!)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.