Joindre des données d'Excel à la table d'attributs dans QGIS sans créer de doublons?

15

J'ai une table attributaire avec deux champs vides dans QGIS.

Exemple 1

Je souhaite importer une base de données Excel pour remplir mes champs vides dans QGIS. Mon fichier Excel correspond aux colonnes de ma table d'attributs QGIS.

Exemple_2

Je suis en mesure de joindre correctement mon fichier Excel (.CSV) à mon fichier de formes. Cependant, le processus, au lieu de remplir les champs vides comme je le souhaite, a créé des doublons. Avec l'aide de «Table Manager», je suis en mesure de corriger la situation, mais cela demande beaucoup de temps. Je cherche un moyen plus efficace de joindre mes données Excel.

Exemple_3

Comment puis-je joindre mon fichier Excel à ma table d'attributs sans créer de doublons?

Laurent Robitaille-Lainesse
la source
3
Jetez un œil à ce tutoriel:
Réalisation

Réponses:

13

Je ferais les choses suivantes pour vous faciliter la vie:

Avant cela, effectuez une sauvegarde de votre fichier de formes.

  1. Dans votre fichier de formes, accédez aux propriétés / champs du calque et activez le mode édition.
  2. tout sélectionner sauf le champ ID
  3. Supprimer tous les champs sauf le champ ID
  4. ajoutez votre fichier csv en tant que couche dans QGIS (Menu principal / Couche / Ajouter une couche / Ajouter une couche de texte délimitée) entrez la description de l'image ici(choisissez aucune géométrie)
  5. dans votre fichier de formes, sélectionnez les propriétés / jointures et choisissez les deux champs ID pour la source et la cible. Comme décrit dans l'autre réponse à cette question.
  6. Enregistrez votre fichier Shapefile modifié.

entrez la description de l'image ici

c'est l'onglet Champ dont je parle

entrez la description de l'image ici

N'oubliez pas de basculer l'édition avant et après la suppression d'un champ inutile

RutgerH
la source
13

Vous voudrez joindre le fichier Excel au fichier de formes. Vous les joindrez sur un attribut commun et le résultat sera une couche jointe où chaque enregistrement contiendra les attributs du fichier de formes et du fichier Excel.

Ok, vous chargez d'abord votre fichier Excel et votre vecteur plus tard dans les couches. J'ai utilisé certaines données de test que j'ai faites, mais votre configuration devrait ressembler à ci-dessous. entrez la description de l'image ici

Maintenant, faites un clic droit sur le calque (dans le panneau des calques) et choisissez les propriétés, puis choisissez joindre. Appuyez d'abord sur le signe vert + en bas à gauche (grosse flèche rouge dans l'image ci-dessous) et cela fera apparaître un nouveau menu Ajouter un vecteur de jointure (comme ci-dessous) Ici, votre couche de jointure sera le fichier excel (choisissez donc le fichier excel approprié & feuille) le champ de jointure est le champ du fichier Excel qui contient l'attribut commun au fichier de formes. Le champ cible est le champ correspondant dans le fichier de formes. (dans mon cas, les deux champs communs se trouvaient être nommés unité, mais si le champ était appelé UNIT_ dans le fichier de formes, j'aurais utilisé cela au lieu de UNIT pour mon champ cible)
entrez la description de l'image ici Il y a quelques autres options avec lesquelles vous pouvez jouer avec la jointure, comme si vous ne souhaitez voir que certains champs, etc. il a maintenant les attributs correspondants du fichier Excel comme ci-dessous.

entrez la description de l'image ici

Voici quelques tutoriels pratiques pour vous montrer étape par étape comment le faire:

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

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

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

Comment joindre des tables externes avec la table attributaire d'un fichier de formes dans QGIS?

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

et le tutoriel ArMoraer mentionné dans les commentaires.

ed.hank
la source
J'ai regardé le tutoriel mapbox.com/tilemill/docs/guides/joining-data qui était d'ailleurs très utile. Cependant, je ne parviens toujours pas à joindre mon fichier DBF à mon fichier de formes. Cela me surprend car les deux structures de ma table correspondent parfaitement. Il me semble mal comprendre le «champ Join» et le «champ Target». Pourriez-vous ajouter plus de détails s'il vous plaît?
Laurent Robitaille-Lainesse
1
@Laurent Robitaille-Lainesse J'ai mis à jour mon message avec un guide plus détaillé. J'ai joint un fichier Excel de test à un fichier de formes polygonales juste pour m'assurer que mes étapes étaient correctes.
ed.hank
J'ai réussi à joindre correctement mon fichier Excel à QGIS. J'observe que l'option «join» ajoute un nouveau champ dans la table attributaire. Corrigez-moi si je me trompe, mais il semble impossible d'ajouter les données de mon fichier Excel au champ vide de ma table d'attributs.
Laurent Robitaille-Lainesse
1
Si vous avez un champ vide, vous utilisez la calculatrice de champ pour remplir le champ nouvellement joint au champ de votre table.
ed.hank
10

