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.