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

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

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

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

Re: test d'auto intersection et date

C'est exactement cela.

Hors ligne

 

Pied de page des forums

Powered by FluxBB