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Ă© ?

#1 Mon 13 September 2021 23:11

neskuik01
Participant assidu
Date d'inscription: 16 Feb 2015
Messages: 203

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: 1566

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: 1226

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  wink

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: 1566

Re: test d'auto intersection et date

Oui mais je crois que je n'ai rien compris Ă  la structure des tables big_smile

Hors ligne

 

#5 Tue 14 September 2021 13:21

neskuik01
Participant assidu
Date d'inscription: 16 Feb 2015
Messages: 203

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: 1226

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: 203

Re: test d'auto intersection et date

tumasgiu a écrit:

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 smile, Merci smile.
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: 1226

Re: test d'auto intersection et date

C'est exactement cela.

Hors ligne

 

Pied de page des forums

Copyright Association GeoRezo