Python-Modul zum Löschen von SHP-Funktionen (ohne installiertes Desktop-GIS)

16

Ich habe eine Software (nicht Arc), die jede Nacht auf einem Nicht-Produktions-Computer ausgeführt wird, der Shapefile-Features aus einer externen Datenbank aktualisiert. In regelmäßigen Abständen möchte ich alle Features im Shapefile löschen (nicht die Datei selbst, die verbleiben muss) und die Software das Shapefile von Grund auf neu erstellen lassen. Ich möchte diesen Prozess automatisieren.

Ich habe derzeit keine GIS-Software auf diesem Computer installiert. Ich hatte gehofft, in Python eine Routine erstellen zu können , mit der die Features automatisch gelöscht werden, ähnlich wie mit dem Geoverarbeitungswerkzeug "Features löschen" von Arc .

Gibt es Python-Module, mit denen ich das machen könnte? Am liebsten Open Source? Ich habe mir Shapely und PyShp angesehen , aber nichts gefunden, das es mir erlaubt, die Features in der Masse zu löschen, oder das mit einer WHERE-Klausel übereinstimmt. Sie können Features schreiben und analysieren, haben jedoch nirgendwo DELETE FEATURES-Funktionen gesehen.

Mir muss auf jeden Fall etwas Einfaches fehlen ...

BEARBEITEN: Ich habe 35 Ordner (verschiedene geografische Ausmaße, alle in ihrer eigenen Projektion) mit 35-65 Shapefiles, mit denen ungefähr 1000 Shapefiles bearbeitet werden können.

RyanKDalton-OffTheGridMaps
quelle

Antworten:

16

Sie können die GDAL / OGR-Python-API verwenden . Der Code sieht folgendermaßen aus :

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
quelle
Ich bekommeERROR 1: The DeleteFeature() operation is not permitted on a read-only shapefile
Matt Wilkie
4
Sie müssen es zum Schreiben öffnen. Mach es mit: ogr.Open ('shapefile.shp', 1)
capooti
12

Die Befehlszeile ogr2ogr mit einer where-Klausel, die garantiert leere Ergebnisse erzeugt, ist eine schnelle und einfache Methode:

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

Die Übersichtsseite für Python und OGR (und GDAL) lautet http://trac.osgeo.org/gdal/wiki/GdalOgrInPython

Matt Wilkie
quelle
Ich mag die Idee. Ich müsste einige Skripte ausführen, um die Eingabedatei zu löschen und die Ausgabedatei wieder in den Eingabenamen umzubenennen, aber ich könnte es zum Laufen bringen, wenn keine anderen Lösungen vorgestellt werden.
RyanKDalton-OffTheGridMaps
1
hier ist eine eine Zeile Batch - Datei für das: for %%a in (sample.shp) do (ogr2ogr %temp%\xxx.shp %%a -where "FID < 0" && copy %temp%\xxx.* %%~na.*). Pablos Antwort ist jedoch erweiterbarer.
Matt Wilkie
11

Sie können dies in pyshp tun. Es ist einfach, aber nicht offensichtlich, da ich mir diesen Anwendungsfall nie vorgestellt habe. Bei automatisierten Update-Anwendungen ist dies jedoch sinnvoll. Ich habe die folgenden 6 Codezeilen getestet und es hat super funktioniert:

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

Sie haben jetzt ein Shapefile über das Original geschrieben, das die richtigen Header und die ursprünglichen DBF-Felder enthält. Es wird sicher in GIS-Software- und Shapefile-Bibliotheken geöffnet, hat jedoch keine Features oder DBF-Datensätze.

Die Lambda-Funktion überträgt den ursprünglichen Begrenzungsrahmen als Platzhalter. Sie können beliebige Gleitkommawerte in ein Array von [xmin, ymin, xmax, ymax] einfügen. Beispiel:

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

Das Ändern von DBF-Feldern ist ebenfalls einfach und in den pyshp-Dokumenten dokumentiert.

Ich hoffe, das hilft.

GeospatialPython.com
quelle
8

Speichern Sie eine Kopie des leeren Shapefiles und überschreiben Sie das gewünschte Shapefile.

klewis
quelle
Ironischerweise wäre dies meiner Meinung nach die effizienteste Lösung, solange sich das Schema nicht wesentlich ändert ...
Ragi Yaser Burhum,
1
Wenn es für 1 oder 2 Dateien wäre, würde ich zustimmen. Der Hauptgrund dafür, dass dies nicht so effizient ist, liegt darin, dass ich 35 Ordner (verschiedene geografische Bereiche, alle in ihrer eigenen Projektion) mit 35-65 Shapefiles habe. Die Mathematik sagt, dass 1000+ leere Shapefiles zu verwalten wären, was auch nicht praktikabel ist. Letztendlich hoffe ich, einen Prozess zu entwickeln, um Shapefiles und Löschfunktionen zu entdecken.
RyanKDalton-OffTheGridMaps
@ RyanDalton in der Q Sie sagten "das Shapefile", was uns, naja ich jedenfalls, dazu veranlasste, über eine singuläre Lösung nachzudenken und sie zu entwickeln. Ich beschwere mich nicht, sondern weise nur darauf hin, dass mehr Informationen über den Anwendungsfall zu schnelleren Antworten geführt haben könnten.
Matt Wilkie