SHP özelliklerini silmek için Python modülü (Masaüstü GIS yüklü olmadan)


16

Shapefile özelliklerini harici bir veritabanından güncelleyen üretim dışı bir makinede her gece çalışan bir yazılım (Arc değil) var. Periyodik olarak şekil dosyasındaki tüm özellikleri (dosyanın kendisi değil, kalması gereken) silmek ve yazılımın şekil dosyasını sıfırdan yeniden oluşturmasına izin vermek istiyorum. Bu işlemi otomatikleştirmek istiyorum.

Şu anda bu makinede yüklü bir GIS yazılımım yok. Python'da Arc'ın Silme Özellikleri coğrafi işleme aracı gibi özellikleri otomatik olarak silecek bir rutin yazabileceğimi umuyordum .

Bunu yapmama izin verecek Python modülleri var mı? Tercihen açık kaynak? Ben baktım düzgün ve PyShp ama bana kütle özellikleri silmek sağlayacak şey görmedik veya bir WHERE yan tümcesi eşleşti. Özellikleri yazabilir ve analiz edebilirler, ancak ÖZELLİKLERİ SİL işlevlerini hiçbir yerde görmediler.

Kesinlikle basit bir şey eksik olmalı ...

DÜZENLEME: 35 klasör (farklı coğrafi uzantılar, hepsi kendi projeksiyon), 35-65 şekil dosyaları ile başa çıkmak için yaklaşık 1000 şekil dosyaları yapar.

Yanıtlar:


16

Sen kullanabilirsiniz GDAL / OGR piton API , kod böyle olacaktır:

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)

Ben olsunERROR 1: The DeleteFeature() operation is not permitted on a read-only shapefile
mat Wilkie

4
yazmak için açmanız gerekir. Şununla yapın: ogr.Open ('shapefile.shp', 1)
capooti

12

Boş sonuçlar yaratması garanti edilen where cümlesi bulunan ogr2ogr komut satırı hızlı ve kolay bir yöntemdir:

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

Python ve OGR (ve GDAL) için genel bakış sayfası http://trac.osgeo.org/gdal/wiki/GdalOgrInPython


Fikri beğendim. Giriş dosyasını silme ve çıkış dosyasını tekrar giriş adına yeniden adlandırma konusunda bazı komut dosyaları yapmak zorunda kalacaktım, ancak başka hiçbir çözüm sunulmazsa çalışmasını sağlayabilirim.
RyanKDalton

1
Burada bunun için bir tek satır toplu iş dosyası var: for %%a in (sample.shp) do (ogr2ogr %temp%\xxx.shp %%a -where "FID < 0" && copy %temp%\xxx.* %%~na.*). Pablo'nun cevabı daha genişletilebilir.
matt wilkie

11

Bunu pyshp ile yapabilirsiniz. Bu basit ama açık değil çünkü bu kullanım durumunu hiç düşünmedim. Ancak otomatik güncelleme uygulamaları için mantıklı. Aşağıdaki 6 kod satırını test ettim ve harika çalış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")

Artık orijinalin üzerine doğru başlıklara ve orijinal dbf alanlarına sahip bir şekil dosyası yazılmıştır. GIS yazılımında ve şekil dosyası kitaplıklarında güvenle açılır, ancak özellik veya dbf kaydı yoktur.

Lambda işlevi orijinal sınırlayıcı kutuyu yer tutucu olarak aktarır. İstediğiniz kayan değeri bir [xmin, ymin, xmax, ymax] dizisine koyabilirsiniz. Misal:

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

Dbf alanlarını değiştirmek de basittir ve pyshp belgelerinde belgelenmiştir.

Umarım yardımcı olur.


8

Neden boş Shapefile'ın bir kopyasını kaydetmeyip ilgilenen Shapefile'ınızı yeniden yazmıyorsunuz?


İronik bir şekilde, IMHO, şema çok değişmediği sürece en verimli çözüm olacaktır ...
Ragi Yaser Burhum

1
1 veya 2 dosya için olsaydı, kabul ediyorum. Bunun etkili olmamasının ana nedeni, 35-65 şekil dosyasıyla 35 klasörüm (hepsi kendi projeksiyonlarında farklı coğrafi uzantılar) olmasıdır. Matematik, bunun yönetilmesi için 1000+ boş şekil dosyası olacağını söylüyor, bu da pratik değil. Shapefiles keşfetmek ve özellikleri silmek için bir süreç komut dosyası sonunda sonuçta umuyoruz.
RyanKDalton

@RyanDalton Q'da "şekil dosyası" dediniz, bu da bizi yine de, tek bir çözüm düşünmeye ve tasarlamaya yönlendirdi. Şikayet etmiyorum, sadece kullanım durumu hakkında daha fazla bilginin daha çabuk uygulanabilir cevaplara yol açmış olabileceğine dikkat çekiyorum.
matt wilkie
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.