Unindo dados do Excel para atribuir tabela no QGIS sem criar duplicatas?

15

Eu tenho uma tabela de atributos com dois campos vazios no QGIS.

Exemplo 1

Quero importar um banco de dados do Excel para preencher meus campos vazios no QGIS. Meu arquivo do Excel corresponde às colunas na minha tabela de atributos QGIS.

Exemplo_2

Sou capaz de associar corretamente meu excel (.CSV) ao meu shapefile. No entanto, o processo, em vez de preencher os campos em branco como desejo, criou duplicatas. Com a ajuda do «Table Manager», sou capaz de corrigir a situação, mas isso requer muito tempo. Estou procurando uma maneira mais eficiente de juntar meus dados do Excel.

Exemplo_3

Como posso associar meu arquivo do Excel à minha tabela de atributos sem criar duplicatas?

Laurent Robitaille-Lainesse
fonte
3
Dê uma olhada neste tutorial: Executando junções de tabelas
ArMoraer

Respostas:

13

Eu faria o seguinte para facilitar a vida:

Antes de fazer isso, faça um backup do seu shapefile.

  1. No seu shapefile, vá para as propriedades / campos da camada e ative o modo de edição.
  2. selecione todos os campos, exceto o campo ID
  3. Exclua todos os campos, exceto o campo ID
  4. adicione seu arquivo csv como uma camada no QGIS (menu principal / Camada / Adicionar camada / Adicionar camada de texto delimitada) insira a descrição da imagem aqui(escolha sem geometria)
  5. no seu shapefile, selecione propriedades / associações e escolha os dois campos de ID para origem e destino. Conforme descrito na outra resposta a esta pergunta.
  6. Salve seu Shapefile modificado.

insira a descrição da imagem aqui

esta é a guia Campo a que estou me referindo

insira a descrição da imagem aqui

Não se esqueça de alternar a edição antes e depois de excluir o campo desnecessário

RutgerH
fonte
13

Você deseja associar o arquivo do excel ao shapefile. Você os unirá em um atributo comum e o resultado será uma camada unida em que cada registro contém os atributos do arquivo shapefile e do arquivo excel.

Ok, primeiro você carrega seu arquivo excel e seu vetor posteriormente nas camadas. Usei alguns dados de teste que fiz, mas sua configuração deve ser semelhante à abaixo. insira a descrição da imagem aqui

Agora clique com o botão direito do mouse na camada (no painel Camadas) e escolha Propriedades e, em seguida, escolha Unir. Primeiro, pressione o sinal verde + no canto inferior esquerdo (Big Red Arrow na imagem abaixo) e ele exibirá um novo menu Adicionar vetor de junção (como abaixo) Aqui sua camada de junção será o arquivo excel (então escolha o arquivo excel adequado) & sheet) o campo de junção é o campo no arquivo do Excel que contém o atributo comum ao shapefile. O campo de destino é o campo correspondente no shapefile. (no meu caso, os dois campos comuns passaram a ter o nome de unidade, mas se o campo fosse chamado UNIT_ no shapefile, eu teria usado isso em vez de UNIT no meu campo de destino)
insira a descrição da imagem aqui Existem algumas outras opções com as quais você pode mexer na união, como se você quiser apenas ver determinados campos, etc ... de qualquer maneira, agora eles estão associados e se você voltar e olhar os atributos do arquivo shapefile, verá agora possui os atributos correspondentes do arquivo do Excel, como abaixo.

insira a descrição da imagem aqui

Aqui estão alguns tutoriais úteis para mostrar passo a passo como fazê-lo:

https://www.mapbox.com/tilemill/docs/guides/joining-data/

http://maps.cga.harvard.edu/qgis/wkshop/join_csv.php

http://qgis.spatialthoughts.com/2012/03/using-tabular-data-in-qgis.html

Como associar tabelas externas à tabela de atributos de um shapefile no QGIS?

http://www.digital-geography.com/qgis-tutorial-ii-how-to-join-data-with-shapefiles/#.Vs9vpmHXKUk

e o tutorial que o ArMoraer mencionou nos comentários.

ed.hank
fonte
Eu olhei para o tutorial mapbox.com/tilemill/docs/guides/joining-data que, a propósito, era muito útil. No entanto, ainda não consigo associar meu arquivo DBF ao meu shapefile. Isso me surpreende porque a estrutura da minha tabela combina perfeitamente. Parece-me que não entendi o «Campo de junção» e o «Campo de destino». Você poderia adicionar mais detalhes, por favor?
Laurent Robitaille-Lainesse
1
@Laurent Robitaille-Lainesse Atualizei meu post com um guia mais passo a passo. Associei um arquivo de teste excel a um shapefile de polígono apenas para garantir que meus passos estavam corretos.
ed.hank
Consegui juntar corretamente meu arquivo do Excel ao QGIS. Observo que a opção «join» adiciona um novo campo na tabela de atributos. Corrija-me se estiver errado, mas parece impossível adicionar os dados do meu arquivo do Excel ao campo vazio na minha tabela de atributos.
Laurent Robitaille-Lainesse
1
Se você tiver um campo em branco, use a calculadora de campos para preencher do campo recém-ingressado para o campo em sua tabela.
ed.hank
10

