Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Suite à un problème technique intervenu entre le 22 et le 23 mars, nous avons du procéder dans la soirée du 25 mars, à la restauration de la base de données du 24 mars (matinée).

En clair, nous avons perdu vos contributions et inscriptions du dimanche 24 et du lundi 25 mars.
Nous vous prions de nous excuser.

#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 smile

Hors ligne

 

#2 Wed 12 August 2020 15:01

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

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


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

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

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

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 ?


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

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: 3789

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 actif
Lieu: Giroussens
Date d'inscription: 14 Jan 2019
Messages: 148

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 actif
Lieu: Giroussens
Date d'inscription: 14 Jan 2019
Messages: 148

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

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

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 !


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

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: 987

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

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

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
    )
)

Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

geodata au cerema et petits billets en géomatique

Hors ligne

 

Pied de page des forums

Powered by FluxBB