셰이프 수 = 테이블 레코드 수를 프로그래밍 방식으로 확인하는 방법은 무엇입니까?


9

손상된 약 1000 개의 shapefile이 있습니다 (첨부 된 오류 메시지 참조). shapefile은 eCognition Developer 8에서 생성되었습니다 . 손상된 것으로 식별되면 shapefile을 복구 하는 스크립트 도구 가 있습니다.

여기에 이미지 설명을 입력하십시오

편집하다:

모든 모양 파일을 반복하고 모양 수가 테이블 레코드와 일치하는지 확인하는 빠른 스크립트를 만들고 싶습니다. 다음을 사용하여 테이블 레코드를 계산할 수 있습니다.

# Name: fcCount.py
# Purpose: calculate the number of features in a featureclass

# Import system modules
import arcpy
from arcpy import env

env.workspace = "C:/data"
Sample = "MyShp.shp"
result_dbf = int(arcpy.GetCount_management(Sample).getOutput(0)) 
print result_dbf

궁극적으로 다음과 같은 일종의 논리 검사를 만들고 싶습니다.

if result_dbf = result_shp:
    pass
else:
    print "There is a problem with" + str(Sample)

.dbf 파일에 액세스하지 않고 셰이프를 직접 계산할 수 있습니까? 즉, 셰이프 수가 테이블 레코드 수와 일치하는지 프로그래밍 방식으로 확인하는 가장 좋은 방법은 무엇입니까?


1
파일을 볼 수 있다고 생각하지만 속성 테이블의 각 항목이 객체로 표시됩니까? 그것이 sbn 파일이 처리하는 것입니다. 숫자가 일치하지 않는지 여부에 관계없이 shapefilerepairer는 내가 사용하는 것입니다.
브래드 Nesom

1
스크립트를 디 컴파일 하는 것이 유용 할 수 있지만, 그것은 오래된 코드입니다! 솔직히 오늘날의 shapefile에서 작동한다는 사실에 놀랐습니다.
Paul

1
@ 브래드 나는 게시물을 수정하여 수정했습니다. .sbn 오류는 내가 겪었던 다른 문제이며이 문제와 관련이 없습니다.
Aaron

@Brad Shape Checker를 통해 손상된 파일을 실행하면 "dbf 파일에 레코드가 충분하지 않아 공백을 추가합니다"라는 메시지가 표시됩니다.
Aaron

답변:


5

pyshp 사용은 어떻 습니까? 나는 그것을 pip로 설치했고 아래에서 시도한 것은 README 와 거의 같습니다 .

>>> import shapefile
>>> sf = shapefile.Reader("/Users/chad/CoalOutcrops.shp")
>>> shapes = sf.shapes()
>>> len(shapes)
33732
>>> records = sf.records()
>>> len(records)
33732
>>>

불행히도 (또는 아마도 운이 좋을까요?) 테스트 할 잭이없는 모양 파일이 없는지 확인합니다. 모양의 수! = 아니오. 기록.

잠깐만, 이제 아래 주석에서 Kirk의 아이디어 덕분에 잭업 된 shapefile이 있습니다. 나는 dbf를 백업하고 전체 shapefile의 사본을 만들고 일부 기능을 삭제 한 다음 백업 된 dbf의 이름을 원래 이름으로 바꾸고 모양 수 <레코드 수 :

>>> sf = shapefile.Reader("/Users/chad/CoalOutcrops.shp")
>>> records = sf.records()
>>> len(records)
33732
>>> shapes = sf.shapes()
>>> len(shapes)
33721
>>>

2
모양 파일 (실제로는 파일)의 복사본을 만들어보십시오. 그런 다음 사본에서 일부 기능을 삭제하십시오. 그런 다음 원래 dbf를 일부 행이 삭제 된 복사 된 dbf로 바꾸십시오.
커크 Kuykendall

@KirkKuykendall-아이디어가 효과가있었습니다. 편집 내용을 참조하십시오. 감사.
차드 쿠퍼

7
문제 없어요. 더 많은 데이터를 손상시켜야하는 경우 알려주세요.
커크 Kuykendall

@Chad의 도움에 감사합니다. shapefile 모듈이 트릭을 수행했습니다. 셰이프 파일을 성공적으로 확인하는 데 사용되는 최종 스크립트를 게시했습니다. 약 50/1000 개의 파일이 손상되었습니다.
Aaron

5

질문의 소리에서, 당신이 정말로하고 싶은 것은 shapefile에 문제가 있는지 여부를 결정하는 것입니다 (이 경우 레코드가 일치하지 않습니다). 문제가있는 사람들을 식별해야하는 경우 실제로 DBF 및 Shapefile의 레코드를 계산하여 오류가 있는지 판별 할 필요는 없습니다. 이유는 다음과 같습니다.

