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

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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.