删除特征时如何减小shapefile的大小?


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

Answers:


14

因为从shapefile中删除特征的最快方法是在.dbf部分中用“已删除”标志标记记录,而无需重写所有.shp,.shx和.dbf部分。GDAL shp驱动程序页面http://www.gdal.org/drv_shapefile.html中也对此进行了记录

OGR shapefile驱动程序支持重写shapefile中的现有形状以及删除形状。删除的形状在.dbf文件中标记为要删除,然后由OGR忽略。要真正永久删除它们(导致FID重编号),请通过数据源ExecuteSQL()方法调用SQL'REPACK'。


2
从技术上讲,shapefile不支持dBase的“标记为已删除”功能,因此GDAL执行此操作时会生成损坏的shapefile。
文斯

有一个古老的答案gis.stackexchange.com/questions/162615/…(可能是重复的),我发现ESRI的MapObjects具有类似的delRecord(index)方法,该方法不会物理删除任何内容。也许ESRI程序在关闭shapefile之前会更好地运行“ pack”,但是感觉它们确实也对“标记为已删除”提供了一些支持。
user30184 '16

在图层上执行“另存为”将删除已删除的要素。
SpatialSuccess

我在QGIS和python方面没有那么丰富的经验。您如何调用SQL'REPACK'?
EvanH '16

5

您应该检查在其中看到的QGIS的版本。

我知道此行为已在2.14版中进行了调整,因此在调用deleteFeatures之后,将重新打包shapefile以删除所有剩余的孤立行。

您应该使用2.14版进行重新测试,看看是否有任何改进。


非常感谢您的回答。在2.14版中进行了调整听起来很不错。我正在运行2.12.2版本,我知道2.12.3已准备好下载,但是在哪里可以找到2.14版本?
EvanH '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.