Pages: 1
- Sujet précédent - Postgis union et decoupe de polygones dans une même couche - Sujet suivant
#1 Fri 25 September 2020 08:09
- Tonio456
- Juste Inscrit !
- Date d'inscription: 24 Sep 2020
- Messages: 2
Postgis union et decoupe de polygones dans une même couche
Bonsoir à tous,
Je cherche à lancer une requête via postgis pour découper des polygones d'une même couche qui se superposent et donc créer de nouvelles géométries tout en récupérant la valeur de mon champ "nombre" pour en faire la moyenne.
Ma table ressemble à cela, j'ai a peu 500 cercles
https://ibb.co/kc19b4j
Si je prends cet exemple
https://ibb.co/MhTvTtr
J'ai 3 cercles avec un champ nombre de valeurs 1,2 et3
et je cherche à obtenir comme résultat
https://ibb.co/Vpm7H9W
c'est à dire 7 polygones qui reprennent la moyenne des attributs des polygones avec lesquels ils se superposent
J'espère etre assez clair dans mon explication
J'etais parti sur une requete du genre
Code:
SELECT a.label,b.label,st_intersection(a.geom,b.geom), avg (matable.nombre) as moyenne FROM matable as a, matable as b WHERE st_intersects(a.geom,b.geom) AND a.idb.id
mais je pense m'égarer complètement...
si quelqu'un a une piste je suis preneur !
Je vous remercie d'avance
Hors ligne
#2 Fri 25 September 2020 12:12
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Postgis union et decoupe de polygones dans une même couche
Bonjour,
Il y a plusieurs façons d'intersecter des polygones d'une couche:
On peut par exemple faire comme vous faites, en intersectant les polygones (st_intersects). Mais pour avoir un résultat complet, il faut ajouter d'autres opérations spatiales comme st_union et st_difference, pour découper les polygones initiaux regrouper les polygones qui intersectent un polygone donné.
On peut aussi décomposer les polygones en leurs rings (linestring) et lancer st_polygonize ou st_buildArea, suivant le résultat souhaité, sur ces linestrings.
Ces fonctions reconstruisent toutes les surfaces délimitées par les lignes qui se croisent.
En faisant cela, on perd les attributs des géométries initiales. Pour les récupérer, il faut faire une association spatiale entre le résultat obtenu et les polygones initiaux, par ex avec st_pointOnSurface, pour identifier de quels polygones initiaux sont issus les polygones de résultat.
Ca marche plutot bien, mais ca peut etre très, très long sur des grosses tables (millions de pg).
Il y a pas mal d'exemples de ces opérations sur le forum.
Nicolas
Hors ligne
#3 Fri 25 September 2020 12:58
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Postgis union et decoupe de polygones dans une même couche
Par exemple la deuxième méthode:
On fabrique la table pg_cut qui est le découpage des cercles avec st_polygonize. On obtient 7 nouveaux polygones.
On peut alors chercher, pour chaque nouveau polygone, son cercle de départ et faire la moyenne de l'attribut qu'on veut:
Code:
-- En 2 etapes: -- 1) découpage des cercles avec st_polygonize -- creation des cercles drop table if exists circle; create table circle as select * from (values (1, st_buffer('POINT(0 0)'::geometry, 3)), (2, st_buffer('POINT(3 3)'::geometry, 2)), (3, st_buffer('POINT(5 1)'::geometry, 3)) ) as v(id, geom); alter table circle add primary key (id); create index circle_geom_gist on circle using gist(geom); analyse circle; -- creation des polygones issus du découpage drop table if exists pg_cut; create table pg_cut as with tmp as ( select st_union(st_boundary(geom)) as geom from circle ), tmp1 as ( select st_dump(st_polygonize(geom)) as dmp from tmp ) select (dmp).path[1] as newid, (dmp).geom from tmp1; -- 2) association entre nouveaux et anciens polygones, avec st_pointOnSurface -- et index spatial sur pointOnSurface (pas nécessaire ici, mais a faire si bcp de polygones) -- clé primaire sur la nouvelle table alter table pg_cut add primary key (newid); -- index sur point on surface create index pg_cut_pos_gist on pg_cut using gist(st_PointOnSurface(geom)); analyse pg_cut; -- association spatiale nouveaux-ancien: select new.newid, sum(old.id)::float/count(old.id) as moyenne from circle old join pg_cut new on st_intersects(st_pointonsurface(new.geom), old.geom) group by new.newid; -- newid moyenne -- 1 2 -- 2 3 -- 3 1 -- 4 1.5 -- 5 2 -- 6 2 -- 7 2.5
En image:
les cercles: https://ibb.co/xmkp6n0
le découpage et les nouveaux id: https://ibb.co/bvjyvhq
les valeurs moyennes pour les nouveaux polygones: https://ibb.co/7RXCj1c
Nicolas
Hors ligne
#4 Fri 25 September 2020 16:26
- Tonio456
- Juste Inscrit !
- Date d'inscription: 24 Sep 2020
- Messages: 2
Re: Postgis union et decoupe de polygones dans une même couche
Bonjour Nicolas,
C'est exactement le résultat que je recherchais ! merci beaucoup !
Je ne connaissais pas cette fonction st_polygonize qui est vraiment très intéressante.
C'est super adapté a mon cas au max je me retrouve avec 5 K cercles dans ma table de départ donc ça va!
Je vous souhaite une bonne journée
Antoine
Hors ligne
Pages: 1
- Sujet précédent - Postgis union et decoupe de polygones dans une même couche - Sujet suivant