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

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

En 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

Thomas Williamson a écrit:

Bonjour Thomas, voici la réponse à ta question smile

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

En 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

 

Pied de page des forums

Powered by FluxBB