#1 Thu 04 June 2020 19:30
- jiptwo19
- Participant actif
- Lieu: drummondville, québec
- Date d'inscription: 3 Jan 2019
- Messages: 56
postgresql/postgis intersection
bonjour
en passant ...je commence dans postgresql et postgis ....
veuillez détaillé vos réponses svp
Voila mon problème
j'ai présentement 2 tables ..
1ere table ... geométrie de point et elle s'appel termial
et voici les colonnes
gid, Nombloc, Calque, Rotate, datetime, Stat_tronc, Notroncon, Status, geom
2eme table ... géométrie avec polyline elle s'appel troncons
et voici les colonnes
gid, NoTroncon, fo, T_Partiel, No_Touret, T_Reel, Status, geom
j'aimerais dans ma table terminal ..
la colonne Stat_tronc ... prend la valeur status de la table troncons que les geométries ce touche ou .. près de 0.5mètres
aussi la colonne NoTroncon, prend la ou les valeurs NoTroncon de la table troncons que les géométries ce touche ou .. près de 0.5mètres
J'ai mis près de 0.5mètres .. car je ne sais pas si il y a dans postgis une relation par distance ou les 2 avec intersection
j'attends de vos nouvelles
merci!
Hors ligne
#2 Thu 04 June 2020 21:37
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: postgresql/postgis intersection
Bonsoir,
Oui, PostGIS dispose d'une fonction pour tester ce que vous voulez: st_dwithin(geoma, geomb, distance). (https://postgis.net/docs/manual-3.0/ST_DWithin.html)
Renvoie vrai si geoma et geomb sont distantes de "distance" ou moins.
Vous pouvez faire une jointure spatiale entre vos deux tables avec cette fonction.
Comme vous le dites, il peut y avoir plusieurs tronçons proches d'un terminal: les colonnes stat_tronc et notroncon devraient etre de type array, (tableau de meme type que les colonnes troncons.status et troncons.notroncon).
Pour utiliser au mieux postgis, créez des index spatiaux sur les colonnes geometry des deux tables si ce n'est pas deja fait (et lancez un analyze <table> apres la création des index).
En SQL, en select d'abord pour vérifier que ca marche:
Code:
select te.gid, array_agg(tr.status) as stat_tronc, array_agg(tr.notroncon) as notroncon from terminal te join troncons tr on st_dwithin(te.geom, tr.geom, 0.5) group by te.gid;
Vous pouvez alors transformer cela en update, par ex en utilisant une CTE (common table expression): WITH tmp as (...) update terminal t ...
Nicolas
Hors ligne