ArcGIS for Desktop을 사용하여 현장에서 중복 레코드를 찾으십니까?


9

'ID'라는 속성을 기반으로 dbf 파일에서 중복 레코드를 찾고 있습니다. 500,000 레코드에서 150 만까지 다양한 dbf 파일이 있으며 중복 된 호스트가 있다는 것을 알고 있습니다.

ID 속성이 다른 곳에있을 때 예 또는 아니오 (또는 1 또는 0은 괜찮음)라는 필드 '중복'을 추가하고 싶습니다. 필드 계산기에서 다음 파이썬 스크립트를 사용하면 중복 항목의 경우 1이, 고유 항목의 경우 0이 반환됩니다.

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

그러나 예를 들어 5 개의 중복 ID에 대한 첫 번째 레코드도 0으로 반환됩니다 (다음 4 개는 중복으로 간주 됨). ID가 다른 곳에 존재하므로 5를 모두 중복으로 표시해야합니다.

다음 코드를 사용하면 ID가 1 번 발생하는 횟수 등의 횟수를 증분으로 계산할 수 있습니다.

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

isDuplicateIndex( !YOUR_FIELD! )

해당 레코드의 ID가 다른 곳에 존재하면 1 (또는 예)을 원합니다! (ArcGIS 버전 10.1)

중복 레코드를 식별하기위한 Python 스크립트 (후속 작업) 와 같은 다른 답변을 보았지만 제대로 작동하지 않습니다.

답변:


11

대안 솔루션은 ArcGIS에서 기존 " 요약 통계 "도구를 사용한 다음 ID 필드를 기반으로 결과 테이블을 조인하는 것입니다. 중복은 1보다 큰 "COUNT"를 가지므로 필드 계산기로 계산하는 것이 간단합니다.


방법에서 '0'으로 발견 된 첫 번째 중복 레코드를 어떻게 할당합니까?
artwork21

@ radouxju 답장을 보내 주셔서 감사합니다. 속성별로 간단히 선택하여 어느 정도의 다각형이 복제되는지 볼 수 있습니다. 모든 파이썬 물건이 나에게 이런 일이 발생하지 않았다는 것에 놀랐습니다!
Sam

@ artwork21 내가 didnt 한 제 1 회 중복이 0가되고 싶어요, 난 될 수있는 중복 있었다 아무것도 싶어 'YES', 또는 지금 - 그대로 - 하나 이상의 숫자보다

@Sam,이 진술에서 "예를 들어 5 개의 중복 ID의 첫 번째 레코드도 0으로 반환됩니다."
artwork21

@ 아트 워크 21. 사과, 나는 원래의 문구가 명확하지 않다고 생각합니다. 내가 말하려고하는 것은 5 개의 레코드가 모두 동일한 ID를 가지고 있다면, 그 파이썬 코드는 첫 번째 인스턴스를 고유 ID로 식별하고 후속 4는 복제본으로 식별한다는 것입니다. 나는 5가 모두 중복 된 것으로 표시되기를 원했다 (즉, 다른 곳에 ID가 존재 함)
Sam

1

다른 대안 솔루션 ( SDE 환경에서만 작동 )은 ArcGIS의 기존 SQL 기능을 사용하여 중복 레코드를 표시하는 것입니다.

테이블에서 중복 레코드 가져 오기 (속성별로 선택)

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

예:

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

파일 지오 데이터베이스에서 작동하도록 할 수 있습니까? 쿼리는 개인 지오 데이터베이스에서 성공적으로 작동하지만 파일 지오 데이터베이스에서 실행하려고하면 "잘못된 SQL 문이 사용되었습니다"라는 메시지와 함께 실패합니다. 편집 : 문서 링크 에 따르면 파일 하위 데이터베이스에서 제한된 하위 쿼리 만 지원됩니다.
isburns

쿼리는 게시물에서 직접 복사되며 올바른 테이블 및 필드 이름을 참조합니다. 내가 제거하면 쿼리가 유효합니다 HAVING COUNT(*) > 1. 파일 지오 데이터베이스 에서 작동시키는 방법을 실제로 보지 못했습니다 . 이 기술 기사 는 다소 오래되었지만 SQL 문의 소스 인 것으로 보이며 파일 지오 데이터베이스에서 작동하지 않음을 나타냅니다. 파일 gdb에서 작동 시키거나 예외가 있음을 나타 내기 위해 설명이 추가되면 귀하의 답변을 공개 할 준비가되었습니다.
isburns

@isburns 실수로 SDE 환경에서 작동하지만 파일 지오 데이터베이스는 작동하지 않습니다. 해결 방법으로 수행 할 수있는 한 가지 작업은 테이블 데이터를 Excel로 가져 와서 중복 항목을 찾은 다음 Dupe 목록을 ArcGIS에 다시 결합하여 해당 레코드 만 표시하는 것입니다.
Tristan Forward

1
업데이트 해 주셔서 감사합니다. 지원되는 지오 데이터베이스에서 작동하고 상당히 간단하고 빠르기 때문에 귀하의 답변을 찬성했습니다. 나는 그것이 주석에 있다는 것을 알고 있지만 게시물 자체를 편집하여 개인 및 SDE 지오 데이터베이스에서 작동하지만 파일 지오 데이터베이스 또는 셰이프 파일에서는 작동하지 않음을 나타냅니다.
isburns 2016 년

0

다음 스크립트는 지정된 필드에서 각 값의 발생 횟수로 새 필드를 만듭니다. 예를 들어, 해당 필드에 "Paris"가 6 번있는 경우 "Paris"가있는 각 행은 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.")

count> 1이면 "Yes" 또는 1을 갖도록 쉽게 수정할 수 있지만 실제 개수를 갖는 것이 더 유용 할 것 같습니다.

나중에 편집 : 또는 필드 계산기에서 사용할 수 있습니다. 사전 논리 스크립트 코드 :

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

중복 필드 =

duplicates(!sample_field!)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.