Module Python pour supprimer les fonctionnalités SHP (sans Desktop GIS installé)

16

J'ai un logiciel (pas Arc) qui fonctionne tous les soirs sur une machine hors production qui met à jour les fonctionnalités du fichier de formes à partir d'une base de données externe. Je voudrais périodiquement supprimer toutes les fonctionnalités du fichier de formes (pas le fichier lui-même, qui doit rester) et laisser le logiciel "reconstruire" le fichier de formes à partir de zéro. Je voudrais automatiser ce processus.

Je n'ai pas de logiciel SIG actuellement installé sur cette machine. J'espérais pouvoir écrire une routine en Python qui supprimerait automatiquement les entités, un peu comme l' outil de géotraitement Supprimer les entités d'Arc .

Existe-t-il des modules Python qui me permettraient de le faire? De préférence open-source? J'ai regardé Shapely et PyShp mais je n'ai rien vu qui me permettrait de supprimer les fonctionnalités en masse ou qui correspondait à une clause WHERE. Ils peuvent écrire des fonctionnalités et les analyser, mais n'ont vu aucune fonction DELETE FEATURES nulle part.

Je dois certainement manquer quelque chose de simple ...

EDIT: J'ai 35 dossiers (différentes étendues géographiques, tous dans leur propre projection), avec 35-65 fichiers de formes avec environ 1000 fichiers de formes à traiter.

RyanKDalton-OffTheGridMaps
la source

Réponses:

16

Vous pouvez utiliser l' API python GDAL / OGR , le code sera comme ça:

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
la source
Je reçoisERROR 1: The DeleteFeature() operation is not permitted on a read-only shapefile
Matt Wilkie
4
vous devez l'ouvrir pour l'écriture. Faites-le avec: ogr.Open ('shapefile.shp', 1)
capooti
12

La ligne de commande ogr2ogr avec une clause where garantie de créer des résultats vides est une méthode simple et rapide:

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

La page de présentation de python et OGR (et GDAL) est http://trac.osgeo.org/gdal/wiki/GdalOgrInPython

Matt Wilkie
la source
J'aime l'idée. Je devrais faire des scripts pour supprimer le fichier d'entrée et renommer le fichier de sortie en nom d'entrée, mais je pourrais le faire fonctionner si aucune autre solution n'est présentée.
RyanKDalton-OffTheGridMaps
1
voici un fichier de commandes d' une ligne pour que: for %%a in (sample.shp) do (ogr2ogr %temp%\xxx.shp %%a -where "FID < 0" && copy %temp%\xxx.* %%~na.*). La réponse de Pablo est cependant plus extensible.
Matt Wilkie
11

Vous pouvez le faire dans pyshp. C'est simple mais pas évident car je n'ai jamais envisagé ce cas d'utilisation. Mais cela a du sens pour les applications de mise à jour automatisée. J'ai testé les 6 lignes de code suivantes et cela a très bien fonctionné:

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

Vous avez maintenant un fichier de formes écrit sur l'original qui a des en-têtes corrects et les champs dbf d'origine. Il s'ouvrira en toute sécurité dans le logiciel SIG et les bibliothèques de fichiers de formes mais n'a aucune fonctionnalité ni enregistrement dbf.

La fonction lambda transfère la boîte englobante d'origine en tant qu'espace réservé. Vous pouvez mettre les valeurs flottantes que vous souhaitez dans un tableau de [xmin, ymin, xmax, ymax]. Exemple:

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

La modification des champs dbf est également simple et documentée dans les documents pyshp.

J'espère que cela pourra aider.

GeospatialPython.com
la source
8

Pourquoi ne pas enregistrer une copie du Shapefile vierge et écraser votre Shapefile d'intérêt.

klewis
la source
Ironiquement, à
mon humble avis
1
Si c'était pour 1 ou 2 fichiers, je serais d'accord. La principale raison pour laquelle cela ne serait pas aussi efficace est que j'ai 35 dossiers (différentes étendues géographiques, tous dans leur propre projection), avec 35 à 65 fichiers de formes. Le calcul dit que ce serait plus de 1000 fichiers de formes vierges à gérer, ce qui n'est pas pratique non plus. Créer un processus pour découvrir des fichiers de formes et supprimer des fonctionnalités est ce que j'espère finalement finir.
RyanKDalton-OffTheGridMaps
@RyanDalton dans le Q vous avez dit "le shapefile", ce qui nous a conduit, enfin moi en tout cas, à réfléchir et à imaginer une solution singulière. Je ne me plains pas, je souligne simplement que plus d'informations sur le cas d'utilisation à l'avance auraient pu conduire à des réponses plus immédiatement applicables plus rapidement.
Matt Wilkie