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 Wed 15 November 2023 22:23

anne39
Juste Inscrit !
Date d'inscription: 21 Mar 2022
Messages: 6

PostGIS] INSERT en utilisant la fonction ST_INTERSECTION

Bonjour,

J'essaie d'écrire un trigger qui manipule 3 tables géographiques dans PostGIS.
La fonction se déclenche lors de l'insertion d'un objet dans la table A.
Je souhaite insérer dans la table C, le résultat des intersections entre les objets de la table A et ceux de la table B.

Je l'ai écrit ainsi :

Code:

INSERT INTO public.table_C(geometrie)
    SELECT 
    st_intersection(table_A.geometrie, table_B.geometrie) as intersection
    FROM public.table_A, public.table_B
    WHERE 
    st_intersects(NEW.geometrie,table_B.geometrie)
    ;

Or les lignes s'insèrent bien dans la table C mais il y a un problème avec la géométrie : quand je l'ouvre dans QGIS ou FME, je récupère les lignes mais il n' a pas de géométrie associée.
J'imagine que la géométrie créée par la fonction st_intersection n'est pas correcte mais je ne sais pas ce que je dois faire pour qu'elle le soit.

Si je fais une vue à partir de la même requête, QGIS lit parfaitement la colonne intersection et affiche la géométrie des entités.
Je ne comprends donc pas la logique.

Auriez-vous une piste ?

Merci :-)

Hors ligne

 

#2 Wed 15 November 2023 23:30

Liline38
Participant occasionnel
Date d'inscription: 7 Apr 2023
Messages: 13

Re: PostGIS] INSERT en utilisant la fonction ST_INTERSECTION

Bonjour,
Est ce que le type de géométrie et la projection sont bien les mêmes pour les 3 tables?
Peut être que la colonne geometrie de la table_C est paramétrée différemment ? Ce qui pourrait expliquer pourquoi avec une vue cela marche mais pas lors de l'insertion.
Cordialement.

Hors ligne

 

#3 Wed 15 November 2023 23:47

anne39
Juste Inscrit !
Date d'inscription: 21 Mar 2022
Messages: 6

Re: PostGIS] INSERT en utilisant la fonction ST_INTERSECTION

Bonsoir,

Oui j'ai bien vérifié cela :-/

Hors ligne

 

#4 Thu 16 November 2023 08:37

JP LLORENS
Participant assidu
Date d'inscription: 12 Nov 2008
Messages: 231

Re: PostGIS] INSERT en utilisant la fonction ST_INTERSECTION

Bonjour.
Le st_intersection peut retourner du multi-géométrie (lignes et/ou polygones).
Peut-être  faudrait-il placer un ST_CollectionExtract sur le résultat de ST_Intersection pour ne récupérer que les polygones. En tout cas, pour ma part, j'utilise systématiquement cette fonction pour tout croisement géométrique utilisé.
JP

Hors ligne

 

#5 Thu 16 November 2023 09:30

anne39
Juste Inscrit !
Date d'inscription: 21 Mar 2022
Messages: 6

Re: PostGIS] INSERT en utilisant la fonction ST_INTERSECTION

Bonjour,

Je vous remercie pour votre réponse.
Je viens de tester et je rencontre le même problème : j'ai bien les lignes dans la table attributaire, mais pas de géométrie visible.
Et quand je demande à QGIS de zoomer sur la couche, il zoom sur une zone avec des coordonnées : 0,478 -1,023 et ne dessine pas de géométrie.
C'est étrange...

Hors ligne

 

#6 Thu 16 November 2023 10:24

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1544

Re: PostGIS] INSERT en utilisant la fonction ST_INTERSECTION

Bonjour,

Vous pouvez poster le code du trigger et de sa fonction ainsi que le schéma des tables a, b, c ? (type geo des colonnes notamment)

Nicolas

Hors ligne

 

#7 Thu 16 November 2023 10:32

anne39
Juste Inscrit !
Date d'inscription: 21 Mar 2022
Messages: 6

Re: PostGIS] INSERT en utilisant la fonction ST_INTERSECTION

Bonjour,

Je viens finaliser la rédaction d'un code qui fonctionne. Joie :-) !
Je vous le partage pour que cela serve à d'autres

Code:

CREATE OR REPLACE FUNCTION public.ma_fonction() 
RETURNS TRIGGER AS
$BODY$
BEGIN
   INSERT INTO  public.table_C(geometrie)
        SELECT (ST_Dump(ST_Intersection(new.geometrie, 
  public.table_B.geometrie))).geom
         FROM public.table_B;

RETURN new;
END;
$BODY$
language plpgsql;

CREATE TRIGGER  mon_trigger
 AFTER INSERT OR UPDATE ON  public.table_A
 FOR EACH ROW
 EXECUTE PROCEDURE  public.ma_fonction();

Et vous remercie pour votre aide à tous !

Hors ligne

 

Pied de page des forums

Powered by FluxBB