Modul Python untuk menghapus fitur SHP (tanpa Desktop GIS diinstal)

16

Saya memiliki perangkat lunak (bukan Arc) yang beroperasi setiap malam di mesin non-produksi yang memperbarui fitur shapefile dari database eksternal. Secara berkala saya ingin menghapus semua fitur di shapefile (bukan file itu sendiri, yang harus tetap) dan membiarkan perangkat lunak "membangun kembali" shapefile dari awal. Saya ingin mengotomatiskan proses ini.

Saya tidak memiliki perangkat lunak GIS yang terinstal di mesin itu. Saya berharap bahwa saya bisa skrip rutin dengan Python yang secara otomatis akan menghapus fitur, seperti alat geoprocessing Arc's Delete Features .

Apakah ada modul Python yang memungkinkan saya melakukan ini? Sumber terbuka yang disukai? Aku memandang Shapely dan PyShp tapi tidak melihat apa pun yang akan memungkinkan saya untuk menghapus fitur dalam massal atau yang cocok klausa WHERE. Mereka dapat menulis fitur dan menganalisisnya, tetapi belum melihat fungsi DELETE FITUR di mana saja.

Saya pasti melewatkan sesuatu yang sederhana ...

EDIT: Saya punya 35 folder (luasan geografis berbeda, semuanya dalam proyeksi mereka sendiri), dengan 35-65 shapefile dengan sekitar 1000 shapefile yang harus ditangani.

RyanKDalton-OffTheGridMaps
sumber

Jawaban:

16

Anda dapat menggunakan API python GDAL / OGR , kodenya akan seperti itu:

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)
Pablo
sumber
Saya mendapatkanERROR 1: The DeleteFeature() operation is not permitted on a read-only shapefile
matt wilkie
4
Anda harus membukanya untuk menulis. Lakukan dengan: ogr.Open ('shapefile.shp', 1)
capooti
12

Baris perintah ogr2ogr dengan klausa yang dijamin membuat hasil kosong adalah salah satu metode cepat dan mudah:

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

Halaman ikhtisar untuk python dan OGR (dan GDAL) adalah http://trac.osgeo.org/gdal/wiki/GdalOgrInPython

matt wilkie
sumber
Aku suka gagasan itu. Saya harus melakukan beberapa skrip menghapus file input dan mengganti nama file output kembali ke nama input, tapi saya bisa membuatnya bekerja jika tidak ada solusi lain yang disajikan.
RyanKDalton-OffTheGridMaps
1
inilah satu baris file batch untuk itu: for %%a in (sample.shp) do (ogr2ogr %temp%\xxx.shp %%a -where "FID < 0" && copy %temp%\xxx.* %%~na.*). Namun jawaban Pablo lebih bisa diperluas.
matt wilkie
11

Anda dapat melakukan ini di pyshp. Ini sederhana tetapi tidak jelas karena saya tidak pernah membayangkan use case ini. Tetapi masuk akal untuk aplikasi pembaruan otomatis. Saya menguji 6 baris kode berikut dan itu berhasil:

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

Anda sekarang memiliki shapefile yang ditulis di atas dokumen asli yang memiliki header dan bidang dbf asli yang benar. Ini akan terbuka dengan aman di perangkat lunak SIG dan pustaka shapefile tetapi tidak memiliki fitur atau catatan dbf.

Fungsi lambda mentransfer kotak pembatas asli sebagai pengganti. Anda bisa meletakkan nilai float apa pun yang Anda inginkan dalam array [xmin, ymin, xmax, ymax]. Contoh:

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

Mengubah bidang dbf juga sederhana dan didokumentasikan dalam dokumen pyshp.

Semoga itu bisa membantu.

GeospatialPython.com
sumber
8

Mengapa tidak menyimpan salinan Shapefile kosong dan menulis-berlebihan Shapefile Anda yang menarik.

Klewis
sumber
Ironisnya, IMHO ini akan menjadi solusi paling efisien asalkan skema tidak banyak berubah ...
Ragi Yaser Burhum
1
Jika itu untuk 1 atau 2 file, saya setuju. Alasan utama ini tidak seefisien adalah karena saya memiliki 35 folder (luasan geografis berbeda, semuanya dalam proyeksi mereka sendiri), dengan 35-65 shapefile. Matematika mengatakan bahwa itu akan menjadi 1.000+ shapefile kosong untuk dikelola, yang juga tidak praktis. Scripting suatu proses untuk menemukan shapefile & menghapus fitur adalah apa yang akhirnya saya harapkan berakhir dengan.
RyanKDalton-OffTheGridMaps
@RyanDalton di Q Anda mengatakan "the shapefile", yang membuat kami, baik saya, memikirkan dan memikirkan solusi tunggal. Saya tidak mengeluh, hanya menunjukkan bahwa lebih banyak informasi tentang use case di muka mungkin mengarah pada jawaban yang lebih segera berlaku lebih cepat.
matt wilkie