Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
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

Printemps des cartes 2024

#1 Fri 25 February 2022 11:46

Hippo
Participant actif
Date d'inscription: 18 Jan 2015
Messages: 57

St_intersects su une même couche

Bonjour,

J'ai une couche de polygones qui jalonnent mon territoire.
Je souhaiterais lorsque 2 polygones sont à moins de 500m de distance pouvoir supprimer de ma table le polygone le plus petit pour ne garder que le plus grand.

Je pense donc créer un buffer autour de mes polygones et s'ils s'intersectent, supprimer de ma table le polygone dont l'attribut "surface" est le plus petit.

Mais tout d'abord, comment faire une intersection sur la même couche ?

Code:

SELECT *,
ST_intersects(ST_BUFFER(polygone.geometry::geography,500),ST_BUFFER(polygone.geometry::geography,500))
FROM table

Hors ligne

 

#2 Fri 25 February 2022 11:58

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

Re: St_intersects su une même couche

Bonjour,

Ne faites pas de buffer, mais utilisez st_dwithin pour trouver les objets a moins de x m d'autres objets.
Pour faire un jointure sur la meme couche, listez-la 2 fois dans le from, avec des alias différents

Code:

select ...
from table1 t1 join table1 t2 on t1.id < t2.id and st_dwithin(t1.geom, t2.geom, 500)
...

Nicolas

Hors ligne

 

#3 Fri 25 February 2022 12:08

Hippo
Participant actif
Date d'inscription: 18 Jan 2015
Messages: 57

Re: St_intersects su une même couche

Merci Nicolas !
Une précision svp, pourquoi faire le join sur t1.id<t2.id ?

Hors ligne

 

#4 Fri 25 February 2022 12:36

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

Re: St_intersects su une même couche

Ca permet de ne tester qu'une seule fois un couple de 2 polygones.
Sinon, on teste A vs B et B vs A si on ne fait qu'une jointure spatiale.

Avec un exemple c'est plus parlant:
premiere requete: t1.id < t2.id: un seul test pour un couple de 2 id
deuxieme requete: t1.id <> t2.id: chaque couple d'id est testé 2 fois

Code:

with tmp as (
    select * from (values (1), (2), (3)) as v(id)
) select t1.id, t2.id
from tmp t1 join tmp t2 on t1.id < t2.id;
-- 1|2
-- 1|3
-- 2|3

-- vs un self join en excluant uniquement les memes objets (meme id)
with tmp as (
    select * from (values (1), (2), (3)) as v(id)
) select t1.id, t2.id
from tmp t1 join tmp t2 on t1.id <> t2.id;
-- 1|2
-- 1|3
-- 2|1
-- 2|3
-- 3|1
-- 3|2

Nicolas

Dernière modification par Nicolas Ribot (Fri 25 February 2022 12:41)

Hors ligne

 

#5 Tue 01 March 2022 18:35

Hippo
Participant actif
Date d'inscription: 18 Jan 2015
Messages: 57

Re: St_intersects su une même couche

Super !! Merci pour ces explications très claires Nicolas !!

Hors ligne

 

Pied de page des forums

Powered by FluxBB