フィーチャが削除されたときにシェープファイルのサイズを減らす方法は?


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

シェイプファイルからフィーチャを削除する最も速い方法は、すべての.shp、.shx、および.dbfパーツを書き換えることなく、.dbfパーツの「削除済み」フラグでレコードをマークすることです。これは、GDAL shpドライバーページhttp://www.gdal.org/drv_shapefile.htmlにも記載されています

OGRシェープファイルドライバーは、シェープファイル内の既存の形状の書き換えや、形状の削除をサポートしています。削除された形状は、.dbfファイルで削除対象としてマークされ、OGRによって無視されます。実際にそれらを永久に削除するには(FIDの番号が付け直される)、データソースのExecuteSQL()メソッドを介してSQL 'REPACK'を呼び出します。


1
技術的には、dBaseの「削除済みとしてマーク」機能はシェープファイルでサポートされていないため、GDALはこれを行うと破損したシェープファイルを生成します。
ビンス

古い回答gis.stackexchange.com/questions/162615/…(これはおそらく重複している)があり、ESRIのMapObjectsには物理的に何も削除しない同様のdelRecord(index)メソッドがあることがわかりました。おそらく、ESRIプログラムは、シェープファイルを閉じる前に「pack」の実行をより適切に処理しますが、「削除済みとしてマーク」のサポートもあるようです。
user30184

レイヤーで「名前を付けて保存」を実行すると、削除されたフィーチャが削除されます。
SpatialSuccess

QGISとpythonにはそれほど大きな経験はありません。SQL「REPACK」をどのように呼び出しますか?
EvanH 2016

5

これが表示されているQGISのバージョンを確認する必要があります。

この動作はバージョン2.14で調整されたため、deleteFeaturesを呼び出した後、シェープファイルが再パックされて、残っている孤立した行が削除されます。

バージョン2.14で再テストして、改善点があるかどうかを確認してください。


ご回答どうもありがとうございました。バージョン2.14で調整されたようです。バージョン2.12.2を実行していますが、2.12.3をダウンロードする準備ができていることはわかっていますが、バージョン2.14はどこにありますか?
EvanH 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.