Copier des attributs d'une couche polygonale à une autre?

11

J'ai un problème que je n'arrive pas à comprendre. J'ai deux couches de polygones:

  • Polygone A - est un sous-ensemble du polygone B avec les mêmes champs et a des polygones identiques au polygone B
  • Polygone B - a les données d'attribut que je veux être dans le polygone A

Comment cela peut-il être fait? J'ai essayé l'outil QGIS "Join Attributes by Location" mais comme certains des polygones sont dans d'autres, il a tendance à se lier à la première intersection qu'il trouve (le polygone extérieur).

Diego R
la source
créer des centroïdes (points) du polygone A et joindre les attributs à B et exporter vers un nouveau fichier pour conserver les attributs de A.
Mapperz
3
@Mapperz Il s'agit d'une approche dangereuse, car elle peut produire des erreurs même si elle génère généralement une réponse probable. Si les polygones se chevauchent, tous les paris sont désactivés. Même lorsqu'il n'y a pas de chevauchement, il est possible que le centroïde d'un polygone se trouve dans un polygone différent (sans chevauchement). La correction ne peut être assurée en général que lorsque tous les polygones de A ne se chevauchent pas et sont convexes.
whuber
+1 @ Diego - votre question a conduit à une discussion / débat assez intéressant; un intéressant à cela!
Dano

Réponses:

9

@Dano soulève à juste titre certains problèmes qui doivent être résolus dans une réponse complète.

Une difficulté , déjà notée par @Celenius, est qu'une jointure entre B et A (dans les deux sens) duplique tous les champs; il peut être onéreux de corriger cela. J'ai suggéré dans les commentaires que la manière évidente et facile (exporter vers une feuille de calcul) soulève des questions d'intégrité des données. Une autre difficulté , déjà abordée par la proposition de Celenius, concerne la résolution de ce problème lorsqu'aucune combinaison d'attributs ne peut servir de clé pour A et B, car cela empêche une jointure de base de données. La jointure spatiale contourne ce problème.

Quelle est donc la bonne solution? Une approche utilise A pour identifier les enregistrements correspondants de B contenant les données souhaitées. En fonction d'hypothèses sur les configurations des polygones - qu'ils se chevauchent, que certains puissent en contenir d'autres, etc. - cela peut être effectué de différentes manières: en utilisant une couche pour sélectionner des objets dans l'autre, ou via des jointures. Le point ici est que tout ce que nous voulons faire à ce stade est de sélectionner le sous-ensemble de B correspondant à A.

Une fois cette sélection effectuée, exportez la sélection et laissez-la remplacer A. Terminé .

Cette solution suppose que tous les champs de B sont destinés à remplacer leurs homologues en A. Sinon, il est vraiment nécessaire d' effectuer une jointure 1-1 de B (source) vers A (destination). La jointure basée sur des identificateurs est la meilleure, mais la création d'une jointure sur l'identité de polygone (Celenius) fonctionne bien si les identifiants ne sont pas disponibles et qu'il n'y a aucune chance que les formes de polygone correspondantes dans A et B puissent différer, même légèrement . (Ceci est un point subtil, et la cause potentielle d'erreurs insidieuses, car les modifications précédentes dans B aux polygones qui ne correspondent pas à A pourraient toujours modifier de manière invisible les autres polygones dans B si le SIG "accroche" ou "maintient la topologie" ou autrement effectuer automatiquement des changements globaux lors des modifications locales.)

À ce stade, il existe deux copies de chaque champ: si [Foo] est un champ commun à A et B, alors la jointure contient A. [Foo] et B. [Foo]. À l'aide d'un calcul de champ , copiez B. [Foo] dans A. [Foo]. Répétez pour tous les champs nécessaires. Après cela, supprimez la jointure.

Bien que cette procédure puisse être un peu onéreuse lorsque de nombreux domaines sont impliqués, ses mérites incluent

  • Le script est simple et rapide.
  • Le scriptage laisse une piste d'audit documentant le traitement effectué sur les données. Ceci est crucial pour protéger l'intégrité des données.
  • Il se défend contre certains types d'erreurs de gros, comme la conservation du mauvais champ après la jointure (conservant ainsi les anciennes données au lieu des nouvelles données pour ce champ) ou la suppression d'un champ crucial.
  • Il tire parti des défenses intégrées offertes par le système de gestion de base de données, telles que l'application du type de données et l'application des règles métier, qui fonctionnent pour prévenir et identifier les erreurs et pour maintenir la cohérence entre toutes les tables et couches de la base de données.

