Como editar facilmente os dados dos atributos usando expressões regulares?

30

Estou escrevendo um tutorial para alunos de mestrado que usam o QGIS. Uma das tarefas requer que os dados do atributo sejam modificados (consulte o rascunho em PDF do tutorial aqui, se estiver interessado).

A questão é como fazê-los editar os dados do atributo. Sei que essa pergunta já foi feita antes , e a resposta costumava ser simples: basta usar o LibreOffice calc para modificá-lo e salvá-lo, garantindo que a ordem das linhas e os títulos das colunas sejam os mesmos. Eu usei essa abordagem antes com grande efeito.

Infelizmente, a solução não funciona mais: salvar o arquivo .dbf, no LibreOffice (5.4.2) ou no OpenOffice (3.4.1) Calc embaralha os dados da perspectiva do QGIS (apenas números inteiros aleatórios aparecem na tabela de atributos) e cria um arquivo .dbt adicional.

Então, para chegar à pergunta: como posso instruir uma turma de estudantes de mestrado na próxima semana? Eu considerei as seguintes opções:

  1. Use R em vez disso (ótimo para mim, mas assustador para os alunos)
  2. Edite o arquivo como .csv e ingresse com base no carimbo de data / hora (ótimo, mas parece excessivamente complexo e poderá introduzir mais erros nas 2 horas práticas)
  3. Use um programa alternativo: tentei o Gnumeric e o Excel, nenhum dos quais gerou bons resultados rapidamente.

Para ajudar a responder a essa pergunta, criei um exemplo replicável . Abra o arquivo "points.shp" no QGIS, observe a tabela de atributos e feche. Edite algumas células na tabela de atributos "points.dbf" no LibreOffice - salve. Abra novamente "points.shp" no QGIS e observe a tabela de atributos codificados. Os outros shapefiles na pasta .zip já foram corrompidos pelo LibreOffice e OpenOffice para ilustrar como é o problema para mim.

Em suma, como melhor resolvo esse problema?

RobinLovelace
fonte
2
Bem-vindo ao site, gostaria de dizer que esta é uma pergunta muito bem feita, e espero que possamos resolver algumas boas soluções. Eu presumo que um pouco de python está fora de questão para esses alunos, como é que como eu iria abordar este problema, em primeiro lugar ...
sgrieve
13
A edição direta da parte .DBF de um shapefile é muito perigosa para o uso rotineiro e não deve ser usada por novatos - pelo menos se alguém se importa com os dados. No entanto, uma solução mais confiável de natureza semelhante está disponível: mantenha um campo identificador exclusivo no shapefile. Nunca edite. Em vez disso, mantenha os atributos em uma tabela relacionada (em qualquer formato que seu GIS possa ler), unida no mesmo identificador. Agora, em grande medida, você pode editar a tabela de atributos livremente sem perder a conexão entre forma e atributo - desde que proteja o campo identificador.
whuber
11
As soluções Python seriam boas, desde que sejam fáceis de implementar e entender ... Quanto a manter um número de identificador, é uma boa opção - (opção 2 na minha pergunta) e provavelmente a minha resposta padrão. No entanto, estava esperando por uma "solução rápida" mais simples que não envolve arquivos adicionais (5 por shapefile é o bastante IMO!)
RobinLovelace
3
Como assim, 5 por shapefile? Tente 9! :-) (Os arquivos de índice podem acumular-se, dependendo de qual GIS está sendo usado.) Depois que você precisar de mais de um arquivo relacionado para manter um conjunto de dados - e os shapefiles requerem um mínimo de três -, na verdade, não é um problema extra lançar arquivos adicionais. Adicione um arquivo de metadados também enquanto estiver nele. :-) E depois de configurar a associação, ela não ocorre automaticamente? (Eu não ver como o timestamp poderia ser usado para a junção, no entanto, que seria usado em vez de um sistema de controle de versão..)
whuber
3
Se você tem qualquer inclinação para apresentá-los aos bancos de dados, SpatiaLite tem uma interface gráfica para a edição de campo e ferramentas de linha de comando para os dados do OSM. Então você pode envolver um pouco de SQL e seus alunos provavelmente estariam muito à frente da curva.
Scro

Respostas:

18

Resposta mais simples que encontrei, com base nos conselhos de Ryan Garnett para fazê-lo no QGIS:

Use regexp_replace

Esse recurso foi adicionado à calculadora de campo há 1 ano por Jürgen Fischer (conforme ilustrado neste relatório de erro ). Tentei por um tempo descobrir como fazer isso, mas não procurei "qgis regex" e outros termos vagos.

Sua funcionalidade é provavelmente melhor ilustrada pela necessidade de padronizar todos os valores na coluna "nome". Por exemplo, se precisarmos substituir todas as células que contêm o padrão "Tesc" por 'Tesco', removendo informações supérfluas como "Tesco, Infirmary Road" (que os contribuidores do OSM freqüentemente adicionam), a seguinte função pode ser usada:

regexp_replace ("nome", 'Tesc. *', 'Tesco')

insira a descrição da imagem aqui

