Comparer des lignes similaires et mettre à jour les calques

16

Ici, il y a deux couches avec la représentation des rues et l'idée est: Nous voulons mettre à jour la couche la plus récente (avec la ligne rouge) avec certaines des données stockées dans l'autre (le bleu clair), mais ces couches sont similaire dans la position géographique qui peut être très proche et un peu plus éloignée selon l'endroit sur la carte et un seul attribut correspond dans les cas où une ligne est la même dans l'autre (codlog x codlog5).

Couches Qgis.

Par exemple: Au milieu de l'image, il y a un carré dans les deux calques, mais comment faire sur la carte pour reconnaître le bleu est le même que le vert et mettre à jour le calque récent?

Comment puis-je le faire? Existe-t-il un plugin ou un outil qui vous aide?

Jhonatan Oliveira
la source
Vous souhaitez mettre à jour le calque rouge avec des attributs du calque bleu ou avec des fonctionnalités supplémentaires du calque bleu?
dmh126
Les attributs. Situation: la couche rouge contient les colonnes (a, b, c, d) et la bleue les colonnes (d, e, f). Je veux ajouter dans la couche rouge les colonnes (e, f) de l'autre couche et ses résultats qui correspondent.
Jhonatan Oliveira
Il y a de la documentation ici pour un plugin de configuration. Je ne sais pas si le développement est terminé.
Barbarossa
1
avez-vous essayé Jump?
radouxju
Mais la colonne "d" de la ligne bleue et le "d" de la ligne rouge sont un identifiant commun unique? Que contiennent-ils?
Sergio

Réponses:

6

C'est une excellente question, j'ai dû faire quelque chose de similaire récemment, mais avec un ensemble de données beaucoup plus petit, j'ai donc pu utiliser une simple intersection avec une vérification de qualité visuelle supplémentaire et c'était bien.

Mais voici une idée pour cela, même si je n'ai pas de code, et c'est une sorte de processus lourd. Effectuez d'abord un test avec un échantillon de l'ensemble de données complet. Vous pouvez probablement trouver du code utile ici. (L'indentation est devenue un peu bizarre ci-dessous.):

  1. prenez le bon ensemble de géométrie (où vous voulez que les attributs finissent) et créez-en un tampon *

  2. parcourir chacune des fonctionnalités du tampon:

    2a. calculer l'orientation générale de l'entité (max_y - min_y / max_x - min_x ou quelque chose comme ça)

    2b. faire une requête de sélection par emplacement sur l'autre couche en utilisant cette seule fonctionnalité

    1. vous aurez plus d'une fonctionnalité qui correspond à la requête de sélection par emplacement, alors parcourez ces fonctionnalités sélectionnées et calculez l'orientation de chacune

    2. obtenir les attributs de la fonction dont l'orientation est la plus proche de celle de la fonction tampon.

* Je commencerais par une très petite distance (une unité de carte ou quelque chose), puis exécuter ce processus avec des distances croissantes, en prenant soin de ne pas écraser les attributs que vous avez déjà transférés.

** Vous pourriez en fait renoncer à créer les fonctionnalités du tampon et simplement faire la requête de sélection par emplacement avec une distance de tampon. Je ne connais pas très bien QGIS, mais je suis sûr que vous pourriez le faire.

Il n'y a aucun moyen que cela fonctionne parfaitement pour toutes vos fonctionnalités, mais c'est un début, puis cela revient à développer une bonne stratégie QA / QC pour vérifier et terminer le transfert.

EDIT En y réfléchissant davantage, voici un exemple de base qui briserait complètement le système si vous débutiez avec une très petite distance de tampon et en choisissant la fonctionnalité avec l'orientation la mieux adaptée comme je l'ai recommandé:

entrez la description de l'image ici

Les attributs de la mauvaise ligne rouge seraient pris. Pour éviter cela, vous pouvez créer une sorte de tolérance et ne prendre les attributs de l'entité que si son orientation (par rapport à l'orientation de l'entité bleue d'origine) se situe dans cette tolérance.

