Bonjour à tous,
Je possède deux tables avec géométrie: communes et site:
Je souhaite récupérer automatique la liste des communes que chaque site intersecte sans prendre en compte les contours qui se touchent.
La mise à jour du nom des communes pour chaque site déjà existant dans la base fonctionne très bien:
Par contre lorsque je souhaite automatiser avec un trigger, pour l'ajout d'un nouveau site, j'ai un petit souci. Il me récupère bien les communes qui intersectent et qui ne font pas que toucher la limite du site, mais il me répète autant de fois la communes qu'il y a de site....
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 UPDATE geo_site SET nom_communes = (SELECT liste_communes --liaison entre le nom_site de la table et celui du tableau de la requête FROM (SELECT nom_site, array_agg(communes)as liste_communes -- concatène les communes par site FROM (SELECT geo_site.nom_site, initcap(bdcarto_commune.nom_comm)as communes -- sélection des communes qui intersectent les sites FROM geo_site, bdcarto_commune WHERE st_intersects (geo_site.the_geom, bdcarto_commune.geom) EXCEPT SELECT geo_site.nom_site, initcap(bdcarto_commune.nom_comm)as communes -- enlève de la sélection les communes qui touchent seulement les contours des sites FROM geo_site, bdcarto_commune WHERE st_touches (geo_site.the_geom, bdcarto_commune.geom) ) AS site_intersect_communes GROUP BY nom_site ) as liste_communes_par_site WHERE geo_site.nom_site = liste_communes_par_site.nom_site) ;
et le trigger sur site:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 CREATE OR REPLACE FUNCTION calc_liste_communes() RETURNS trigger AS $BODY$ begin IF NEW.nom_communes is null THEN NEW.nom_communes = (SELECT liste_communes FROM (SELECT nom_site, array_agg(communes) as liste_communes FROM (SELECT geo_site.nom_site, initcap(bdcarto_commune.nom_comm)as communes FROM geo_site, bdcarto_commune WHERE st_intersects (geo_site.the_geom, bdcarto_commune.geom) EXCEPT SELECT geo_site.nom_site, initcap(bdcarto_commune.nom_comm)as communes FROM geo_site, bdcarto_commune WHERE st_touches (geo_site.the_geom, bdcarto_commune.geom) ) AS site_intersect_communes GROUP BY nom_site ) as liste_communes_par_site WHERE geo_site.nom_site = liste_communes_par_site.nom_site); end if; IF NEW.nom_communes is not null THEN NEW.nom_communes = replace(replace(replace(replace(NEW.nom_communes,'"',''), ',',', '),'{',''),'}',''); -- pour une meilleur visibilité cf résultat de array_agg end if; return NEW; end;$BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION calc_liste_communes() OWNER TO postgres;
Si quelqu'un a une petit idée de mon erreur et du pourquoi il me répète la commune autant de fois qu'il existe de site dans la base alors que l'update fonctionne bien?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 CREATE TRIGGER add_liste_commune AFTER INSERT OR UPDATE ON geo_site FOR EACH ROW EXECUTE PROCEDURE calc_liste_communes();
cordialement
Partager