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:
Bien que la réponse @radouxju soit valide, je vais l'expliquer un peu plus en détail.
Vous devez vous assurer que l'entité polyligne est divisée exactement au-dessus des emplacements des points.
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".
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.
Le fichier de sortie aura l'attribut suivant:
Ajoutez un nouveau champ de type chaîne avec un nom "Année" au nouveau fichier de formes de l'étape 4.
Utilisez la calculatrice de champs et allez mettre à jour le champ existant. Sélectionnez "Année" et écrivez l'expression suivante:
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 ():
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.
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:
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.
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é,
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.
Dans la calculatrice de terrain:
la source
COUNT
et contenant une valeur2
pour 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?YEAR
champ est entier. J'ai essayé de créer une nouvelle colonne avecto_string("YEAR")
mais le résultat est exactement le même ...En supposant que la topologie est parfaite, créer un champ 'WKT' avec l'expression
dans votre couche de points, vous pouvez utiliser l'expression:
dans le calculateur de champ de la couche de tuyau, créant une chaîne de texte.
obtenue.
celles des sommets de début et de fin de votre ligne.
Vous pouvez même le mettre à jour pour:
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é,
la source