레코드 수가 다른 모양 파일에서 GetCount 함수를 실행하려고하면 오류와 함께 실패합니다.

오류 000229 : 열 수 없습니다. (GetCount)를 실행하지 못했습니다.

이 시나리오에서는 GetCount 함수가 실패하고 원하는 모양 파일을 식별하기 만하면되므로 이전에 사용하려는 if / else 대신 try / except 절을 사용하여이를 파악할 수 있습니다.

"List FeatureClasses"코드와 루프를 자유롭게 추가하여 각 FC를 수동으로 테스트하지 않고도 작업 공간의 모든 FC를 테스트 할 수있었습니다.

# Import system modules
import arcpy
from arcpy import env

env.workspace = "C:/data"

fcList = arcpy.ListFeatureClasses()

for fc in fcList:
    try:
        result_dbf = int(arcpy.GetCount_management(fc).getOutput(0))
        print fc + ": " + str(result_dbf) + " records"
    except:
        print "There is a problem with: " + str(fc)

고마워 Ryan, 이것은 Chad의 솔루션에 대한 좋은 대안이며 트릭을 수행합니다.
Aaron

2

shapefile 형식이 문서화되어 있습니다. shp 파일의 레코드 수가 dbf 파일의 레코드 수와 일치하지 않는 것 같습니다.

shp 파일 형식은 여기설명되어 있습니다 . 모양의 수를 세는 프로그램을 작성할 수 있습니다. dbf 형식은 여러 곳에 문서화되어 있으며 행 계산에 대한 샘플을 찾을 수 있어야합니다 (예 : here) .


dBase 파일의 행은 두 가지 방법으로 계산할 수 있습니다. (1) 헤더의 레코드에 포함 된 행 수를 지정하고 (2) 헤더 길이를 총 파일 길이 (바이트)에서 빼고 레코드 길이로 나눕니다 ( 1에 필드 길이의 합을 더한 값과 같습니다). 일반적으로 파일이 실제로 잘린 경우 두 가지를 모두 수행하는 것이 좋습니다. 그럼에도 불구하고 카운트가 일치하더라도 .shp 및 .dbf 파일은 .shx 파일 없이는 거의 쓸모가 없으며 .shp 파일로 색인됩니다. 따라서 전체 .shp 파일을 읽는 것보다 .shx 레코드 수를 빠르게 확인하는 것이 좋습니다.
whuber

2

첨부 된 스크립트는 디렉토리를 반복하고 모양 수가 각 모양 파일의 레코드 수와 일치하는지 확인합니다.

import arcpy, os, shapefile
from arcpy import env

env.workspace = r"C:\path\to\shapefiles"
Dir = env.workspace

fclist = arcpy.ListFeatureClasses()

for fc in fclist:

    myfc = os.path.join(Dir, fc)
    sf = shapefile.Reader(str(myfc))
    shapes = sf.shapes()
    shape_total = len(shapes)
    records = sf.records()
    record_total = len(records)

    if shape_total != record_total:
        print "There is a problem with " + str(fc)
    else:
        print str(fc) + " passed"

1

체크 지오메트리를 사용하면 첫 단계를 거치게됩니다.
Onus
Repair Geometry 를 사용하면 복구하려는 문제의 순서와 우선 순위를 선택할 수 있습니다.
다른 구 버전 링크는 다음과 같습니다 . shapefile 검사기를 실행할 때 dbf 재 구축을 마치겠습니까?
이것이 일치하는 레코드를 작성하는 단계입니다. 두 가지 중 하나가 발생하여 오류가 발생했습니다.

  1. shp에 다른 소프트웨어 / 프로세스에 의해 삭제 / 삭제 된 오브젝트 (공간)가 있습니다.
  2. dbf에는 널 기하학을 참조하는 레코드가 있습니다.
    몇 가지 원인이 발생할 수 있습니다.
    shx는 실제로 둘 사이의 인덱스입니다.
    dbf 레코드를 계산하지 않고 도형을 계산하는 것은 솔루션의 절반에 불과합니다.

불행히도 수리 형상은 오류를 지우지 않습니다.
Aaron

1

shapefileswikipedia 기사를 보면 .shx 파일에는 .dbf 파일이 아니라 .shp 파일의 색인이 포함되어야합니다. 따라서 .shx와 .shp가 서로 맞는지 확인해야 할 수도 있습니다.

.dbf없이 shapefile을 열 수 있지만 (속성 테이블이 없음을 의미) 인덱스가 손상되면 오류 메시지가 생성됩니다.


누구에게 "허용되지 않습니까"? .shp 파일에서 모든 기능 정보 를 복구 할 수 있습니다.
whuber

1
제대로 작동하는 인덱스를 기대하는 소프트웨어 올바른 용어가 아니라, 나는 대답을 조금 바꿨다.
AndreJ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.