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 Mon 13 September 2021 23:11

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

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

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

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

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

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

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

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

Re: test d'auto intersection et date

C'est exactement cela.

Hors ligne

 

Pied de page des forums

Powered by FluxBB