Jak zmniejszyć rozmiar plików kształtów po usunięciu funkcji?

9

Ten mały, mały skrypt usuwa wszystkie małe funkcje na wszystkich warstwach. Działa to dobrze, ale rozmiar plików .shp nie jest zmniejszany. Proszę, powiedz mi dlaczego...

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
źródło

Odpowiedzi:

14

Ponieważ najszybszym sposobem na usunięcie operacji z plików kształtów jest oznaczenie rekordów flagą „usunięty” w części .dbf bez przepisywania wszystkich części .shp, .shx i .dbf. Jest to również udokumentowane na stronie sterownika GDAL shp http://www.gdal.org/drv_shapefile.html

Sterownik pliku kształtu OGR obsługuje przepisywanie istniejących kształtów w pliku kształtu, a także usuwanie kształtów. Usunięte kształty są oznaczane do usunięcia w pliku .dbf, a następnie ignorowane przez OGR. Aby faktycznie usunąć je trwale (co powoduje zmianę numeracji FID), należy wywołać SQL „REPACK” za pomocą metody ExecuteSQL () źródła danych.

użytkownik30184
źródło
2
Technicznie, funkcja „oznacz jako usuniętą” w dBase nie jest obsługiwana przez pliki kształtów, więc GDAL generuje wtedy uszkodzone pliki kształtów.
Vince
Istnieje stara odpowiedź gis.stackexchange.com/questions/162615/… (ta być może jest duplikatem), w której znalazłem, że MapObjects firmy ESRI ma podobną metodę delRecord (indeks), która niczego fizycznie nie usuwa. Być może programy ESRI lepiej dbają o uruchamianie „paczki” przed zamknięciem plików kształtu, ale wydaje się, że mają także wsparcie dla „oznacz jako usunięty”.
user30184
Wykonanie „Zapisz jako” na warstwie spowoduje usunięcie usuniętych funkcji.
SpatialSuccess
Nie mam dużego doświadczenia w QGIS i pythonie. Jak wywołujesz SQL „REPACK”?
EvanH
5

Powinieneś sprawdzić wersję QGIS, w której ją widzisz.

Wiem, że to zachowanie zostało poprawione w wersji 2.14, dzięki czemu po wywołaniu metody deleteFeatures plik kształtu zostanie przepakowany w celu usunięcia wszelkich pozostałych wierszy porzuconych.

Powinieneś ponownie przetestować wersję 2.14 i sprawdzić, czy jest jakaś poprawa.

ndawson
źródło
Bardzo dziękuję za odpowiedź. Brzmi świetnie, że został poprawiony w wersji 2.14. Korzystam z wersji 2.12.2 i wiem, że 2.12.3 jest gotowy do pobrania, ale gdzie mogę znaleźć wersję 2.14?
EvanH