Eu acho que essa é uma funcionalidade de expressão regular Pythonic, pois é um pouco diferente do grep, que eu usei antes.

Acho que é necessária mais documentação (os detalhes no site do QGIS estão limitados a algumas palavras) sobre como isso funciona, então marquei as páginas a seguir para referência futura:

Esta solução tem algumas vantagens:

  1. Simples: não são necessários programas ou complementos extras
  2. Apresenta aos alunos o poder das expressões regulares, usando as funções (Pythonic?) (O "'" que representa o texto é interessante. Aviso: "ou nenhum símbolo falha)" e as funções da linha de comando.

Desculpas por responder à minha própria pergunta e muito obrigado a outros por me guiarem em direção à luz! Espero que esse segmento de perguntas seja de uso educacional para outras pessoas que enfrentam problemas semelhantes.

RobinLovelace
fonte
3
Não se preocupe, responder às suas próprias perguntas não é um problema.
Underdark
Fico feliz que você encontrou algo que irá ajudá-lo. Obrigado por compartilhar, eu sei que vou usar isso.
Ryan Garnett
11
Perguntei aos devs QGIS, é Qt regex qt-project.org/doc/qt-4.8/qregexp.html
wildintellect
9

Esta pode ser uma resposta idiota, pois pode ser um objetivo de aprendizado para os alunos de pós-graduação, mas há uma razão pela qual você não está editando os atributos no QGIS com o uso da Calculadora de Campo? Nas versões anteriores do QGIS (pré 1.7), a edição de atributos diretamente no QGIS não era possível; daí a necessidade de editar arquivos .DBF no OpenOffice etc.

A partir de 1.7 e 1.8, você pode editar os dados do atributo diretamente na Calculadora de Campo, com a capacidade de executar expressões condicionais. Também existem plug-ins de atributo Python disponíveis, que podem fornecer opções adicionais para edição de atributos. Esta pode ser uma solução e / ou uma opção para o seu tutorial.

Como um estudante de mestrado anterior e agora um funcionário da universidade, entendo esse problema, o requisito anterior para realizá-lo fora do QGIS, e agora aprecio a capacidade de executar todas as edições de atributo no QGIS. Eu ficaria feliz em ajudá-lo com isso mais, se você desejar.

Ryan Garnett
fonte
11
Oi Ryan, sim, essa seria a solução ideal. É a capacidade de pesquisar e substituir texto na tabela de atributos, de padronizar nomes desarrumados do OSM, o que me leva a tentar editar o arquivo .dbf diretamente. Prefiro editá-lo no QGIS. Experimente o plug-in Python Attribute - pode ser a solução ideal. Deveria ter tornado o fato de que estou procurando a capacidade de pesquisa / substituição de expressões regulares na pergunta.
precisa saber é o seguinte
@ user1694378 você ainda pode esclarecer sua dúvida.
Underdark
Obrigado underdark por me cutucar para fazer isso - reflete melhor o que eu realmente queria fazer.
precisa saber é o seguinte
3

Você pode usar a Base do LibreOffice para modificar seus arquivos dbf .

  1. Abrir Base (obter Menu Principal)
  2. Selecione "Conectar-se a um banco de dados existente" e selecione o tipo "dBASE".
  3. Selecione a pasta com seus arquivos dbf.
  4. Selecione as opções finais conforme desejado e "Concluir".
  5. Nomeie seu arquivo de conexão do banco de dados como desejar (por exemplo, "MyxBasefiles.odb) e salve-o em algum lugar. A partir de agora, acesse seus arquivos de banco de dados clicando neste arquivo.
  6. Selecione "Tabelas" no painel esquerdo e existem seus arquivos de dados (chamados "tabelas"). Mexa com eles.

Agora você pode começar a editá-los. Espero que isso seja bom o suficiente para seus propósitos.

Você também pode tentar o DBF Explorer, embora seja apenas para Windows. Ele tem pesquisa e substituição embora.

insira a descrição da imagem aqui

RK
fonte
11
Oi RK Obrigado pela resposta rápida: parece ser uma maneira confiável e segura de editar os arquivos .dbf. Acabei de experimentar o que você disse e tenho o prazer de dizer que funciona.
precisa saber é o seguinte
Bom saber. Boa lição que você tem aí. :)
RK
Mas ... Acabei de experimentar o que você disse e tenho o prazer de dizer que funciona para células individuais. Infelizmente, não é uma solução 100% para este aplicativo em particular, porque parece que o OOBase não possui a funcionalidade de substituição de pesquisa necessária para o tutorial devido a um [bug] ( lists.freedesktop.org/archives/libreoffice-bugs/2010 -Dezembro / ... ). Definitivamente trabalhou em células individuais: testado. Portanto, essa é uma solução de 90% para edição de célula por célula, a menos que eu tenha perdido a funcionalidade de substituição de pesquisa. Alguma idéia de como substituir todas as entradas "Tesc. *" Por "Tesco", por exemplo?
precisa saber é o seguinte
Melhor link para o bug do OO Base: bugs.freedesktop.org/show_bug.cgi?id=32506
RobinLovelace 8/12
Atualizei minha resposta.
RK