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

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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.