Récupérer les attributs de toucher des points dans la couche de lignes à l'aide de QGIS?


12

J'utilise QGIS 2.14.4-Essen. J'ai deux couches:

  • points.shp qui contient des points avec une colonne YEAR
  • lines.shp qui contient des lignes qui relient exactement les points de points.shp

Je voudrais récupérer l'attribut YEAR de points.shp vers lines.shp. Chaque ligne est un segment unique avec un point à chaque extrémité (voir l'image ci-dessous). Ce que j'aimerais obtenir, c'est l'année du premier point et l'année du deuxième point dans chaque attribut de ligne.

Par exemple: la ligne 1 touche un premier point avec YEAR = 2010 et un deuxième point avec YEAR = 2011. Je voudrais remettre quelque chose comme «2010-2011» dans les attributs de la ligne 1. Le résultat devrait ressembler à ceci:

id  | points
----+-----------------
1   | 2010-2011
2   | 2011-2012
3   | 2012-2016

entrez la description de l'image ici

Existe-t-il un moyen d'y parvenir en utilisant QGIS?

Réponses:


9

Bien que la réponse @radouxju soit valide, je vais l'expliquer un peu plus en détail.

  1. Vous devez vous assurer que l'entité polyligne est divisée exactement au-dessus des emplacements des points.
  2. Utilisez Join attribute by location. Choisissez l'entité de la ligne de séparation aux emplacements des points comme couche cible - dans mon cas, je la nomme "explosée".
  3. Dans la section récapitulative, sélectionnez "Prendre un récapitulatif de la fonction d'intersection". Ici, au lieu d'exécuter l'outil deux fois; une pour Min et une autre pour Max, vous pouvez l'exécuter une fois et choisir Min et Max.

entrez la description de l'image ici

  1. Le fichier de sortie aura l'attribut suivant:

entrez la description de l'image ici

  1. Ajoutez un nouveau champ de type chaîne avec un nom "Année" au nouveau fichier de formes de l'étape 4.
  2. Utilisez la calculatrice de champs et allez mettre à jour le champ existant. Sélectionnez "Année" et écrivez l'expression suivante:

    to_string ("MINYEAR2") + '-' + to_string ("MAXYEAR2")

  3. L'attribut de sortie final ressemblera à ceci:

entrez la description de l'image ici

  1. La sortie finale sera comme ceci:

entrez la description de l'image ici


Voici la sortie après avoir testé vos données:

entrez la description de l'image ici

Le tableau de gauche est les données de point après avoir créé un nouveau champ de type entier, et le tableau de droite est après avoir rejoint la ligne avec les données de point en utilisant l'étape 2 mentionnée ci-dessus. J'ai ensuite utilisé les étapes 5 à 6 pour créer les données finales.

Mise à jour

J'ai essayé de convertir le champ YEAR de la chaîne en entier en utilisant l'expression to_int () et cela a fonctionné. Vous n'avez donc pas besoin de le faire manuellement. Cependant, le type de champ doit être de type Integernon Integer64. Assurez-vous que la longueur du champ est jusqu'à 9. Si vous avez choisi une longueur de champ de 10, elle sera convertie en Interger64et ne fonctionnera pas avec Interger64. Ensuite, vous pouvez suivre le processus de l'étape 2-6

Voici la sortie finale après avoir utilisé l'expression to_int ():

entrez la description de l'image ici

Dans le tableau d'attributs ci-dessus à gauche, YEAR est de type chaîne et YEAR2 est de type entier converti à l'aide de l'expression to_int (). Vous pouvez voir dans le tableau d'attributs à droite après avoir suivi les étapes 2 à 6, j'ai obtenu MINYEAR2 et MAXYEAR2, puis converti à nouveau en chaîne pour concaténer tout ensemble dans le champ YEAR.


Merci beaucoup! C'est exactement ce que j'ai fait plusieurs fois. Je suppose que les entités polylignes sont divisées exactement au-dessus des emplacements des points parce que j'ai créé les lignes à partir des couches de points à l'aide du plugin Points2One. Pouvez-vous essayer avec ce sous-ensemble de données: drive.google.com/file/d/0B7ZWEFkkfYgheG92Q29sa0I3LW8/view ? Merci encore!
wiltomap

