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

16

Tengo una pieza de software (no Arc) que se ejecuta todas las noches en una máquina que no es de producción y que actualiza las funciones de shapefile 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 GIS actualmente instalado en esa máquina. Tenía la esperanza de poder escribir una rutina en Python que eliminaría automáticamente las funciones, al igual que Arc's herramienta de geoprocesamiento Eliminar características .

¿Hay algún módulo de Python que me permita hacer esto? Preferiblemente de código abierto? Miré Shapely y PyShp pero no vio nada que me permitiera eliminar las funciones en masa o que coincidieran con una cláusula WHERE. Pueden escribir funciones y analizarlas, pero no han visto las funciones DELETE FEATURES en ninguna parte.

Ciertamente debo estar perdiendo algo simple ...

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

    
pregunta RyanDalton 03.11.2011 - 23:06

4 respuestas

15

Puede utilizar la API de GDAL / OGR python , 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)
    
respondido por el Pablo 03.11.2011 - 23:50
12

La línea de comandos ogr2ogr con una cláusula donde se garantiza la creación de resultados vacíos es un método rápido y fácil:

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

La página de información general de python y OGR (y GDAL) es enlace

    
respondido por el matt wilkie 03.11.2011 - 23:34
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 shapefile escrito sobre el original que tiene los encabezados correctos y los campos dbf originales. Se abrirá de forma segura en el software GIS y en las bibliotecas de shapefile, pero no tiene funciones ni registros de la dbf.

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

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

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

Espero que ayude.

    
respondido por el GeospatialPython.com 04.11.2011 - 04:37
8

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

    
respondido por el klewis 04.11.2011 - 00:28

Lea otras preguntas en las etiquetas