Certains des principes directeurs impliqués dans cette suggestion sont

  1. Utilisez votre système de gestion de base de données pour traiter les données plutôt que d'utiliser un logiciel non conçu ou inadapté à cette tâche.
  2. Évitez de modifier les structures de base de données (telles que la suppression ou l'ajout de champs) lorsque les opérations ne le nécessitent pas absolument.
  3. Utilisez les capacités d'automatisation du logiciel pour simplifier le travail, le documenter et rendre les opérations reproductibles.

On pourrait objecter que dans de nombreux cas, il existe des moyens plus rapides et plus faciles d'atteindre le même résultat. Oui, il peut y en avoir, et ils peuvent être efficaces et ils fonctionnent généralement lorsqu'ils sont effectués avec soin. Mais les solutions qui risquent les données sont difficiles à recommander et à défendre en tant que réponses générales. Il est préférable de les utiliser dans des situations ponctuelles avec de petits ensembles de données où la corruption dans les données devrait rapidement devenir évidente et les conséquences de telles erreurs sont sans importance.

whuber
la source
+1 @ whuber - Il est évident que vous avez tenté de peser toutes les variables ici; une réponse bien pensée. Veuillez consulter l'ajout à ma réponse d'origine, car je manquerai d'espace dans cette zone de commentaires.
Dano
1
pour les gens qui se demandent ce qui est arrivé au "Celenius" a mentionné divers endroits dans ce fil: maintenant connu comme @djq, et sa réponse est ici . Félicitations à la machine de retour: web.archive.org/web/20120127210858/http://gis.stackexchange.com/…
matt wilkie
5

Dans Arcmap, vous pouvez joindre spatialement le polygone B au polygone A; cela relierait les attributs. Comme les noms de champs sont les mêmes, cela créera une nouvelle combinaison du nom.

djq
la source
C'est ce que je mettrais. À mes yeux, cette réponse courte est la bonne.
Simon
4

Exportez le tableau du fichier de formes "B" vers Excel et supprimez les colonnes redondantes et toutes les colonnes contenant des informations dont vous n'avez pas besoin. Assurez-vous de conserver votre colonne d'identifiant partagé, puis enregistrez-la dans le dossier approprié. Accédez à ArcMap, ajoutez la table, puis cliquez avec le bouton droit de la souris sur le fichier de formes "A" et effectuez une jointure de table . Le lien devrait mener à une vidéo expliquant comment procéder.


@ whuber - L'approche dans son ensemble est saine et garantit l'intégrité des données. La seule chose que je peux dire pour réfuter cette réponse, c'est que certaines situations / projets ne nous donnent pas le temps ou le budget pour être aussi méthodique dans notre approche.

Un exemple fidèle à la réalité:

Une Junior Mining Company est assise sur un gisement majeur avec des centaines de millions de dollars en injections de trésorerie reposant sur sa capacité à "prouver" la ressource. Un examen documentaire des publications et des cartes / données géologiques conduit à un programme de forage très ciblé et très coûteux. Lorsque les analyses reviennent de la première analyse, ces valeurs sont marquées à leurs emplacements de points respectifs via une jointure de table et pompées de nouveau dans un format Excel où les données sont minutieusement préparées pour l'importation dans DataMine (pour l'interpolation 3D de gisement).

