#1 Thu 07 November 2013 15:28
- Thomas Williamson
- Participant actif
- Lieu: Poitiers
- Date d'inscription: 16 Nov 2008
- Messages: 92
Jointure spatiale avec buffer
Bonjour,
J'ai les tables suivantes :
- point (gid serial, codePoint varchar(10), geom geometry(Point))
- ligne (gid serial, codeLine varchar(10), geom geometry(MultiLineString))
La colonne codePoint est vide et la colonne codeLine est renseignée.
Mon objectif est de renseigner la colonne codePoint avec les valeurs de la colonne codeLine de la manière suivante : un point prend la valeur d'une ligne dès qu'elle se trouve dans un rayon de 100m autour de ce point. Le principe est donc de récupérer une valeur d'attribut par jointure spatiale en faisant appel à un buffer.
J'en suis là :
Code:
UPDATE point SET codePoint = codeLine FROM point, ligne WHERE st_intersects(st_buffer(point.geom, 100), ligne.geom) returning point.* ;
Problème : la colonne codePoint se met bien à jour mais avec la même valeur codeLine partout !
Merci pour votre aide !
Thomas
Dernière modification par Thomas Williamson (Thu 07 November 2013 16:11)
Hors ligne
#2 Thu 07 November 2013 16:09
- Thomas Williamson
- Participant actif
- Lieu: Poitiers
- Date d'inscription: 16 Nov 2008
- Messages: 92
Re: Jointure spatiale avec buffer
Bonjour Thomas, voici la réponse à ta question
Bon, j'ai creusé le sujet et j'ai trouvé que je m'étais un peu trop compliqué la vie :
Code:
UPDATE point SET codePoint = codeLine FROM ligne WHERE st_intersects(st_buffer(point.geom, 100), ligne.geom) ;
...et voilà ! J'espère que ça pourra resservir à d'autres.
Thomas
Dernière modification par Thomas Williamson (Thu 07 November 2013 16:10)
Hors ligne
#3 Thu 07 November 2013 16:16
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Jointure spatiale avec buffer
Bonjour,
Pouvez vous préciser ce que vous voulez obtenir ?
Si plusieurs lignes sont dans un rayon de 100m d'un point, laquelle choisir ? la plus proche ?
Le buffer/intersection n'est pas utile dans votre cas: il existe l'opérateur st_dwithin pour cela: bcp plus rapide.
En considérant que vous voulez la ligne la plus proche d'un point en cas de resultats multiples, vous pouvez chercher toutes les lignes plus proche de 100m des points, et les ordonner par distance croissante, puis ne garder que le premier codeLine pour chaque point trouvé (il y a plusieurs methodes pour faire ca: windows functions, distinct on, etc.):
Code:
with dist as ( select p.gid, l.codeLine, st_distance(l.geom, p.geom) from ligne l, point p where st_dwithin(l.geom, p.geom, 100) order by 1, 3 ), closest as ( select distinct on (gid) gid, codeline from dist ) UPDATE point SET codePoint = codeLine FROM closest where point.gid = close.gid;
Nicolas
Hors ligne
#4 Thu 07 November 2013 16:22
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Jointure spatiale avec buffer
Bonjour Thomas, voici la réponse à ta question
Bon, j'ai creusé le sujet et j'ai trouvé que je m'étais un peu trop compliqué la vie :Code:
UPDATE point SET codePoint = codeLine FROM ligne WHERE st_intersects(st_buffer(point.geom, 100), ligne.geom) ;...et voilà ! J'espère que ça pourra resservir à d'autres.
Thomas
Attention en faisant cela, si plusieurs lignes sont a moins de 100m du point, la valeur de codeLine sera prise au hasard parmi toutes les lignes concernees.
Vous pouvez donc obtenir des resulats differents avec la meme requete.
Nicolas
Hors ligne
#5 Thu 07 November 2013 16:32
- Thomas Williamson
- Participant actif
- Lieu: Poitiers
- Date d'inscription: 16 Nov 2008
- Messages: 92
Re: Jointure spatiale avec buffer
Bonjour,
Très intéressant ! Je découvre la fonction st_dwithin. J'avais fait une simulation un peu simpliste avec seulement une ligne à proximité mais le cas de plusieurs lignes présentes dans un rayon de 100m allait immanquablement se présenter...
Merci pour votre éclairage précieux !
Thomas
Hors ligne