Mô-đun Python để xóa các tính năng SHP (không cài đặt Desktop Desktop)


16

Tôi có một phần mềm (không phải Arc) chạy hàng đêm trên một máy không sản xuất, cập nhật các tính năng shapefile từ cơ sở dữ liệu bên ngoài. Định kỳ tôi muốn xóa tất cả các tính năng trong shapefile (không phải chính tệp, phải giữ lại) và để phần mềm "xây dựng lại" shapefile từ đầu. Tôi muốn tự động hóa quá trình này.

Tôi hiện chưa có phần mềm GIS nào được cài đặt trên máy đó. Tôi đã hy vọng rằng tôi có thể tạo kịch bản một thói quen trong Python để tự động xóa các tính năng, giống như công cụ xử lý địa lý Xóa tính năng Xóa của Arc .

Có mô-đun Python nào cho phép tôi làm điều này không? Ưu tiên nguồn mở? Tôi đã xem ShapelyPyShp nhưng không thấy bất cứ điều gì cho phép tôi xóa các tính năng hàng loạt hoặc phù hợp với mệnh đề WHERE. Họ có thể viết các tính năng và phân tích chúng, nhưng chưa thấy các hàm TÍNH NĂNG XÓA ở bất cứ đâu.

Tôi chắc chắn phải thiếu một cái gì đó đơn giản ...

EDIT: Tôi có 35 thư mục (các phạm vi địa lý khác nhau, tất cả đều nằm trong hình chiếu riêng của chúng), với 35-65 shapefile với khoảng 1000 shapefile để xử lý.

Câu trả lời:


16

Bạn có thể sử dụng API python GDAL / OGR , mã sẽ như thế:

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)

Tôi nhận đượcERROR 1: The DeleteFeature() operation is not permitted on a read-only shapefile
matt wilkie

4
bạn phải mở nó ra để viết Làm điều đó với: ogr.Open ('shapefile.shp', 1)
capooti

12

Dòng lệnh ogr2ogr với mệnh đề where được đảm bảo để tạo kết quả trống là một phương pháp nhanh chóng và dễ dàng:

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

Trang tổng quan về python và OGR (và GDAL) là http://trac.osgeo.org/gdal/wiki/GdalOgrInPython


Tôi thích ý tưởng. Tôi sẽ phải thực hiện một số kịch bản xung quanh việc xóa tệp đầu vào và đổi tên tệp đầu ra thành tên đầu vào, nhưng tôi có thể làm cho nó hoạt động nếu không có giải pháp nào khác được trình bày.
RyanKDalton-OffTheGridMaps

1
đây là một tệp bó một dòng cho điều đó : for %%a in (sample.shp) do (ogr2ogr %temp%\xxx.shp %%a -where "FID < 0" && copy %temp%\xxx.* %%~na.*). Câu trả lời của Pablo là mở rộng hơn mặc dù.
matt wilkie

11

Bạn có thể làm điều này trong pyshp. Nó đơn giản nhưng không rõ ràng vì tôi chưa bao giờ hình dung trường hợp sử dụng này. Nhưng nó có ý nghĩa cho các ứng dụng cập nhật tự động. Tôi đã thử nghiệm 6 dòng mã sau đây và nó hoạt động rất tốt:

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")

Bây giờ bạn có một shapefile được viết trên bản gốc có các tiêu đề chính xác và các trường dbf gốc. Nó sẽ mở một cách an toàn trong phần mềm và thư viện shapefile của GIS nhưng không có tính năng hoặc bản ghi dbf.

Hàm lambda chuyển hộp giới hạn ban đầu dưới dạng giữ chỗ. Bạn có thể đặt giá trị float bao giờ bạn muốn trong một mảng [xmin, ymin, xmax, ymax]. Thí dụ:

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

Việc thay đổi các trường dbf cũng đơn giản và được ghi lại trong các tài liệu pyshp.

Mong rằng sẽ giúp.


8

Tại sao không lưu một bản sao của Shapefile trống và ghi đè lên Shapefile quan tâm của bạn.


Trớ trêu thay, IMHO đây sẽ là giải pháp hiệu quả nhất miễn là lược đồ không thay đổi nhiều ...
Ragi Yaser Burhum

1
Nếu nó là cho 1 hoặc 2 tập tin, tôi sẽ đồng ý. Lý do chính điều này sẽ không hiệu quả là vì tôi có 35 thư mục (các phạm vi địa lý khác nhau, tất cả đều nằm trong hình chiếu của riêng chúng), với 35-65 shapefile. Toán học nói rằng sẽ có hơn 1000 shapefile trống để quản lý, điều này cũng không thực tế. Viết kịch bản một quá trình để khám phá các shapefiles & xóa các tính năng là điều cuối cùng tôi hy vọng sẽ kết thúc.
RyanKDalton-OffTheGridMaps

@RyanDalton trong Q bạn đã nói "shapefile", điều đó dẫn chúng tôi, dù sao tôi cũng nghĩ ra và nghĩ ra một giải pháp đơn lẻ. Tôi không phàn nàn, chỉ nêu ra rằng nhiều thông tin hơn về trường hợp sử dụng có thể đã dẫn đến câu trả lời ngay lập tức được áp dụng nhanh hơn.
matt wilkie
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.