D'après mon expérience , les géologues du projet ont exigé que ces données soient préparées dans Excel, qu'elles respectent CHAQUE règle / convention de formatage à la lettre (pas d'espaces, pas de caractères spéciaux, etc.) et que le fichier d'importation DataMine soit livré au format .csv (à l'époque de toute façon). Cela conduirait à davantage d'investissements dans des forages ciblés, et nous reverrions le processus (dans certains cas) plusieurs fois. Tout cela s'est généralement produit dans un délai extrêmement serré et critique.

Chacun de nous a sa propre histoire et notre propre éventail d'expériences que nous avons intégrées dans notre approche de la façon dont nous faisons les choses. Cela dit, mon expérience a vu Excel comme une nécessité absolue et un outil vital dans mes flux de travail; c'est ce que je sais. Nous avons pris toutes les précautions AQ / CQ lors de la préparation de ces données. Là où vous préférez éviter Excel, je n'ai pas eu d'autre choix que de l'utiliser.

Dano
la source
(-1) Utiliser Excel pour effectuer une jointure est non seulement plus difficile que de le réaliser avec un SIG ou un SGBDR, mais invite également à de graves erreurs.
whuber
8
Excel est simple, il fonctionne et à cause de cela, il est probablement responsable de plus d'erreurs non détectées et en gros que n'importe quel logiciel jamais produit. Il viole les principes de base des SGBD qui ont été développés pour protéger contre les erreurs qu'Excel rend trop faciles à commettre, telles que (1) trier certaines colonnes mais pas d'autres; (2) les erreurs typographiques qui modifient les types de données; (3) les frappes erronées qui effacent les données; (4) suppression accidentelle de lignes ou de colonnes; (5) conversion cachée de données, telles que du texte en dates; (6) troncature cachée des données; (7) l'arrondissement caché des valeurs numériques; et beaucoup plus.
whuber
2
cette réponse et le commentaire qui en résulte sont une merveilleuse illustration de la façon dont une «mauvaise» réponse peut invoquer de bons résultats, révélant des informations qui autrement ne seraient pas révélées. Ne vous sentez pas obligé de le supprimer pour éviter de "prendre un coup".
matt wilkie
3
... et pour compenser le succès, une GRANDE QUESTION serait de se demander pourquoi l'utilisation d'Excel pour traiter les données peut entraîner de très graves problèmes. Et comment l'utiliser en toute sécurité.
matt wilkie
1
(+1) Pour le montage réfléchi et bien décrit. @matt Consultez les discussions sur stats.stackexchange.com concernant Quelle serait une bonne façon de travailler avec un grand ensemble de données dans Excel? et Excel comme établi de statistiques .
whuber
1

À la fin des années 1990, nous avons reçu une mise à jour à grande échelle de tous nos plans d'eau et cours d'eau, couvrant environ 55 feuilles de carte du SNRC et un nombre de milliers d'éléments non mémorisés. Nous devions conserver les attributs à valeur ajoutée de notre ancienne hydrologie (noms des lacs, élévation de la surface, etc.) et remplacer la géométrie. La géométrie de l'ancien et du nouveau était suffisamment proche pour que nous puissions garantir que les centroïdes de chaque polygone seraient toujours délimités par les nouvelles limites du polygone - c'est un point important, sans cette certitude de base, l'approche ci-dessous n'est pas une bonne idée.

La solution dans ce cas particulier était au lieu d'apporter les attributs à la géométrie, apporter la géométrie aux attributs. Donc, conceptuellement:

  1. de * Layer_with_attributes *, supprimez les polygones mais conservez les enregistrements de table,
  2. de * Layer_with_polys * copier et coller la géométrie dans * Layer_with_attributes *
  3. fusionner et enregistrer.

Voir ici pour une description plus détaillée et une recette pour . Je ne suis pas sûr qu'il soit même possible dans Arcgis ou Qgis moderne de supprimer une géométrie sans supprimer simultanément son enregistrement d'attribut, mais bon, juste au cas où c'est le cas, voici l'idée.

Matt Wilkie
la source
1

Je ne suis pas sûr mais peut-être que certains SGBD effectuent des opérations d'égalité sur les champs Shape en SQL (?). Il me semble que si deux géométries sont identiques, l' =opérateur SQL doit retourner true ( WHERE A.Shape = B.Shape).

Si cela est vrai pour la base de données que vous utilisez, vous devriez pouvoir effectuer une jointure spatiale en utilisant la même syntaxe que pour une jointure non spatiale.


Il semble que la méthode ST_Equals (une norme OGC) pourrait être utilisée pour cela.

Kirk Kuykendall
la source
0

Comme d'habitude, Whuber a raison. Vous devez bien réfléchir à votre processus. Surtout s'il s'agit de grands ensembles de données et que cette opération sera entreprise plusieurs fois ou que les données sont essentielles à la mission.

Tenez compte de vos données et de vos responsabilités:

Qu'avez-vous fait?

Qu'est-ce que tu fais?

Que comptez-vous faire?

Et demandez toujours: pourquoi?


Maintenant, pour une réponse simple visant directement la question posée. Gardant à l'esprit qu'il y a toujours au moins 5 façons de faire les choses, mais généralement une seule meilleure façon.

En supposant que l'ensemble complet possède tous les attributs que vous souhaitez faire partie du sous-ensemble et que le sous-ensemble n'a rien qui ne se trouve pas déjà dans l'ensemble complet, sauf des informations obsolètes.

Deviner que la topologie du sous-ensemble correspond à l'ensemble (y compris l'origine / projection et la tolérance XY).

1) Utilisez Feature to Point avec la case "Inside" cochée et créez une classe d'entités points ou un fichier de formes à partir du sous-ensemble.

2) Utilisez une sélection par jointure spatiale pour rechercher tous les polygones dans l'ensemble complet qui correspondent au sous-ensemble en fonction de la classe d'entités ponctuelles ou du fichier de formes nouvellement créé.

3) Exportez la sélection à partir de l'ensemble complet, et cela peut être votre nouveau sous-ensemble.

user23715
la source
0

Sûrement, si le polygone A est un sous-ensemble du polygone B, l'approche la plus simple serait de parcourir le polygone A, utilisez l'ID qui se trouverait dans le polygone A (et B si A était un sous-ensemble ou B) pour rechercher les données de ligne dans Polygone B, puis mettez à jour la ligne dans le polygone A.

Poilu
la source