Modulo Python per eliminare le funzionalità SHP (senza Desktop GIS installato)


16

Ho un software (non Arc) che gira di notte su una macchina non di produzione che aggiorna le funzionalità dello shapefile da un database esterno. Periodicamente vorrei eliminare tutte le funzionalità del file di forma (non il file stesso, che deve rimanere) e lasciare che il software "ricostruisca" il file di forma da zero. Vorrei automatizzare questo processo.

Non ho alcun software GIS attualmente installato su quella macchina. Speravo di poter scrivere una routine in Python che eliminasse automaticamente le funzionalità, proprio come lo strumento di geoprocessing di Elimina funzionalità di Arc .

Ci sono dei moduli Python che mi permetterebbero di farlo? Preferibilmente open-source? Ho guardato Shapely e PyShp ma non ho visto nulla che mi permettesse di eliminare le funzionalità in massa o che corrispondessero a una clausola WHERE. Possono scrivere funzionalità e analizzarle, ma non hanno mai visto le funzioni ELIMINA FUNZIONI da nessuna parte.

Devo sicuramente mancare qualcosa di semplice ...

EDIT: ho 35 cartelle (diverse estensioni geografiche, tutte nella loro proiezione), con 35-65 shapefile con circa 1000 shapefile da gestire.

Risposte:


16

Puoi usare l' API python GDAL / OGR , il codice sarà così:

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)

RicevoERROR 1: The DeleteFeature() operation is not permitted on a read-only shapefile
matt wilkie il

4
devi aprirlo per scrivere. Fallo con: ogr.Open ('shapefile.shp', 1)
capooti,

12

La riga di comando ogr2ogr con una clausola where garantita per creare risultati vuoti è un metodo rapido e semplice:

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

La pagina panoramica di python e OGR (e GDAL) è http://trac.osgeo.org/gdal/wiki/GdalOgrInPython


Mi piace l'idea. Dovrei fare degli script per eliminare il file di input e rinominare il file di output con il nome di input, ma potrei farlo funzionare se non fossero presentate altre soluzioni.
RyanKDalton-OffTheGridMaps

1
qui è un file batch una riga per che: for %%a in (sample.shp) do (ogr2ogr %temp%\xxx.shp %%a -where "FID < 0" && copy %temp%\xxx.* %%~na.*). La risposta di Pablo è però più estensibile.
matt wilkie,

11

Puoi farlo in pyshp. È semplice ma non ovvio perché non ho mai immaginato questo caso d'uso. Ma ha senso per le applicazioni di aggiornamento automatizzato. Ho testato le seguenti 6 righe di codice e ha funzionato alla grande:

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

Ora hai uno shapefile scritto sopra l'originale che ha le intestazioni corrette e i campi dbf originali. Si aprirà in modo sicuro nel software GIS e nelle librerie shapefile ma non ha funzionalità o record dbf.

La funzione lambda trasferisce il riquadro di delimitazione originale come segnaposto. Puoi mettere tutti i valori float che desideri in una matrice di [xmin, ymin, xmax, ymax]. Esempio:

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

Anche cambiare i campi dbf è semplice e documentato nei documenti pyshp.

Spero possa aiutare.


8

Perché non salvare una copia dello Shapefile vuoto e sovrascrivere lo Shapefile di interesse.


Ironia della sorte, IMHO questa sarebbe la soluzione più efficiente fintanto che lo schema non cambierà molto ...
Ragi Yaser Burhum

1
Se fosse per 1 o 2 file, sarei d'accordo. Il motivo principale per cui questo non sarebbe altrettanto efficace è perché ho 35 cartelle (diverse estensioni geografiche, tutte nella loro stessa proiezione), con 35-65 shapefile. La matematica dice che sarebbero 1000+ gli shapefile da gestire, il che non è neanche pratico. Lo scripting di un processo per scoprire shapefile ed eliminare funzionalità è ciò che spero alla fine di finire.
RyanKDalton-OffTheGridMaps

@RyanDalton nel Q hai detto "lo shapefile", che ci ha portato, beh, comunque, a pensare e escogitare una soluzione singolare. Non mi lamento, sto solo sottolineando che ulteriori informazioni sul caso d'uso in primo piano potrebbero aver portato a risposte più immediatamente applicabili più rapidamente.
Matt Wilson
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.