Juste pour ajouter une autre méthode, vous pouvez configurer une macro de projet qui, une fois chargée:

  1. Joint automatiquement votre fichier de formes à votre csv
  2. Met à jour les champs IP1etIP2
  3. Supprime les champs joints en ne laissant que les champs du fichier de formes (c.-à-d. Pas de doublons)

Créez d'abord un projet si vous ne l'avez pas déjà fait, puis accédez à la barre d'outils:

Projet> Propriétés du projet ...> Macros

Utilisez ensuite le code suivant dans la def openProject():fonction et entrez les noms de vos couches et les champs que vous souhaitez joindre. J'ai utilisé "Exemple" et "feuille de calcul" pour mon fichier shapefile et csv respectivement avec le champ 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 de projet

Assurez-vous que les calques ne sont pas joints, enregistrez le projet et activez les macros en allant dans la barre d'outils:

Paramètres> Général> Activer les macros


Maintenant, lorsque vous fermez le projet et modifiez le fichier csv, la prochaine fois que vous chargez le projet, les champs doivent être automatiquement mis à jour:

Modification du fichier csv

Résultats

Joseph
la source
7

Ma suggestion est d'utiliser l'open source LibreOffice / Open Office pour éditer votre fichier Excel et créer un fichier .dbf. J'ai préparé un cahier de test pour vous. Cahier de test - lien

  1. Ouvrir un fichier dans Libre Office / Open Office.
  2. Collez les données de la feuille «Excel» à partir de votre fichier Excel.
  3. Coller dans les données de feuille "DBF" de votre fichier .dbf (coller uniquement ID, X, Y) (les valeurs IP1, IP2 seront ajoutées automatiquement).
  4. Enregistrez en tant que fichier name.dbf (où le nom est le même que le nom de votre fichier de forme).

Tableau de résultats sans doublons dans QGIS: entrez la description de l'image ici

Artec
la source
5

Pourquoi les champs vides sont-ils là pour commencer? Pouvez-vous commencer sans les champs vides et utiliser simplement les deux colonnes produites dans la jointure? Je pense que c'est l'approche la plus simple. Soit cela, soit trouvez un outil similaire à l'outil "Charger" dans ArcGIS.

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

Si vous n'utilisez pas de géodatabase, je le recommande vivement.

Stella
la source
Je n'utilise pas de géodatabase. En fait, je n'en suis pas familier.
Laurent Robitaille-Lainesse
1
@ LaurentRobitaille-Lainesse Je recommande fortement de créer une nouvelle géodatabase fichier, puis une nouvelle classe d'entités au sein de celle-ci, et de l'utiliser pour stocker vos données. Je recommande également de faire de brèves recherches sur les géodatabases et les classes d'entités et pourquoi nous les utilisons, ce qu'elles offrent au-delà des fichiers de formes.
Stella
4

Je ne sais pas s'il existe un moyen direct de rejoindre sans doublon depuis la prise en charge de ce fichier .shp par attribut dans .DBF (fichier de base de données). Ce DBF a une déclaration de type de colonne comme entier, réel, chaîne, etc. avec des détails sur sa longueur et sa précision. Le fichier CSV n'a qu'une colonne normale sans aucun type déclaré. Je ne sais pas quelle est la taille de votre fichier. Pour moi, je garderai les champs en double puis j'utiliserai le caluclator de champ avec la formule générale:

Field_x d'origine = Field_x en double

Ensuite, supprimez tous ces champs dupliqués (via QGIS ou un programme de base de données)

Uje Indo
la source
3

Je crois que le moyen le plus simple de résoudre ce problème serait de simplement supprimer les deux colonnes en question dans la table QGIS avant la jointure. Ensuite, lorsque vous joignez le fichier de formes, les deux colonnes souhaitées ne seront pas des doublons et conserveront leurs noms de colonnes d'origine.

RHB
la source