Come ridurre la dimensione dei file di forma quando le funzionalità vengono eliminate?


9

Questo piccolo script elimina tutte le piccole funzionalità in tutti i livelli. Funziona bene ma le dimensioni dei file .shp non sono ridotte. Per favore, dimmi perché...

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

Risposte:


14

Perché il modo più veloce per eliminare le funzionalità dai file shape è contrassegnare i record con un flag "eliminato" nella parte .dbf senza riscrivere tutte le parti .shp, .shx e .dbf. Questo è anche documentato nella pagina del driver shp GDAL http://www.gdal.org/drv_shapefile.html

Il driver OGR shapefile supporta la riscrittura di forme esistenti in un file shape e la cancellazione di forme. Le forme eliminate vengono contrassegnate per l'eliminazione nel file .dbf e quindi ignorate da OGR. Per rimuoverli effettivamente in modo permanente (con conseguente rinumerazione dei FID), richiamare il "REPACK" di SQL tramite il metodo ExecuteSQL () dell'origine dati.


1
Tecnicamente, la funzione "contrassegna come cancellata" di dBase non è supportata dai shapefile, quindi GDAL sta generando shapefile corrotti quando lo fa.
Vince il

C'è una vecchia risposta gis.stackexchange.com/questions/162615/… (questa è forse una copia duplicata) in cui ho scoperto che MapObjects di ESRI aveva un metodo delRecord (index) simile che non rimuoveva nulla fisicamente. Forse i programmi ESRI si occupano meglio dell'esecuzione di "pack" prima di chiudere gli shapefile, ma sembra che abbiano anche del supporto per "mark as cancellato".
user30184,

Eseguendo un 'salva con nome' sul livello verranno rimosse le funzionalità eliminate.
SpatialSuccess:

Non ho una grande esperienza in QGIS e Python. Come si richiama il "REPACK" di SQL?
EvanH,

5

Dovresti controllare la versione di QGIS in cui stai vedendo questo.

So che questo comportamento è stato modificato nella versione 2.14, in modo che dopo aver chiamato deleteFeatures verrà riconfezionato uno shapefile per rimuovere eventuali righe orfane rimanenti.

Dovresti ripetere il test con la versione 2.14 e vedere se c'è qualche miglioramento.


Grazie mille per la tua risposta. Sembra fantastico che sia stato ottimizzato nella versione 2.14. Sto eseguendo la versione 2.12.2 e so che 2.12.3 è pronto per il download, ma dove posso trovare la versione 2.14?
EvanH,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.