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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Thu 27 July 2017 15:46

ndonnet
Juste Inscrit !
Date d'inscription: 19 Mar 2015
Messages: 8

Trigger pour récupération nom voie

Bonjour,

Je débute avec les trigger et j'aurai besoin de petits conseils pour parvenir à mes fins.
Dans le cadre de la mise en place d'un règlement de voirie, on souhaite connaître et suivre les travaux de voirie réalisés sur la commune. (Il s'agit d'une entité de type ligne). Afin de faciliter la saisie, j'ai mis en place un trigger.
Le trigger me permet de calculer la longueur des travaux, la durée durant laquelle il est interdit de réaliser des travaux sur le secteur ainsi que la récupération du nom de la voie de manière automatique.
C'est sur ce dernier point où je bloque quelque peu. Le nom de la voie remonte par intersection avec le linéaire de voie. Cependant lorsque les travaux se terminent à une intersection de voie, le nom de la voie qui remonte par l'intermédiaire du trigger est alors aléatoire :
    Cela peut être le nom de la voie sur laquelle a lieu les travaux et tout va bien.
     Ou le nom de l'autre voie située à l'intersection

J'ignore la requête à indiquer pour ce cas de figure...
J'avais dans l'idée un calcul de longueur et de récupérer le nom de la voie correspondant à la longueur la plus longue.
(Cela me semble compliqué à mettre en place!)

J'espère que mes explications sont suffisamment explicites.

Merci d'avance pour votre aide

Hors ligne

 

#2 Thu 27 July 2017 21:07

Loic_GR
Moderateur
Lieu: Besancon
Date d'inscription: 12 May 2011
Messages: 1024
Site web

Re: Trigger pour récupération nom voie

Salut,

Avec un schéma ce serait l'idéal pour t'aider smile


Freelance traitements ETL FME certifié: www.sitdi-france.fr Twitter : @sitdifrance
Site perso ~ www.partir-en-vtt.com

Hors ligne

 

#3 Thu 03 August 2017 11:59

ndonnet
Juste Inscrit !
Date d'inscription: 19 Mar 2015
Messages: 8

Re: Trigger pour récupération nom voie

Merci pour ce début d'aide! : )

Je vient compléter mon explication en espérant que ce soit plus compréhensible!
Globalement, après m'être de nouveau penchée sur la question, le trigger ne permet pas de gérer plusieurs intersections. Je ne sais pas comment aborder cette question

Voici un petit schéma : ) plutôt  une capture d'écran illustrant mes propos :
[img]http://imageshack.com/a/img923/434/rTXoz9.jpg[/img]

En plus voici le code très simple du trigger permettant de mettre à jour le nom de la voie :
       NEW.nom_voie = nom_voie_g from voirie.troncon  where st_intersects(new.geom,geom);

Est-ce plus clair?

Merci d'avance,

Hors ligne

 

#4 Thu 03 August 2017 14:05

JP LLORENS
Participant assidu
Date d'inscription: 12 Nov 2008
Messages: 231

Re: Trigger pour récupération nom voie

Bonjour.

Peut être en essayant de transformer votre ligne de travaux en un point (st_pointonsurface(st_buffer(geom, 0.5) et intersectant ce point ou un buffer de ce point avec votre voirie
Cordialement
JP

Dernière modification par JP LLORENS (Thu 03 August 2017 14:06)

Hors ligne

 

#5 Fri 04 August 2017 16:00

ndonnet
Juste Inscrit !
Date d'inscription: 19 Mar 2015
Messages: 8

Re: Trigger pour récupération nom voie

Bonjour,

Merci pour votre réponse.
J'ai modifié le trigger en intégrant votre proposition, mais cela n'aboutit pas.

Est-il possible de pouvoir une requête permettant de récupérer le nom de voie intersectant le début de la ligne?

Hors ligne

 

#6 Fri 04 August 2017 16:21

meonais
Participant occasionnel
Date d'inscription: 17 Jan 2017
Messages: 35

Re: Trigger pour récupération nom voie

Bonjour,

rapidement, des idées en vrac si vos lignes de travaux croisent plusieurs noms de voie...
- en utilisant st_within ou st_contains ?
- ou st_dwithin et le centroïde de votre ligne de travaux ?
- ou en transformant vos lignes de travaux en séries de point (merci à Nicolas Ribot qui m'a distillé son "obsession" je crois smile ) ; joindre les noms de rue aux points par intersection ; identifier le bon nom de rue en comparant le nombre de points avec tel et tel nom (nb de point nom1 > nb de point nom2) par identifiant de tracé travaux

Hors ligne

 

#7 Fri 04 August 2017 18:05

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: Trigger pour récupération nom voie

Bonsoir,

Le problème est dans votre formulation: "récupérer LE nom de la voie". Des travaux ne concernent qu'une voie ?

Si les travaux sont définis comme "une zone concernant une ou plusieurs voies" et sont numérisés sous la forme d'une linestring, vous pouvez calculer le buffer de cette linestring de travaux (par ex avec une largeur moyenne de rue) et regarder les intersections entre ces rues et le buffer:
Vous pouvez alors garder la rue qui intersecte le plus (en proportion de sa longueur par exemple) cette zone de travaux, ou encore garder une liste des rues concernées (plus de X % de leur longueur en travaux)

Nicolas

Hors ligne

 

#8 Fri 18 August 2017 10:50

ndonnet
Juste Inscrit !
Date d'inscription: 19 Mar 2015
Messages: 8

Re: Trigger pour récupération nom voie

Bonjour,

La problématique est bien de récupérer LE nom de la voie.
Sur les 2 solutions proposées que vous m'avez proposé (qui ont l'air très bien), j'ai bien compris le principe. Mais dans la pratique, je ne sais pas du tout comment procéder particulièrement sur a dernière étape de chaque solution :
                 Solution 1:  Identification du nom de rue avec le plus grand nombre de points
                 Solution 2:   Identification du nom de rue avec la longueur la plus importante

Hors ligne

 

#9 Fri 18 August 2017 12:06

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: Trigger pour récupération nom voie

Bonjour,

Une approche basée sur la comparaison entre l'intersection des travaux (linestring) et les buffers des rues (a 10m par ex, polygon):
Il faut calculer le buffer des routes (avec bouts carrés aux extrémités des routes) puis la longueur de son intersection avec les travaux.
On peut alors classer, pour chaque "travaux", les rues dont le buffer intersecte le plus les travaux.
Pour ca, les windows functions (https://www.postgresql.org/docs/9.6/sta … indow.html) sont vraiment très puissantes !

Code:

with tmp as (
    SELECT
      t.id  AS txid,
      tr.id AS tronid,
      tr.nom_voie_g,
      row_number()
      OVER (
        PARTITION BY t.id
        ORDER BY st_length(st_intersection(st_buffer(tr.geom, 10, 'endcap=flat'), t.geom)) DESC ) AS rn
    FROM travaux t
      JOIN troncon tr ON t.geom && tr.geom
) select txid, nom_voie_g
from tmp t
where rn = 1;

Nicolas

Hors ligne

 

Pied de page des forums

Powered by FluxBB