Comment réduire la taille des fichiers de formes lorsque les fonctionnalités sont supprimées?

9

Ce minuscule petit script supprime toutes les petites fonctionnalités de toutes les couches. Cela fonctionne bien mais la taille des fichiers .shp n'est pas réduite. S'il vous plaît dites-moi pourquoi...

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
la source

Réponses:

14

Parce que le moyen le plus rapide pour supprimer des fonctionnalités des fichiers de formes est de marquer les enregistrements avec un indicateur "supprimé" dans la partie .dbf sans réécrire toutes les parties .shp, .shx et .dbf. Ceci est également documenté sur la page du pilote GDAL shp http://www.gdal.org/drv_shapefile.html

Le pilote de fichier de formes OGR prend en charge la réécriture de formes existantes dans un fichier de formes ainsi que la suppression de formes. Les formes supprimées sont marquées pour suppression dans le fichier .dbf, puis ignorées par OGR. Pour les supprimer définitivement (entraînant une renumérotation des FID), appelez le SQL 'REPACK' via la méthode de source de données ExecuteSQL ().

user30184
la source
1
Techniquement, la fonction "marquer comme supprimé" de dBase n'est pas prise en charge par les fichiers de formes, donc GDAL génère des fichiers de formes corrompus quand il le fait.
Vince
Il y a une ancienne réponse gis.stackexchange.com/questions/162615/… (celle-ci étant peut-être un doublon) où j'ai trouvé que MapObjects par ESRI avait une méthode delRecord (index) similaire qui ne supprime rien physiquement. Les programmes ESRI prennent peut-être mieux soin d'exécuter "pack" avant de fermer les fichiers de formes, mais il semble qu'ils prennent également en charge "marquer comme supprimé".
user30184
Effectuer un «enregistrement sous» sur le calque supprimera les fonctionnalités supprimées.
SpatialSuccess
Je n'ai pas cette grande expérience en QGIS et en python. Comment invoquez-vous le «REPACK» SQL?
EvanH
5

Vous devez vérifier la version de QGIS dans laquelle vous voyez cela.

Je sais que ce comportement a été modifié dans la version 2.14, de sorte qu'après avoir appelé deleteFeatures, un fichier de formes sera reconditionné pour supprimer toutes les lignes orphelines restantes.

Vous devriez tester à nouveau avec la version 2.14 et voir s'il y a une amélioration.

ndawson
la source
Merci beaucoup pour votre réponse. Cela semble génial d'avoir été modifié dans la version 2.14. J'utilise la version 2.12.2 et je sais que 2.12.3 est prêt à être téléchargé, mais où puis-je trouver la version 2.14?
EvanH