Le champ YEAR de la table attributaire est de type chaîne. Vous devez ajouter un nouveau champ de type entier et saisir les années manuellement. Après avoir créé le champ de type entier et enregistré les modifications, supprimez l'ancien champ de chaîne. Ensuite, suivez le processus détaillé ci-dessus.
ahmadhanb

J'ai essayé de convertir le champ YEAR de la chaîne en entier en utilisant l'expression to_int (), mais cela n'a pas fonctionné non plus. Lorsque j'ai entré les années manuellement, cela a fonctionné comme prévu.
ahmadhanb

Explication claire @ahmadhanb
Shiko

Merci @ahmadhanb! Le fait est que les données que j'ai partagées ci-dessus sont un sous-ensemble. J'ai plusieurs milliers de lignes et de points, donc entrer des années manuellement sera beaucoup de travail! Est-ce un bug?
wiltomap

5

Lorsque vous joignez des points de jonction à une ligne, vous aurez plusieurs relations. Avec "join attribute by location", vous pourrez demander une méthode de résumé donnée. Dans votre cas, faites-le deux fois: une fois avec un minimum et une fois avec un maximum. Après cela, vous pouvez concaténer les deux champs dans un nouveau champ et vous vous retrouvez avec ce dont vous avez besoin.

entrez la description de l'image ici

Dans la calculatrice de terrain:

tostring(minYEAR) + '-' + tostring(maxYEAR)

Cette méthode renvoie une colonne supplémentaire nommée COUNTet contenant une valeur 2pour chaque ligne. Les options Min et Max renvoient ces informations. J'ai sélectionné le calque de lignes comme calque cible et le calque de points comme calque de jointure, ai-je raison?
wiltomap

votre champ d'année est-il numérique ou textuel?
radouxju

Le YEARchamp est entier. J'ai essayé de créer une nouvelle colonne avec to_string("YEAR")mais le résultat est exactement le même ...
wiltomap

J'ai fait un test rapide pour m'assurer (QGIS 2.8.3) et cela a fonctionné. Si votre compte est de 2, cela signifie que vous avez 2 points pour chaque segment, ce qui est correct. Mais avec moi, j'ai les valeurs d'attribut MINYEAR MAXYEAR dans le nouveau vecteur ligne créé par la jointure spatiale. Je ne comprends pas pourquoi cela ne fonctionne pas dans votre cas. Pourriez-vous essayer avec un autre fichier?
radouxju

4

En supposant que la topologie est parfaite, créer un champ 'WKT' avec l'expression

geom_to_wkt( $geometry) 

dans votre couche de points, vous pouvez utiliser l'expression:

min( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))||'-'|| max( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))

dans le calculateur de champ de la couche de tuyau, créant une chaîne de texte.

  • attribut (entité, nom_attribut) Renvoie la valeur d'un attribut spécifié à partir d'une entité, ici, l'année de l'entité ponctuelle
    obtenue.
  • get_feature (couche, attribut, valeur) renvoie la première fonction d'une couche correspondant à une valeur d'attribut donnée. Ici, nous vérifions si nous pouvons trouver un point avec les mêmes coordonnées (au format WKT) que
    celles des sommets de début et de fin de votre ligne.
  • start_point (geometry) renvoie le premier nœud d'une géométrie. Voici le premier sommet de votre ligne.
  • end_point (geometry) renvoie le dernier nœud d'une géométrie. Voici le dernier sommet de votre ligne.
  • geom_to_wkt (geometry) renvoie la représentation WKT (Well-Known Text) de la géométrie. entrez la description de l'image ici

Vous pouvez même le mettre à jour pour:

CASE
WHEN attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year') = attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year')
THEN attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year')
ELSE min( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))||'-'|| max( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))
END

afin d'afficher une seule année si deux points de la même année sont connectés (obtenir 200X au lieu de 200X-200X).

Le principal avantage de cette méthode est que si vos données changent dans vos points, vous pouvez les mettre à jour très rapidement avec une seule calculatrice de champ.
Vous pouvez même ajouter cette règle en tant que champ automatique lorsque vous créez de nouvelles lignes.
À votre santé,

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.