피처가 삭제 될 때 셰이프 파일의 크기를 줄이는 방법은 무엇입니까?


9

이 작은 스크립트는 모든 레이어의 모든 작은 기능을 삭제합니다. 이것은 잘 작동하지만 .shp 파일의 크기는 줄어들지 않습니다. 저에게 이유를 알려주세요...

canvas = iface.mapCanvas()
expr = QgsExpression("$length<100")
for l in canvas.layers():
    l.startEditing()
    it = l.getFeatures(QgsFeatureRequest(expr))
    for ft in it:
        l.deleteFeature(ft.id())
    l.commitChanges()

답변:


14

shapefile에서 피쳐를 삭제하는 가장 빠른 방법은 모든 .shp, .shx 및 .dbf 파트를 다시 쓰지 않고 .dbf 파트에서 "삭제 된"플래그로 레코드를 표시하는 것입니다. 이것은 또한 GDAL shp 드라이버 페이지 http://www.gdal.org/drv_shapefile.html에 문서화되어 있습니다 .

OGR shapefile 드라이버는 모양을 삭제하는 것뿐만 아니라 shapefile에 기존 모양을 다시 작성할 수 있도록 지원합니다. 삭제 된 셰이프는 .dbf 파일에서 삭제 된 것으로 표시되고 OGR에 의해 무시됩니다. 실제로이를 영구적으로 제거하려면 (FID의 번호를 다시 매김) 데이터 소스 ExecuteSQL () 메소드를 통해 SQL 'REPACK'을 호출하십시오.


2
기술적으로 dBase의 "삭제 된 것으로 표시"기능은 shapefile에서 지원되지 않으므로 GDAL은이를 수행 할 때 손상된 shapefile을 생성합니다.
Vince

이전 답변 gis.stackexchange.com/questions/162615/… (이것은 아마도 복제품입니다) ESRI의 MapObjects에는 물리적으로 아무것도 제거하지 않는 비슷한 delRecord (index) 메소드가 있음을 발견했습니다. 아마도 ESRI 프로그램은 shapefile을 닫기 전에 "pack"실행을 더 잘 관리하지만 "삭제 된 것으로 표시"를 지원하는 것처럼 느낍니다.
user30184

레이어에서 '다른 이름으로 저장'을 수행하면 삭제 된 기능이 제거됩니다.
SpatialSuccess

QGIS와 파이썬에서 그다지 큰 경험이 없습니다. SQL 'REPACK'을 어떻게 호출합니까?
EvanH

5

이것을보고있는 QGIS 버전을 확인해야합니다.

이 동작은 버전 2.14에서 조정되었으므로 deleteFeatures를 호출 한 후 남은 고아 행을 제거하기 위해 shapefile이 다시 압축됩니다.

버전 2.14로 다시 테스트하고 개선 사항이 있는지 확인해야합니다.


대답 해 주셔서 감사합니다. 버전 2.14에서 조정 된 것 같습니다. 버전 2.12.2를 실행 중이며 2.12.3을 다운로드 할 준비가되었지만 버전 2.14는 어디에서 찾을 수 있습니까?
EvanH
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.