Annonce
Pour sa 21ème année, l’association GeoRezo a toujours besoin de vous !
10€ = 1 mois de frais bancaires ; 15€ = 12 mois de nom de domaine ; 30€ = 1 semaine de location des serveurs …
Retrouver nos membres bienfaiteurs
#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: 1554
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