Annonce
Suite à un problème technique intervenu entre le 22 et le 23 mars, nous avons du procéder dans la soirée du 25 mars, à la restauration de la base de données du 24 mars (matinée).
En clair, nous avons perdu vos contributions et inscriptions du dimanche 24 et du lundi 25 mars.
Nous vous prions de nous excuser.
#1 Mon 13 September 2021 23:11
- neskuik01
- Participant assidu
- Date d'inscription: 16 Feb 2015
- Messages: 193
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: 1534
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: 1129
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: 1534
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: 193
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: 1129
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: 193
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: 1129
Re: test d'auto intersection et date
C'est exactement cela.
Hors ligne