Como reduzir o tamanho dos shapefiles quando os recursos são excluídos?

9

Este pequeno script exclui todos os recursos pequenos em todas as camadas. Isso funciona bem, mas o tamanho dos arquivos .shp não é reduzido. Por favor me diga o porquê...

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
fonte

Respostas:

14

Como a maneira mais rápida de excluir recursos de shapefiles é marcar registros com um sinalizador "excluído" na parte .dbf sem reescrever todas as partes .shp, .shx e .dbf. Isso também está documentado na página do driver GDAL shp http://www.gdal.org/drv_shapefile.html

O driver OGR shapefile suporta a reescrita de formas existentes em um shapefile, bem como a exclusão de formas. As formas excluídas são marcadas para exclusão no arquivo .dbf e depois ignoradas pelo OGR. Para removê-los permanentemente (resultando na renumeração de FIDs), chame o SQL 'REPACK' por meio do método ExecuteSQL () da fonte de dados.

user30184
fonte
11
Tecnicamente, o recurso "marcar como excluído" do dBase não é suportado pelos shapefiles; portanto, o GDAL está gerando shapefiles corrompidos quando faz isso.
Vince
Existe uma resposta antiga gis.stackexchange.com/questions/162615/… (talvez essa seja uma duplicata) em que descobri que o MapObjects da ESRI tinha um método delRecord (index) semelhante que não remove nada fisicamente. Talvez os programas ESRI cuidem melhor da execução do "pacote" antes de fechar os shapefiles, mas parece que eles também têm algum suporte para "marcar como excluído".
user30184
Executar um 'salvar como' na camada removerá os recursos excluídos.
SpatialSuccess
Eu não tenho essa grande experiência em QGIS e python. Como você chama o SQL 'REPACK'?
EvanH
5

Você deve verificar a versão do QGIS em que está vendo isso.

Eu sei que esse comportamento foi aprimorado na versão 2.14, para que, depois de chamar deleteFeatures, um shapefile seja reembalado para remover as sobras de linhas órfãs.

Você deve testar novamente com a versão 2.14 e verificar se há alguma melhoria.

ndawson
fonte
Muito obrigado pela sua resposta. Parece ótimo que ele foi ajustado na versão 2.14. Estou executando a versão 2.12.2 e sei que a 2.12.3 está pronta para download, mas onde posso encontrar a versão 2.14?
EvanH