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.