#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