Annonce
Pour sa 21ème année, l’association GeoRezo a toujours besoin de vous !
10€ = 1 mois de frais bancaires ; 15€ = 12 mois de nom de domaine ; 30€ = 1 semaine de location des serveurs …
Retrouver nos membres bienfaiteurs
Pages: 1
- Sujet précédent - QGIS: Donner le nom de la rue associe a mes canalisations - Sujet suivant
#1 Wed 05 August 2020 14:32
- HugoSo
- Participant occasionnel
- Date d'inscription: 3 Feb 2020
- Messages: 15
QGIS: Donner le nom de la rue associe a mes canalisations
Bonjour à tous,
J'ai recherché sur le forum un moyen d’intégrer le nom de mes rues (polyligne) avec mes canalisations (polyligne) mais sans succès, c'est pourquoi je me permet de vous poser la question.
Ma polylignes route est souvent située à proximité de mes canalisations. Ces deux couches se croisent ou sont à proximité (canalisation sous la route). J'aimerai effectuer une jointure de ma couche canalisation afin de récupérer les nom de route associés (si il n'y a pas de route, alors valeur NULL).
Comment procéder pour être précis ? Rastériser ma couche route et si ma couche canalisation passe par un pixel, récupérer la valeur associée? Est-ce possible?
Creer une sorte de buffer autour de mes routes et prendre la valeur associé lorsque ma canalisation intersect avec le buffer?
J'avoue être assez limité pour finaliser cette problématique..
Merci d'avance pour vos réponses
Hors ligne
#2 Wed 12 August 2020 15:01
Re: QGIS: Donner le nom de la rue associe a mes canalisations
Bonjour,
- Créer une couche Lignes1 avec une ligne
- Créer une couche Lignes 2 avec deux lignes dont une plus proche de Lignes1
- Créer un champ virtuel sur Lignes1 'nearest_ligne' avec l'expression suivante
Code:
with_variable( 'distances', array_foreach( generate_series(1, aggregate('lignes2', 'count', fid)), distance($geometry, geometry(get_feature_by_id('lignes2', @element)))), array_find(@distances, array_sort(@distances)[0]) + 1 )
Cela récupérera l'index de l'objet qui est le plus proche dans lignes2
On peut alors utiliser
Code:
attribute(get_feature_by_id('lignes2', <the_index), 'libelle')
pour récupérer un attribut
Le projet en PJ contient données et projet d'exemple
geodata au cerema et petits billets en géomatique
Hors ligne
#3 Wed 12 August 2020 16:31
- Axel S
- Participant occasionnel
- Date d'inscription: 23 Apr 2019
- Messages: 18
Re: QGIS: Donner le nom de la rue associe a mes canalisations
J'avais eu des erreurs en effectuant une étude du plus proche entre les polylignes canalisations et les polylignes des rues notamment au niveau des intersections de rues et ronds-points.
J'avais eu un meilleur résultat avec une couche ponctuelle des rues, en intégrant l'attribut NomRue du point le plus proche du tronçon de canalisation
Hors ligne
#4 Thu 13 August 2020 11:51
Re: QGIS: Donner le nom de la rue associe a mes canalisations
J'ai fait un projet avec de nouvelles expressions en PJ, avec données d'exemple
Solution 1
Voici une expression qui récupère en tableau la distance vers chacun des noeuds d'une ligne, ici la première ligne.
Cela utilise point_n, num_points
Code:
with_variable( 'nodes', nodes_to_points(geometry(get_feature_by_id('lignes2', 1))), array_foreach( generate_series(1, num_points(@nodes)), distance(point_n(@nodes, @element), $geometry) ) )
> Renvoie
Code:
[ 0.025810520619384398, 0.025361285935177422, 0.0241702017… ]
Par contre, je ne sais pas comment on réalise un agrégat d'un tableau (array) : on pourrait vouloir récupérer la valeur moyenne des distances..Cela serait bien utile !..
Solution 2
Du coup, j'ai tenté cette expression avec un nombre fixe de points interpolé de 3 (selon la méthode de Axel S).
Cela utilise interpolate_point
Code:
with_variable( 'mean_distances', aggregate( 'lignes2', 'array_agg', with_variable( -- on récupère la géométrie de la ligne cible à comparer 'feat', geometry(@parent), with_variable( 'distances', array_foreach( generate_series(0, length(@feat), length(@feat)/3), distance($geometry, line_interpolate_point(@feat, @element))), -- moyenne des distances (@distances[1] + @distances[2] + @distances[3])/3 ) ) ), -- on récupère l'index de la distance minimale array_find(@mean_distances, array_first(array_sort(@mean_distances))) + 1 )
Update de la solution du haut
En aparté, en remplacement de l'expression du post du haut, voici une expression qui utilise array_sort, array_first et qui semble plus élégante :
Code:
with_variable( -- créer tableau de valeurs de distances 'distances', aggregate('lignes2', 'array_agg', distance(geometry(@parent), $geometry)), with_variable( -- valeur minimale de distance 'min_distance', array_first(array_sort(@distances)), -- premier élément du tableau ordonné -- trouver l'index de la valeur minimale array_find(@distances, @min_distance) + 1 ) )
Tout est dans le projet en PJ
Je vais voir si je peux trouver des infos sur les agrégats de types Array pour calculer des sommes de tableaux, ou moyennes
@Santanna, @JD, avez-vous des infos là-dessus ?
geodata au cerema et petits billets en géomatique
Hors ligne
#5 Thu 13 August 2020 12:16
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3948
Re: QGIS: Donner le nom de la rue associe a mes canalisations
Bonjour,
@MathieuR, l'extension ArrayPlus propose, entre autres fonctions sympa, array_avg qui calcule la moyenne d'un array
Hors ligne
#6 Thu 13 August 2020 12:53
- Julien81
- Participant assidu
- Lieu: Giroussens
- Date d'inscription: 14 Jan 2019
- Messages: 181
Re: QGIS: Donner le nom de la rue associe a mes canalisations
Bonjour,
ca me parle et j'avais trouvé cela :https://jbdesbas.wordpress.com/2018/06/ … tes-array/
pour des regroupements, calculs à la parcelle d'entités intersectantes dans mon cas. On peut bien obtenir depuis la calculatrice d'expression ce dont vous avez besoin à mon sens.
En installant le plugin arrayPlus on va récupérer une/des fonction/s permettant de sommer les valeurs d'un tableau et de récupérer le nombre d'occurrences,... avec array_sum(expression_tableau)/array_length(expression_tableau), on retrouve le résultat escompté. Enfin je pense que le lien et le plugin arrayPlus doivent vous permettre d'arriver à vos fins.
Cordialement
Hors ligne
#7 Thu 13 August 2020 12:57
- Julien81
- Participant assidu
- Lieu: Giroussens
- Date d'inscription: 14 Jan 2019
- Messages: 181
Re: QGIS: Donner le nom de la rue associe a mes canalisations
Oups doublon entre temps, du coup désolé!
En plus il y a array_avg.
Hors ligne
#8 Mon 17 August 2020 10:18
Re: QGIS: Donner le nom de la rue associe a mes canalisations
Bonjour,
Voici le projet qgis avec la nouvelle expression utilisation array_avg avec distance moyenne aux noeuds des lignes cibles
Créer un champ nearest_with_nodes avec expression :
Code:
with_variable( 'distances', aggregate( 'lignes2', 'array_agg', array_avg( with_variable( 'nodes', nodes_to_points(geometry(@parent)), array_foreach( generate_series(1, num_points(@nodes)), distance(point_n(@nodes, @element), $geometry) ) ) ) ), array_find(@distances, array_first(array_sort(@distances))) + 1 )
Dans les paramètres d'étiquettes, utiliser l'expression suivante pour afficher un champ de la ligne de ligne la plus proche, par exemple lib
Code:
attribute(get_feature_by_id('lignes2', nearest_with_nodes), 'lib')
Projet reproductible en PJ !
geodata au cerema et petits billets en géomatique
Hors ligne
#9 Tue 18 August 2020 09:04
- GlaDal
- Participant assidu
- Date d'inscription: 30 Aug 2013
- Messages: 1110
Re: QGIS: Donner le nom de la rue associe a mes canalisations
Bonjour à tous,
Ca me rappelle un post que j'ai lu il y a pas longtemps qui est dans la même veine et fort instructeur :
https://pigrecoinfinito.com/2020/03/02/ … trofedica/
Hors ligne
#10 Tue 18 August 2020 10:07
Re: QGIS: Donner le nom de la rue associe a mes canalisations
Du coup, voici la méthode utilisant l'interpolation, cad on place des noeuds sur la ligne.
La méthode d'avant n'utilisait que les noeuds constitutifs de la ligne et pourrait être moins précise.
Pour cette seconde méthode, j'ai choisi d'utiliser un multiplicateur @mult avec lequel multiplier le nb de noeuds de la ligne cible à comparer @feat
Code:
num_points(@feat) * @mult
Si la ligne fait 3 noeuds, soit 2 tronçons, cela génèrera 30 points également répartis.
Voici l'expression finale et le projet QGIS associé
Code:
with_variable( 'mult', 10, -- multiplicateur pour les noeuds. Si ligne simple (2 noeuds), génèrera 20 noeuds vers lesquels calculer la distance with_variable( 'mean_distances', aggregate( 'lignes2', 'array_agg', with_variable( -- on récupère la géométrie de la ligne cible à comparer 'feat', geometry(@parent), with_variable( 'distances', array_foreach( generate_series(0, length(@feat), length(@feat)/(num_points(@feat) * @mult)), distance($geometry, line_interpolate_point(@feat, @element))), -- moyenne des distances array_avg(@distances) ) ) ), -- on récupère l'index de la distance min array_find(@mean_distances, array_first(array_sort(@mean_distances))) + 1 ) )
geodata au cerema et petits billets en géomatique
Hors ligne
Pages: 1
- Sujet précédent - QGIS: Donner le nom de la rue associe a mes canalisations - Sujet suivant