Existe uma maneira rápida de limpar todos os atributos de uma camada, mas deixar os polígonos no lugar?

9

Eu tenho uma camada Shapefile no QGIS 2.6 com vários polígonos, cada um com dados em mais de 100 campos. Preciso criar uma nova camada com todos os mesmos polígonos, mas com todos os seus campos de dados em branco (definido como 0, Nulo ou vazio, dependendo do tipo de campo). Existe uma maneira mais rápida de fazer isso do que pressionar delete em cada campo de cada polígono, um de cada vez, eu teria que fazer isso mais de 1000 vezes dessa maneira.

alphabetasoup
fonte
11
Por favor editar a pergunta para incluir a versão do software GIS e o formato de dados (por exemplo, shapefile, FGDB, PostGIS, ..)
Vince

Respostas:

3

Você não pode simplesmente copiar e colar seus dados na Camada X (uma camada / shapefile / feature class / qualquer que seja) que não possua atributos (além de OID e Geometria) e depois copiar e colar a geometria agora "vazia" em sua camada original?

user23715
fonte
6

Você pode inserir o código a seguir no Python Console para limpar TODOS os atributos NULLde um shapefile carregado no QGIS. Selecione a camada no painel de camadas (Sumário) e execute o código:

layer = qgis.utils.iface.activeLayer()     
layer.startEditing()   
for field in layer.dataProvider().attributeIndexes():   
    for feature in layer.getFeatures(): 
        layer.changeAttributeValue(feature.id(), field, NULL)    

layer.commitChanges()        

Isso foi testado no QGIS 2.8.2.


ATUALIZAÇÃO :

Em resposta ao comentário de @Vince, o código a seguir pode ser copiado / colado diretamente no console do Python e alterará os valores dos atributos, dependendo do tipo de campo ( 0por exemplo, para campos inteiros ; NULLpara campos de string ; e uma época de 1900-01-01para um campo Data ):

layer = qgis.utils.iface.activeLayer()     
layer.startEditing()  
for field in layer.pendingFields():
        if field.typeName() == 'Integer':
                name_int = field.name()
                for feature in layer.getFeatures():
                        feature[name_int] = '0'
                        layer.updateFeature(feature)
        if field.typeName() == 'String':
                name_str = field.name()
                for feature in layer.getFeatures():
                        feature[name_str] = NULL
                        layer.updateFeature(feature)
        if field.typeName() == 'Date':
                name_dat = field.name()
                for feature in layer.getFeatures():
                        feature[name_dat] = '1900-01-01'
                        layer.updateFeature(feature)
layer.commitChanges()
Joseph
fonte
11
Você pode ajustar a lógica para atribuir zero a numéricos, em branco / NULL a seqüências de caracteres e a época a datas?
Vince
@Vince - Obrigado amigo, eu posso certamente tentar como eu não sou especialista nesta matéria :)
Joseph
@Vince - Obrigado novamente por mencionar o tweak, aconteceu de eu aprender mais sobre python =)
Joseph
11
Eu acho que meus shows idade quando penso em uma época de 01 de janeiro de 1970 ou 1900, não 2000;)
Vince
3

Você pode simplesmente salvá-lo como um novo arquivo e marque a caixa "Ignorar criação de atributo" na caixa de diálogo "Salvar como ...". Ele faz exatamente o que diz.

Haverá uma coluna de contador numérico chamada FID, aparentemente o formato Shapefile requer pelo menos um atributo? Se puder, use algo melhor, espacial ou geopacote.

bugmenot123
fonte
+1, você está certo, pois deve haver pelo menos um atributo. Mas este é um método muito agradável e simples, pois você pode executar a Calculadora de Campo e substituir todos os valores do FID por NULL.
Joseph
11
O comportamento do QGIS parece estranho. A coluna FID é editável e não é o mapeamento real entre geometria e atributos. Se você excluir a coluna, obterá um chamado "ID do recurso" que não é editável. Esse já deve ser o primeiro resultado. QGIS 2.10. Eu arquivarei um bug mais tarde.
bugmenot123
2

Abra o arquivo .dbf com o openoffice ou outros e remova os dados.
Você pode usar python para fazer um loop sobre os arquivos e remover todos, exceto os cabeçalhos. Consulte o módulo dbf python

julsbreakdown
fonte
11
O uso de ferramentas ignorantes de shapefile no componente de arquivo dBase provavelmente causará corrupção no arquivo de shapefile. Se o objetivo é preencher espaços em branco e zeros, "remover" os dados provavelmente produzirá apenas um arquivo dBase com menos registros que o arquivo .shp / .shx.
Vince
De fato, mas estamos simplesmente removendo os dados, não há nenhum risco.
julsbreakdown
Não, a tarefa é preservar polígonos e limpar os atributos correspondentes, portanto, o risco é muito alto. Qualquer resposta que não avise sobre uma potencial corrupção não leva o risco a sério.
Vince
Eu reconheço que é uma maneira difícil, isto é, não regular, mas funciona. Obviamente, é bem-vindo manter um backup dos dados originais.
Leehan 29/07
Nesse caso especial, o risco não é tão grande porque todos os atributos em todos os campos são inicializados. Portanto, se a ordem dos registros estiver mudando no arquivo dbf, ele ainda não fará bagunça porque todos os registros têm os mesmos dados nos atributos. O usuário ainda deve cuidar para que o número de recursos em .dbf seja o mesmo que em .shp. No entanto, como o @Vince escreveu, os usuários devem ser avisados ​​de que a) alterar a ordem das linhas de b) número de linhas no arquivo .dbf geralmente leva a um shapefile corrompido e inutilizável.
user30184
2

O QGIS pode abrir arquivos de forma sem o .dbf.

Portanto, você pode excluir o componente .dbf e carregar o .shp, o que trará apenas a geometria.

HeikkiVesanto
fonte
Isso é uma boa dica, embora eu, pessoalmente, abster-se-me a não apagar todos os arquivos associados :)
José
11
Sim, renomear pode ser uma opção mais segura.
HeikkiVesanto
2

Talvez você possa editar o arquivo * .dbf com o Excel.

Em seguida, você exclui todos os campos, exceto o geom.

Por fim, salve e saia.

Seria útil manter um arquivo do * .shp antes de fazer isso.

Leehan
fonte
O significado parece ser o de manter o esquema intacto, para que apenas os valores dos atributos sejam configurados com algum valor padrão. E você não pode salvar no formato dbf com o Excel.
user30184
2
O campo geometria não existe no componente dBase de um shapefile.
Vince
ali não há campo wkt ao editar o dbf com o excel.
Leehan 29/07
O campo FID vincula as linhas no .dbf à geometria, que é armazenada no .shp. Realmente, o .dbf não tem nada a ver com geometria. en.wikipedia.org/wiki/Shapefile
mr.adam
1

No QGIS 2.8.x, você também pode se livrar de campos específicos ou de todos os campos. Abra a tabela de atributos, alterne o modo de edição, clique no botão "Excluir coluna", selecione todos os seus atributos indesejados e clique em "OK". Salve as edições.

Cuitlahuac Hernandez-Santiago
fonte