#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
Re: Trigger pour récupération nom voie
Salut,
Avec un schéma ce serait l'idéal pour t'aider
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 ) ; 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