9 votos

¿Cómo reducir el tamaño de los shapefiles cuando se eliminan características?

Este pequeño script elimina todas las pequeñas características en todas las capas. Esto funciona bien pero el tamaño de los archivos .shp no se reduce. Por favor dime por qué...

canvas = iface.mapCanvas()
expr = QgsExpression("$length<100")
for l in canvas.layers():
    l.startEditing()
    it = l.getFeatures(QgsFeatureRequest(expr))
    for ft in it:
        l.deleteFeature(ft.id())
    l.commitChanges()

14voto

Joe Puntos 16

Porque la forma más rápida de eliminar características de shapefiles es marcar registros con una bandera de "eliminado" en la parte .dbf sin reescribir todas las partes .shp, .shx y .dbf. Esto también está documentado en la página del controlador GDAL shp http://www.gdal.org/drv_shapefile.html

El controlador de shapefile de OGR soporta la reescritura de formas existentes en un shapefile así como la eliminación de formas. Las formas eliminadas son marcadas para eliminación en el archivo .dbf, y luego ignoradas por OGR. Para eliminarlas permanentemente (resultando en el renumeración de FIDs) invoca el SQL 'REPACK' vía el método ExecuteSQL() del origen de datos.

2 votos

Técnicamente, la característica de "marcar como eliminado" de dBase no es compatible con los shapefiles, por lo que GDAL genera shapefiles corruptos al hacer esto.

0 votos

Hay una respuesta antigua gis.stackexchange.com/questions/162615/… (quizás duplicada) donde encontré que MapObjects de ESRI tenía un método similar delRecord(index) que no elimina nada físicamente. Quizás los programas de ESRI cuidan mejor de ejecutar "pack" antes de cerrar los shapefiles, pero parece que también tienen algún tipo de soporte para "marcar como eliminado".

0 votos

Realizar un 'guardar como' en la capa eliminará las características eliminadas.

5voto

John Feminella Puntos 123

Deberías verificar la versión de QGIS en la que estás viendo esto.

Sé que este comportamiento se modificó en la versión 2.14, por lo que después de llamar a deleteFeatures, un shapefile se reempaquetará para eliminar cualquier fila huérfana restante.

Deberías volver a probar con la versión 2.14 y ver si hay alguna mejora.

0 votos

Muchas gracias por tu respuesta. Suena genial que se haya modificado en la versión 2.14. Estoy usando la versión 2.12.2 y sé que la 2.12.3 está lista para descargar, pero ¿dónde puedo encontrar la versión 2.14?

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X