Как уменьшить размер шейп-файлов при удалении объектов?

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()
EvanH
источник

Ответы:

14

Потому что самый быстрый способ удалить объекты из шейп-файлов - это пометить записи «удаленным» флагом в части .dbf без перезаписи всех частей .shp, .shx и .dbf. Это также задокументировано на странице драйвера GDAL shp http://www.gdal.org/drv_shapefile.html.

Драйвер шейп-файла OGR поддерживает перезапись существующих фигур в шейп-файле, а также удаление фигур. Удаленные фигуры помечаются для удаления в файле .dbf, а затем игнорируются OGR. Чтобы фактически удалить их навсегда (что приводит к перенумерации FID), вызовите SQL REPACK с помощью метода источника данных ExecuteSQL ().

user30184
источник
2
Технически, функция «пометить как удаленное» в dBase не поддерживается шейп-файлами, поэтому GDAL генерирует поврежденные шейп-файлы при этом.
Винс
Существует старый ответ gis.stackexchange.com/questions/162615/… (возможно, дублирующий), в котором я обнаружил, что MapObjects от ESRI имеет аналогичный метод delRecord (index), который физически ничего не удаляет. Возможно, программы ESRI лучше заботятся о запуске «pack» перед закрытием шейп-файлов, но кажется, что они также имеют некоторую поддержку «пометить как удаленные».
user30184
Выполнение «сохранить как» на слое удалит удаленные объекты.
SpatialSuccess
У меня нет такого большого опыта в QGIS и Python. Как вы вызываете SQL «REPACK»?
EvanH
5

Вам следует проверить версию QGIS, в которой вы видите это.

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

Вы должны повторно протестировать версию 2.14 и посмотреть, есть ли улучшения.

ndawson
источник
Большое спасибо за ваш ответ. Звучит здорово, что это было подправлено в версии 2.14. Я использую версию 2.12.2 и знаю, что версия 2.12.3 готова к загрузке, но где я могу найти версию 2.14?
EvanH