SHP 기능을 삭제하는 Python 모듈 (Desktop GIS가 설치되지 않은 경우)


16

외부 데이터베이스에서 shapefile 기능을 업데이트하는 비 프로덕션 시스템에서 야간에 실행되는 소프트웨어 (Arc 아님)가 있습니다. 주기적으로 shapefile의 모든 기능 (파일 자체가 아니라 남은 파일이 아님)을 삭제하고 소프트웨어가 shapefile을 처음부터 "다시 작성"하도록합니다. 이 과정을 자동화하고 싶습니다.

해당 시스템에 현재 설치된 GIS 소프트웨어가 없습니다. Arc의 Delete Features 지오 프로세싱 도구 와 마찬가지로 기능을 자동으로 삭제하는 Python 루틴을 스크립트로 작성할 수 있기를 바랐습니다 .

내가 이것을 할 수있는 파이썬 모듈이 있습니까? 바람직하게 오픈 소스? 나는 보았다 매끈한PyShp 하지만 나 대량의 기능을 삭제할 수 있습니다 것이 아무것도 표시되지 않았거나 것으로는 WHERE 절을 일치. 기능을 작성하고 분석 할 수 있지만 DELETE FEATURES 기능은 어디에도 보이지 않습니다.

나는 분명히 간단한 것을 놓치고 있어야합니다 ...

편집 : 35 개의 폴더 (다른 지리적 범위, 모두 자체 투영에 있음)와 35-65 개의 shapefile이 있으며 약 1000 개의 shapefile이 처리됩니다.

답변:


16

GDAL / OGR python API를 사용할 수 있습니다 . 코드는 다음과 같습니다.

from osgeo import ogr

shapefile = ogr.Open( "shapfile.shp",1 )
layer=shapefile.GetLayerByIndex(0)
count=layer.GetFeatureCount()
for feature in range(count):
    layer.DeleteFeature(feature)

나는 얻는다ERROR 1: The DeleteFeature() operation is not permitted on a read-only shapefile
matt wilkie 23

4
당신은 쓰기 위해 그것을 열어야합니다. ogr.Open ( 'shapefile.shp', 1)
capooti

12

빈 결과 생성을 보장하는 where 절이있는 명령 행 ogr2ogr 은 빠르고 쉬운 방법 중 하나입니다.

ogr2ogr output.shp input.shp -where "FID < 0"

파이썬 및 OGR (및 GDAL)의 개요 페이지는 http://trac.osgeo.org/gdal/wiki/GdalOgrInPython입니다.


나는 그 아이디어를 좋아한다. 입력 파일을 삭제하고 출력 파일의 이름을 다시 입력 이름으로 바꾸는 데 스크립팅을 수행해야하지만 다른 해결책이 없으면 작동시킬 수 있습니다.
RyanKDalton-OffTheGridMaps

1
여기에 한 줄 배치 파일이 for %%a in (sample.shp) do (ogr2ogr %temp%\xxx.shp %%a -where "FID < 0" && copy %temp%\xxx.* %%~na.*)있습니다.. 파블로의 대답은 더 확장 가능합니다.
matt wilkie

11

pyshp에서이 작업을 수행 할 수 있습니다. 이 유스 케이스를 상상하지 않았기 때문에 간단하지만 명확하지 않습니다. 그러나 자동 업데이트 응용 프로그램에는 적합합니다. 다음 6 줄의 코드를 테스트했으며 훌륭하게 작동했습니다.

import shapefile
r = shapefile.Reader("myshape")
w = shapefile.Writer(r.shapeType)
# This line will give us the same dbf schema
w.fields = r.fields
# Use the original bounding box as a place holder in the header
w.bbox = lambda: r.bbox
w.save("myshape")

이제 올바른 헤더와 원래 dbf 필드가있는 원본 위에 작성된 shapefile이 있습니다. GIS 소프트웨어 및 shapefile 라이브러리에서 안전하게 열리지 만 기능이나 dbf 레코드는 없습니다.

람다 함수는 원래 경계 상자를 자리 표시 자로 전송합니다. [xmin, ymin, xmax, ymax]의 배열에 원하는 부동 값을 넣을 수 있습니다. 예:

w.bbox = lambda: [0.0, 0.0, 0.0, 0.0]

dbf 필드 변경도 간단하며 pyshp 문서에 설명되어 있습니다.

희망이 도움이됩니다.


8

빈 Shapefile의 사본을 저장하고 관심있는 Shapefile을 덮어 쓰십시오.


스키마가 ... 많이 변경되지 않는 아이러니하게도, 이럴이만큼 가장 효율적인 솔루션이 될 것입니다
라기 Yaser Burhum

1
하나 또는 두 개의 파일에 대한 것이라면 동의합니다. 이것이 효율적이지 않은 주된 이유는 35-65 셰이프 파일과 함께 35 개의 폴더 (다른 지리적 범위, 모두 자체 투영에 있음)가 있기 때문입니다. 수학에 따르면 1000 개 이상의 빈 셰이프 파일을 관리해야하는데 실용적이지 않습니다. 셰이프 파일을 발견하고 피처를 삭제하는 프로세스를 스크립팅하는 것이 궁극적으로 끝날 것입니다.
RyanKDalton-OffTheGridMaps

Q에서 @RyanDalton은 "모양 파일"이라고 말했는데, 어쨌든 우리에게 단일 솔루션을 생각하고 고안하게했습니다. 나는 유스 케이스에 대한 더 많은 정보가 더 빨리 답변을 더 빨리 적용 할 수 있다고 지적하면서 불평하지 않습니다.
matt wilkie 4
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.