Módulo de Python para eliminar características de SHP (sin Desktop GIS instalado)

16

Tengo un software (no Arc) que se ejecuta todas las noches en una máquina que no es de producción y que actualiza las características de los archivos de forma desde una base de datos externa. Periódicamente me gustaría eliminar todas las características en el archivo de forma (no el archivo en sí, que debe permanecer) y dejar que el software "reconstruya" el archivo de forma desde cero. Me gustaría automatizar este proceso.

No tengo ningún software SIG instalado actualmente en esa máquina. Tenía la esperanza de poder escribir una rutina en Python que eliminaría automáticamente las características, al igual que la herramienta de geoprocesamiento Eliminar características de Arc .

¿Hay algún módulo de Python que me permita hacer esto? ¿Preferiblemente de código abierto? Miré a Shapely y PyShp pero no vi nada que me permitiera eliminar las características en masa o que coincidieran con una cláusula WHERE. Pueden escribir características y analizarlas, pero no han visto las funciones ELIMINAR CARACTERÍSTICAS en ningún lado.

Ciertamente me estoy perdiendo algo simple ...

EDITAR: Tengo 35 carpetas (diferentes extensiones geográficas, todas en su propia proyección), con 35-65 shapefiles con alrededor de 1000 shapefiles para tratar.

RyanKDalton-OffTheGridMaps
fuente

Respuestas:

16

Puede usar la API de python GDAL / OGR , el código será así:

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
fuente
Me saleERROR 1: The DeleteFeature() operation is not permitted on a read-only shapefile
wilkie mate
44
Tienes que abrirlo para escribir. Hazlo con: ogr.Open ('shapefile.shp', 1)
capooti
12

La línea de comando ogr2ogr con una cláusula where garantizada para crear resultados vacíos es un método rápido y fácil:

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

La página de resumen para python y OGR (y GDAL) es http://trac.osgeo.org/gdal/wiki/GdalOgrInPython

wilkie mate
fuente
Me gusta la idea. Tendría que hacer algunas secuencias de comandos para eliminar el archivo de entrada y cambiar el nombre del archivo de salida al nombre de entrada, pero podría hacerlo funcionar si no se presentan otras soluciones.
RyanKDalton-OffTheGridMaps
1
aquí hay un archivo por lotes una línea para que: for %%a in (sample.shp) do (ogr2ogr %temp%\xxx.shp %%a -where "FID < 0" && copy %temp%\xxx.* %%~na.*). Sin embargo, la respuesta de Pablo es más extensible.
Matt Wilkie
11

Puedes hacer esto en pyshp. Es simple pero no obvio porque nunca imaginé este caso de uso. Pero tiene sentido para las aplicaciones de actualización automatizadas. Probé las siguientes 6 líneas de código y funcionó muy bien:

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

Ahora tiene un archivo de forma escrito sobre el original que tiene encabezados correctos y los campos dbf originales. Se abrirá de forma segura en el software SIG y en las bibliotecas de archivos de forma, pero no tiene características ni registros dbf.

La función lambda transfiere el cuadro delimitador original como marcador de posición. Puede poner los valores flotantes que desee en una matriz de [xmin, ymin, xmax, ymax]. Ejemplo:

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

Cambiar los campos dbf también es simple y está documentado en los documentos de pyshp.

Espero que ayude.

GeospatialPython.com
fuente
8

¿Por qué no guardar una copia del Shapefile en blanco y sobrescribir su Shapefile de interés?

klewis
fuente
Irónicamente, en mi humilde opinión esto sería la solución más eficaz, siempre y cuando el esquema no cambia mucho ...
Ragi Yaser Burhum
1
Si fuera por 1 o 2 archivos, estaría de acuerdo. La razón principal por la que esto no sería tan eficiente es porque tengo 35 carpetas (diferentes extensiones geográficas, todas en su propia proyección), con 35-65 archivos de forma. La matemática dice que serían más de 1000 archivos de formas en blanco para administrar, lo que tampoco es práctico. Crear un script para descubrir archivos de formas y eliminar características es lo que en última instancia espero terminar.
RyanKDalton-OffTheGridMaps
@RyanDalton en la Q dijiste "el archivo de forma", lo que nos llevó, bueno, de todos modos, a pensar e idear una solución singular. No me quejo, solo señalo que más información sobre el caso de uso por adelantado podría haber dado lugar a respuestas más inmediatas, aplicables más rápidamente.
Matt Wilkie