Wie kann ich die Größe von Shapefiles reduzieren, wenn Features gelöscht werden?

9

Dieses winzige kleine Skript löscht alle kleinen Funktionen in allen Ebenen. Dies funktioniert gut, aber die Größe von .shp-Dateien wird nicht reduziert. Bitte erzähle mir warum...

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
quelle

Antworten:

14

Denn der schnellste Weg, Features aus Shapefiles zu löschen, besteht darin, Datensätze mit einem "gelöschten" Flag im .dbf-Teil zu markieren, ohne alle .shp-, .shx- und .dbf-Teile neu zu schreiben. Dies ist auch auf der GDAL shp-Treiberseite http://www.gdal.org/drv_shapefile.html dokumentiert

Der OGR-Shapefile-Treiber unterstützt das Umschreiben vorhandener Formen in einem Shapefile sowie das Löschen von Formen. Gelöschte Formen werden zum Löschen in der DBF-Datei markiert und dann von OGR ignoriert. Um sie tatsächlich dauerhaft zu entfernen (was zur Umnummerierung von FIDs führt), rufen Sie das SQL-REPACK über die Datenquelle ExecuteSQL () auf.

user30184
quelle
1
Technisch gesehen wird die Funktion "Als gelöscht markieren" von dBase von Shapefiles nicht unterstützt, sodass GDAL dabei beschädigte Shapefiles generiert.
Vince
Es gibt eine alte Antwort gis.stackexchange.com/questions/162615/… (diese ist möglicherweise ein Duplikat), in der ich festgestellt habe, dass MapObjects von ESRI eine ähnliche delRecord (Index) -Methode hat, die physisch nichts entfernt. Vielleicht kümmern sich ESRI-Programme besser darum, "pack" auszuführen, bevor Shapefiles geschlossen werden, aber es scheint, als hätten sie auch Unterstützung für "als gelöscht markieren".
user30184
Durch Ausführen eines Speicherns auf der Ebene werden die gelöschten Features entfernt.
SpatialSuccess
Ich habe keine so große Erfahrung mit QGIS und Python. Wie ruft man das SQL 'REPACK' auf?
EvanH
5

Sie sollten die Version von QGIS überprüfen, in der Sie dies sehen.

Ich weiß, dass dieses Verhalten in Version 2.14 optimiert wurde, sodass nach dem Aufruf von deleteFeatures ein Shapefile neu gepackt wird, um alle verbleibenden verwaisten Zeilen zu entfernen.

Sie sollten mit Version 2.14 erneut testen und prüfen, ob Verbesserungen vorliegen.

Ndawson
quelle
Ich danke Ihnen sehr für Ihre Antwort. Es klingt gut, dass es in Version 2.14 optimiert wurde. Ich verwende Version 2.12.2 und weiß, dass 2.12.3 zum Download bereitsteht. Wo finde ich Version 2.14?
EvanH