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

Printemps des cartes 2024

#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 !smile

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

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

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

 

Pied de page des forums

Powered by FluxBB