EDIT 2 Oups, sont ces polygones? Je suppose que je viens de supposer qu'il s'agissait de lignes sur fond gris. S'ils sont des polygones, je ne sais pas vraiment si ce concept d'orientation est bon. Mais vous pouvez sélectionner toutes les entités qui se croisent et déterminer celle qui a le plus de chevauchement (exécutez un outil de type Union, puis utilisez le polygone avec la plus grande surface ...).

mr.adam
la source
Cette logique est solide. J'ai utilisé une approche similaire en C # / ArcObjects pour copier les attributs d'un ensemble de données inexact avec des attributs vers un ensemble de données précis sans attributs ... 95% correct. La vérification / la fixation manuelle était nécessaire dans les zones étroites mais c'était certainement plus rapide que de tout faire manuellement.
Michael Stimson
2

Si vous souhaitez ajouter des attributs du calque rouge au calque bleu et qu'un attribut est commun aux deux calques, vous devez utiliser Ajouter une jonction vectorielle .

J'ai écrit à ce sujet ici .

  1. Cliquez avec le bouton droit sur votre calque de fichier de formes rouge dans le panneau Calque et choisissez Propriétés .
  2. Ensuite, allez dans l' onglet Jointures .
  3. Appuyez sur le bouton + , cela créera une nouvelle jointure.
  4. La couche de jointure est votre couche de fichier de formes rouge. Le champ de jointure est un champ avec les valeurs communes aux deux. Le champ cible est le champ auquel vous souhaitez vous associer à partir de la couche bleue.
  5. Après cela, vous obtiendrez un nouvel attribut dans votre table de fichiers de formes.

C'est ça.

Voici un exemple avec des captures d'écran.

dmh126
la source
1

Je préfère de loin la réponse de @ dmh126 car sa méthode permet à votre couche red_line d'être mise à jour assez facilement.

Juste pour ajouter une alternative, vous pouvez utiliser l' outil de table des attributs de jointure de la boîte à outils de traitement et sélectionner vos couches avec le champ commun. Notez que cette méthode crée un nouveau fichier de formes au lieu de mettre à jour un fichier existant:

Rejoindre la table des attributs

Joseph
la source
0

Si vous avez un ID unique dans les deux couches que vous pouvez utiliser pour joindre facilement des valeurs à une nouvelle couche de l'ancienne, c'est un jeu d'enfant. Mais cela ne semble pas être le cas.

Sinon, c'est un problème assez difficile. Je me demande pourquoi le commentaire de user30184 suggérant d'utiliser OpenJUMP et le plugin http://www.vividsolutions.com/products.asp?catg=spaapp&code=roadmatcher n'a pas été publié à la place comme réponse car il me semble tout à fait légitime dans ce cas.

Sinon, je ne pense pas que vous puissiez le faire sans codage. Avec QGIS, vous pouvez utiliser la forme et lors de la combinaison de la mise en mémoire tampon et de l'intersection, vous devriez pouvoir effectuer une vérification automatique importante.

Une approche pourrait être de comparer un tampon raisonnablement grand de lignes rouges avec des lignes bleues et d'obtenir des attributs et un rapport de correspondance. En pseudo-code:

for r_line in red_lines:
  r_line_buf = r_line.buffer()
  intersecting_b_lines = []
  for b_line in blue_lines:
    if r_line_buf.intersects(b_line):
      intersect_length = calculateIntersectionLength(r_line_buf,b_line)
      b_line_values = getAttributes(b_line)
      intersecting_b_lines.append((b_line_values,intersect_length))
  b_line_best_fit = findLongestLineWithinIntersected(intersecting_b_lines)
  r_line_length = r_line.length
  b_vs_r_line_ratio = compareLength(r_line_length,b_line_best_fit)
  saveToNewColumns(r_line, b_line_best_fit.Atribute1, b_line_best_fit.Atribute2..., b_vs_r_line_ratio)
Miro
la source