Як зменшити розмір файлів форм при видаленні функцій?


9

Цей крихітний маленький сценарій видаляє всі дрібні функції у всіх шарах. Це добре працює, але розмір .shp файлів не зменшується. Скажіть, будь ласка, чому ...

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

Відповіді:


14

Оскільки найшвидшим способом видалення функцій із форм-файлів є позначення записів "видаленим" прапором у частині .dbf без перезапису всіх частин .shp, .shx та .dbf. Це також задокументовано на сторінці драйверів GDAL shp http://www.gdal.org/drv_shapefile.html

Драйвер форм-файлу OGR підтримує перезапис існуючих фігур у файл форми, а також видалення фігур. Видалені фігури позначаються для видалення у файлі .dbf, а потім ігноруються OGR. Щоб фактично їх видалити назавжди (внаслідок чого перенумерувати FID), виклик SQL 'REPACK' методом datasource ExecuteSQL ().


2
Технічно особливість dBase "позначити як видалене" не підтримується shapefiles, тому GDAL генерує пошкоджені файли форм, коли це робить.
Вінс

Є стара відповідь gis.stackexchange.com/questions/162615/… (ця, можливо, дублікат), де я виявив, що MapObjects від ESRI мав подібний метод delRecord (index), який фізично нічого не видаляє. Можливо, програми ESRI краще піклуються про запуск "пакета" перед закриттям форм-файлів, але відчувається, що вони також мають деяку підтримку "позначити як видалене".
користувач30184

Виконання "збереження як" на шарі видалить видалені функції.
SpatialSuccess

Я не маю такого великого досвіду в QGIS та python. Як викликати SQL "REPACK"?
EvanH

5

Ви повинні перевірити версію QGIS, у якій ви бачите це.

Я знаю, що така поведінка була змінена у версії 2.14, так що після виклику deleteFeatures файл форми буде перепакований, щоб видалити залишки осиротілих рядків.

Вам слід повторно протестувати версію 2.14 і побачити, чи є якісь покращення.


Дуже дякую за вашу відповідь. Чудово звучить те, що його було перероблено у версії 2.14. Я запускаю версію 2.12.2 і знаю, що 2.12.3 готова до завантаження, але де я можу знайти версію 2.14?
EvanH
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.