#1 Mon 13 September 2021 23:11
- neskuik01
- Participant assidu
- Date d'inscription: 16 Feb 2015
- Messages: 199
test d'auto intersection et date
Bonjour,
Je cherche à déterminer si mes buffers s'intersectent et si oui, si la valeur du champs "année" est inférieure d'un an ou supérieur d'un an.
Code:
UPDATE anthro.tmp_buf_500m SET recurrence = case when St_intersects(ST_Buffer(geom, 50), (select geom from anthro.tmp_buf_500m limit 1 )) AND (select an_obs from anthro.tmp_act_orp_buf_500m limit 1) BETWEEN an_obs-1 AND an_obs+1 THEN 1 ELSE 0 end;
Mais le résultat n'est pas cohérent.
Hors ligne
#2 Tue 14 September 2021 08:53
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1555
Re: test d'auto intersection et date
Bonjour,
Plusieurs choses ne vont pas dans votre requête:
• si vous voulez tester vos buffers à 50m près, pas la peine de créer un buffer à 50m: utilisez plutot st_dwithin(geom, 50): c'est beaucoup plus rapide.
• En faisant "select geom ... limit 1" dans votre requête, vous ne prenez qu'un élément de la table
• Vous faites appel à la table anthro.tmp_act_orp_buf_500m pour les attributs: quel est son lien avec la table tmp_buf_500m ?
S'il s'agit de trouver les objets à moins de 50m les uns des autres dans la même table, il faut faire un self join sur la table:
Code:
select a.id as idA, b.id as idB from matable a join matable b on a.id < b.id and st_dwithin(a.geom, b.geom, 50);
Je vous invite à réviser la structure de la commande UPDATE: quand plusieurs tables sont en jeu, vous pouvez écrire:
Code:
UPDATE matable set macol = .... from autretable where matable.col = autretable.col...
Nicolas
Hors ligne
#3 Tue 14 September 2021 08:59
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1193
Re: test d'auto intersection et date
Salut,
Si j'ai bien compris la structure de vos tables :
Code:
UPDATE anthro.tmp_buf_500m b1 SET recurrence = CASE WHEN EXISTS ( SELECT 1 FROM anthro.tmp_act_orp_buf_500m b2 WHERE St_intersects(ST_Buffer(b1.geom, 50), b2.geom) AND b2.an_obs from BETWEEN b1.an_obs-1 AND b1.an_obs+1 ) THEN 1 ELSE 0 END;
[EDIT] Nicolas a déjà commenté votre requête
Dernière modification par tumasgiu (Tue 14 September 2021 09:01)
Hors ligne
#4 Tue 14 September 2021 09:24
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1555
Re: test d'auto intersection et date
Oui mais je crois que je n'ai rien compris à la structure des tables
Hors ligne
#5 Tue 14 September 2021 13:21
- neskuik01
- Participant assidu
- Date d'inscription: 16 Feb 2015
- Messages: 199
Re: test d'auto intersection et date
Mea culpa pour les erreurs j'ai pas copié le bon code, il n'y a qu'une seule table "tmp_buf_500m" donc je test la condition sur la table en elle même.
J'ai effectivement mis des limit 1 parce que plusieurs retours, cela me déclenchait une erreur.
J'ai voulu initialement tester avec st_dwithin() cependant la fonction n'est pas reconnu (function does not exists) et je me souviens plus de la manip à faire (j'ai déjà eu ça avec d'autre fonction).
EDIT:
finalement st_dwithin fonctionne, ca devait être la structure qui lui plaisait pas.
Code:
UPDATE anthro.tmp_act_orp_buf_500m b1 SET recurrence = Case when EXISTS( SELECT 1 FROM anthro.tmp_act_orp_buf_500m b2 WHERE st_dwithin(b1.geom,b2.geom,50 ) AND b2.an_obs BETWEEN b1.an_obs-1 AND b1.an_obs+1 ) THEN 1 ELSE 0 END;
En revanche ca me met que des 1 même pour les polygones qui sont complètement isolées
Dernière modification par neskuik01 (Tue 14 September 2021 13:56)
Hors ligne
#6 Tue 14 September 2021 17:10
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1193
Re: test d'auto intersection et date
Il manque une condition dans la clause WHERE.
Code:
UPDATE anthro.tmp_act_orp_buf_500m b1 SET recurrence = Case when EXISTS( SELECT 1 FROM anthro.tmp_act_orp_buf_500m b2 WHERE st_dwithin(b1.geom,b2.geom,50 ) AND b2.an_obs BETWEEN b1.an_obs-1 AND b1.an_obs+1 AND b2.id_buffer <> b1.id_buffer ) THEN 1 ELSE 0 END;
Hors ligne
#7 Wed 15 September 2021 14:00
- neskuik01
- Participant assidu
- Date d'inscription: 16 Feb 2015
- Messages: 199
Re: test d'auto intersection et date
Il manque une condition dans la clause WHERE.
Code:
UPDATE anthro.tmp_act_orp_buf_500m b1 SET recurrence = Case when EXISTS( SELECT 1 FROM anthro.tmp_act_orp_buf_500m b2 WHERE st_dwithin(b1.geom,b2.geom,50 ) AND b2.an_obs BETWEEN b1.an_obs-1 AND b1.an_obs+1 AND b2.id_buffer <> b1.id_buffer ) THEN 1 ELSE 0 END;
Ca fonctionne , Merci
.
Juste pour être certain le "<>" c'est pour éviter que la condition soit testé sur le même buffer ?
Hors ligne
#8 Wed 15 September 2021 18:01
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1193
Re: test d'auto intersection et date
C'est exactement cela.
Hors ligne