ArcGIS없이 Python을 통해 기존 Shapefile에 속성 필드를 추가하는 방법은 무엇입니까?


24

존재하지 않으면 Shapefile에 속성 필드를 추가하는 Python 스크립트가 있습니다. 이것은 ArcGIS (그래픽 또는 Python을 통해)와 쉽게 수행 할 수 있지만 ArcGIS에 의존하지 않는 것을 찾고 있습니다.

나는이 시도 실패 내 Shape 파일이 있기 때문에, OGR과 기능이 포함되어 있습니다 .

필자는 pyshp를 살펴 보았지만 스키마를 만든 후에 스키마를 수정할 수있는 방법이 없습니다. shapefile (Python의 경우)을 사용해 보지 않았지만이 기능이 광고되는 것을 보지 못했습니다. 또한 dbfpy 를 통해 DBF 파일로 땜질하여 이것이 어떻게 수행되는지 알 수 없습니다 .

누구든지 아이디어가 있습니까?


기존 shapefile 구조를 복제하고 새 열을 추가 한 다음 원래 shapefile을 기반으로 채울 수 있습니까?
DavidF


이 질문은 gis.stackexchange.com/q/3623/664 의 복제본으로 마감해야합니다 .
whuber

예, 본질적으로 동일합니다. 나는 보았지만 보지 못했습니다.
Mike T

답변:


8

이미 답변되었으므로 다음 질문을 살펴 봐야합니다. Python을 사용하여 Shapefile에 사용자 정의 기능 속성을 추가하는 방법은 무엇입니까?

/programming/4215658/adding-custom-feature-attributes-to-esri-shapefile-with-python

결과적으로 하나의 shapefile 만 원하는 경우 스크립트 끝에서 입력 파일을 삭제하십시오.


또한 gis.stackexchange.com/questions/3623 / ... 와 비슷합니다. 파헤쳐 주셔서 감사합니다
Mike T


4

DBF라고하는 다소 치명적인 형식 덕분에 DBF에 패딩을 다시 쓰거나 추가하지 않으면 기존 속성 데이터로 셰이프 파일에 필드를 추가 할 수 없습니다. 기성품 솔루션을 모르지만 기존의 것을 기반으로 새 모양 파일을 만들고 새 모양 파일에 추가 필드를 추가하는 스크립트를 작성합니다. 그런 다음 지오메트리 / 속성 데이터를 이전에서 새 모양 파일로 복사합니다. 그리고 마지막 단계로 이전 모양 파일을 제거하고 새 모양 파일의 이름을 바꿉니다. 이 모든 것은 OGR 파이썬 바인딩을 사용하여 매우 쉽게 수행됩니다.

또는 dbfpy를 사용하여 DBF 파일로만 위의 작업을 수행 할 수 있습니다. 단계 순서는 동일하게 유지됩니다.

  1. 원본과 동일한 구조로 새로운 DBF 생성
  2. 새 DBF에서 새 속성 필드를 작성하십시오.
  3. 원본 DBF에서 새 DBF로 데이터 복사
  4. 이전 DBF를 제거하고 새 DBF의 이름을 이전 DBF로 바꿉니다.

shapefile (.shp) 자체 또는 다른 파일은 DBF에 포함 된 속성 정보를 참조하지 않으므로 변경할 필요가 없습니다. 그러나 이전 DBF와 새 DBF에서 레코드 순서를 정확히 동일하게 유지해야합니다.


3

DBFpy가 작동합니다. 이 페이지에서 예제를 보았습니까?

http://dbfpy.sourceforge.net/

잠금 파일을 통해 문제가 발생할 수 있으므로 ArcGIS를 포함한 다른 응용 프로그램에서 셰이프 파일을 편집하지 않아야합니다.


DBF 파일에 이미 데이터가 있다면 이것이 작동하지 않는다고 생각합니다. 전에 살펴 봤지만 "최소한 하나 이상의 레코드가 추가되어 구조를 변경할 수 없습니다"라는 오류가 발생합니다. 구체적인 예가 있습니까?
Mike T

아, Sasa가 새로운 DBF의 생성이 필요할 것이라고 말했듯이 지금은 그렇습니다. 필드 등에서 스키마를 복사 한 다음 추가 한 다음 레코드를 복사하십시오. "위대한"DBF ... :(
Rob Clark

@Mike 필드를 추가하는 것만으로 레코드가 어떻게 추가 되었습니까 ?? 레코드를 추가하면 속성과 셰이프 간의 연결이 손상되므로 오류가 발생합니다. 필드를 추가해도 전혀 해가되지 않습니다. dbf 파일을 편집 할 수있는 모든 라이브러리가 작업을 올바르게 수행합니다.
whuber

@ whuber : 오류 메시지입니다. 데이터가있는 기존 dbf를 열고 다음을 참조하십시오.from dbfpy import dbf; db = dbf.Dbf('my.dbf'); db.addField(("FOO", "C", 15))
Mike T

@Mike 상황을 명확히 해 주셔서 감사합니다. dbfpy에서 불필요한 제한의 결과처럼 들립니다 :-(. 이유 : 비어 있지 않은 데이터베이스에 필드를 추가하려면 모든 레코드를 실제로 읽고, 확장하고 다시 써야합니다. 좋은 해결책은 다음과 같습니다. 다른 dBase 라이브러리를 찾거나 다른 소프트웨어를 사용하려면 ;-).
whuber

1

OGR을 사용하는 솔루션을 찾았으며 이전 질문의 도움에 감사했습니다 . 다음은 완전한 예입니다.

from osgeo import ogr

# Open a Shapefile, and get field names
source = ogr.Open('my.shp', update=True)
layer = source.GetLayer()
layer_defn = layer.GetLayerDefn()
field_names = [layer_defn.GetFieldDefn(i).GetName() for i in range(layer_defn.GetFieldCount())]
print len(field_names), 'MYFLD' in field_names

# Add a new field
new_field = ogr.FieldDefn('MYFLD', ogr.OFTInteger)
layer.CreateField(new_field)

# Close the Shapefile
source = None

내 문제는 내가 layer_defn.AddFieldDefn(new_field)아닌 사용했다 layer.CreateField(new_field). 많은 도움을 주셔서 감사하며 비슷한 다른 질문을 철저히 확인하지 않아서 죄송합니다.

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