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

9

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

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()
EvanH
fuente

Respuestas:

14

Debido a que la forma más rápida de eliminar características de los archivos de forma es marcar registros con un indicador "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 archivo de forma OGR admite la reescritura de formas existentes en un archivo de forma, así como la eliminación de formas. Las formas eliminadas se marcan para su eliminación en el archivo .dbf y luego OGR las ignora. Para eliminarlos de forma permanente (lo que resulta en una nueva numeración de los FID) invoque el 'REPACK' de SQL a través del método de origen de datos ExecuteSQL ().

usuario30184
fuente
1
Técnicamente, la función "marcar como eliminado" de dBase no es compatible con los archivos de forma, por lo que GDAL genera archivos de forma corruptos cuando lo hace.
Vince
Hay una vieja respuesta gis.stackexchange.com/questions/162615/… (esta quizás sea un duplicado) donde descubrí que MapObjects de ESRI tenía un método similar de delRecord (index) que no elimina nada físicamente. Tal vez los programas de ESRI cuiden mejor la ejecución de "paquete" antes de cerrar los archivos de forma, pero parece que también tienen algún soporte para "marcar como eliminado".
user30184
Realizar un "guardar como" en la capa eliminará las características eliminadas.
SpatialSuccess
No tengo esa gran experiencia en QGIS y Python. ¿Cómo se invoca el 'REPACK' de SQL?
EvanH
5

Debe verificar la versión de QGIS en la que está viendo esto.

Sé que este comportamiento se modificó en la versión 2.14, por lo que después de llamar a deleteFeatures se volverá a empaquetar un shapefile para eliminar las filas huérfanas sobrantes.

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

ndawson
fuente
Muchas gracias por su respuesta. Suena genial que se haya modificado en la versión 2.14. Estoy ejecutando la versión 2.12.2 y sé que 2.12.3 está listo para descargar, pero ¿dónde puedo encontrar la versión 2.14?
EvanH