Apenas para adicionar outro método, você pode configurar uma macro do Project que, quando carregada:

  1. Une automaticamente seu shapefile ao seu csv
  2. Atualiza os campos IP1eIP2
  3. Remove os campos unidos, deixando apenas os campos do shapefile (ou seja, sem duplicados)

Primeiro, crie um projeto se você ainda não o fez e vá para a barra de ferramentas:

Projeto> Propriedades do Projeto ...> Macros

Em seguida, use o seguinte código na def openProject():função e insira os nomes das suas camadas e os campos que você deseja unir. Eu usei "Example" e "spreadsheet" para meus arquivos shapefile e csv respectivamente com o campo ID:

from PyQt4.QtCore import *
import qgis
from qgis.core import QgsMapLayerRegistry, QgsVectorJoinInfo

for layer in QgsMapLayerRegistry.instance().mapLayers().values():
    # Change to your shapefile name
    if layer.name() == "Example":
        qgis.utils.iface.setActiveLayer(layer)
        shp = qgis.utils.iface.activeLayer()

for layer in QgsMapLayerRegistry.instance().mapLayers().values():
    # Change to your csv name
    if layer.name() == "spreadsheet":
        qgis.utils.iface.setActiveLayer(layer)
        csv = qgis.utils.iface.activeLayer()

# Set up join parameters
shpField='ID'
csvField='ID'
joinObject = QgsVectorJoinInfo()
joinObject.joinLayerId = csv.id()
joinObject.joinFieldName = csvField
joinObject.targetFieldName = shpField
shp.addJoin(joinObject)

# Define fields to update and joined fields to copy values from
ip1 = shp.fieldNameIndex('IP1') 
ip1_join = shp.fieldNameIndex('spreadsheet_IP1')
ip2 = shp.fieldNameIndex('IP2') 
ip2_join = shp.fieldNameIndex('spreadsheet_IP2')

shp.startEditing()
for feat in shp.getFeatures():
    shp.changeAttributeValue(feat.id(), ip1, feat.attributes()[ip1_join])
    shp.changeAttributeValue(feat.id(), ip2, feat.attributes()[ip2_join])
shp.commitChanges()

# Remove join 
shp.removeJoin(csv.id())

Macro do projeto

Verifique se as camadas não estão unidas, salve o projeto e ative as macros acessando a barra de ferramentas:

Configurações> Geral> Ativar macros


Agora, quando você fecha o projeto e edita o arquivo csv, na próxima vez que carregar o projeto, os campos devem ser atualizados automaticamente:

Editando arquivo csv

Resultados

Joseph
fonte
7

Minha sugestão é usar o LibreOffice / Open Office de código aberto para editar seu arquivo do Excel e criar um arquivo .dbf. Eu preparei a pasta de trabalho de teste para você. Pasta de trabalho de teste - link

  1. Abrir arquivo no Libre Office / Open Office.
  2. Cole os dados da planilha "Excel" do seu arquivo Excel.
  3. Cole os dados da planilha "DBF" do seu arquivo .dbf (cole apenas ID, X, Y) (os valores IP1, IP2 serão adicionados automaticamente).
  4. Salve como arquivo name.dbf (em que nome é igual ao nome do arquivo de forma).

Tabela de resultados sem duplicatas no QGIS: insira a descrição da imagem aqui

Artec
fonte
5

Por que os campos vazios estão lá para começar? Você pode começar sem os campos vazios e apenas usar as duas colunas produzidas na junção? Eu acho que essa é a abordagem mais simples. Ou encontre uma ferramenta semelhante à ferramenta "Load" no ArcGIS.

https://desktop.arcgis.com/en/arcmap/latest/extensions/production-mapping/loading-data-into-a-geodatabase.htm

Se você não estiver usando um geodatabase, eu recomendo isso.

Stella
fonte
Não estou usando um geodatabase. Na verdade, eu não sou familiar com isso.
Laurent Robitaille-Lainesse 28/03
1
@ LaurentRobitaille-Lainesse Eu recomendo a criação de um novo geodatabase de arquivo e, em seguida, uma nova classe de recurso, e use isso para armazenar seus dados. Também recomendo fazer uma breve pesquisa sobre bancos de dados geográficos e classes de recursos e por que os usamos, o que eles oferecem além dos shapefiles.
Stella
4

Eu não sei se existe uma maneira direta de ingressar sem duplicado, já que o suporte a arquivos .shp é atribuído por .DBF (arquivo de banco de dados). Este DBF possui uma declaração do tipo de coluna como inteiro, real, string, etc., com detalhes de seu comprimento e precisão. O arquivo CSV possui apenas coluna normal sem nenhum tipo declarado. Não sei o tamanho do seu arquivo. Para mim, manterei os campos duplicados e, em seguida, usando o caluclator de campo com a fórmula geral:

Campo_x original = Campo_x duplicado

Em seguida, exclua todos os campos duplicados (por meio do QGIS ou do programa de banco de dados)

Uje Indo
fonte
3

Acredito que a maneira mais fácil de corrigir isso seria simplesmente excluir as duas colunas em questão na tabela QGIS antes da junção. Então, quando você ingressar no shapefile, as duas colunas desejadas não serão duplicadas e manterão seus nomes originais.

RHB
fonte