Znaleźć zduplikowane rekordy w terenie za pomocą ArcGIS na komputery?

9

Szukam zduplikowanych rekordów w plikach dbf na podstawie atrybutu o nazwie „ID”. Mam różne pliki dbf od 500 000 rekordów do 1,5 miliona i wiem, że istnieje wiele duplikatów.

Chciałbym dodać pole „Duplikuj”, które mówi Tak lub Nie (lub 1 lub 0 jest w porządku), gdy atrybut ID jest obecny gdzie indziej. Użycie następującego skryptu python w Kalkulatorze pola zwraca 1 dla zduplikowanego wpisu i 0 dla unikalnego wpisu;

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

Jednak pierwszy rekord, na przykład 5 duplikatów identyfikatorów, zostanie również zwrócony jako 0 (kolejne 4 są uważane za duplikaty). Potrzebowałbym wszystkich 5, aby oznaczyć je jako duplikaty, ponieważ identyfikator istnieje gdzie indziej.

Użycie następującego kodu da ci przyrostową liczbę, jak często występuje ten identyfikator, przy czym 1 oznacza pierwszą okazję i tak dalej;

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

isDuplicateIndex( !YOUR_FIELD! )

Chcę tylko 1 (lub Tak), jeśli identyfikator tego rekordu istnieje gdzie indziej! (ArcGIS wersja 10.1)

Widziałem inne odpowiedzi, takie jak skrypt Pythona do identyfikowania zduplikowanych rekordów (kontynuacja), ale to nie do końca działa.

Sam
źródło

Odpowiedzi:

11

Alternatywnym rozwiązaniem jest użycie istniejącego narzędzia „ statystyk podsumowujących ” w ArcGIS, a następnie dołączenie do tabeli wynikowej na podstawie pola identyfikatora. Duplikaty będą miały „COUNT” większe niż 1, więc można je łatwo obliczyć za pomocą kalkulatora pola.

radouxju
źródło
W jaki sposób twoja metoda osiąga przypisanie pierwszego duplikatu rekordu znalezionego jako „0”?
artwork21
@ radouxju Dzięki za odpowiedź, mogę zobaczyć, jakie ilości wielokątów są duplikatami, po prostu wybierając teraz według atrybutu. Zaskoczony, że to nie przyszło mi do głowy, kiedy wszystkie rzeczy związane z pythonem!
Sam
@ artwork21 nie chciałem, aby pierwszy duplikat był 0, chciałem, aby wszystko, co miało duplikat, było „TAK”, a teraz - jak to jest - liczba większa niż 1
Sam
@Sam, o czym mówisz w tym stwierdzeniu, „jednak pierwszy rekord np. 5 zduplikowanych identyfikatorów również zostanie zwrócony jako 0;”?
artwork21
@ artwork21. Przepraszam, myślę, że moje oryginalne sformułowanie nie było bardzo jasne, zmienię je. Próbowałem powiedzieć, że jeśli wszystkie 5 rekordów ma ten sam identyfikator, ten fragment kodu Pythona identyfikuje pierwszą instancję jako unikatowy identyfikator, a kolejne 4 jako duplikaty. Chciałem, aby wszystkie 5 oznaczono jako duplikaty (tzn. Że identyfikator istniał gdzie indziej)
Sam
1

Innym alternatywnym rozwiązaniem ( działa tylko w środowiskach SDE ) jest użycie istniejącej funkcjonalności SQL w ArcGIS do wyświetlenia duplikatów rekordów

Uzyskaj zduplikowane rekordy w tabeli (wybierz według atrybutu)

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

Przykład:

ID In (SELECT ID FROM GISDATA.MY_TABLE GROUP BY ID HAVING Count(*)>1 )
Naprzód Tristan
źródło
Czy możesz sprawić, by działało to w geobazie plików? Kwerenda działa z powodzeniem w osobistej geobazie, ale gdy próbuję uruchomić ją w geobazie pliku, nie powiedzie się komunikat „Użyto niepoprawnej instrukcji SQL”. Edycja: zgodnie z linkiem do dokumentacji w geobazach plików obsługiwane są tylko ograniczone podkwerendy.
isburns
Zapytanie jest kopiowane bezpośrednio z Twojego posta i zawiera odniesienia do poprawnych nazw tabel i pól. Zapytanie jest poprawne po usunięciu HAVING COUNT(*) > 1. Naprawdę nie widzę sposobu na uruchomienie go w geobazach plików . Wiem, że ten artykuł techniczny jest nieco przestarzały, ale wydaje się, że jest on źródłem Twojej instrukcji SQL i wskazuje, że nie działa on w geobazach plików. Jestem gotów głosować za odpowiedzią, jeśli mogę sprawić, by działała w pliku gdbs lub dodam wyjaśnienie wskazujące, że są wyjątkiem.
isburns
@isburns Myliłem się, działa w środowisku SDE i nie archiwizuje geobazy. Jedną z rzeczy, które możesz zrobić jako obejście, jest przeniesienie danych tabeli do Excela, znalezienie duplikatów, a następnie ponowne dołączenie listy duplikatów w ArcGIS, które pokazałyby tylko te rekordy, a nie idealne, ale działają.
Tristan Forward
1
Dziękuję za aktualizację. Poparłem twoją odpowiedź, ponieważ działa i jest dość prosta i szybka w obsługiwanych geobazach. Wiem, że jest teraz w komentarzach, ale możesz również edytować sam post, aby wskazać, że działa on w osobistych i geodezyjnych geobazach SDE, ale nie w geobazach plikowych lub plikach kształtu.
isburns
0

Poniższy skrypt tworzy nowe pole z liczbą wystąpień każdej wartości z określonego pola. Na przykład, jeśli masz 6 „Paris” w tym polu, każdy wiersz z „Paris” otrzyma 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.")

Można go łatwo zmodyfikować, aby można było wybrać „Tak” lub 1, jeśli liczba> 1, ale wydaje mi się, że posiadanie rzeczywistej liczby jest bardziej przydatne.

Późniejsza edycja: Lub możesz użyć tego w kalkulatorze polowym. Kod skryptu przedlogicznego:

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

zduplikowane pole =

duplicates(!sample_field!)
panda
źródło