Pages: 1
- Sujet précédent - [PostGIS] Regroupement de polygones distants avec récursivité - Sujet suivant
#1 Sun 28 February 2016 15:29
- CGuillaume
- Participant actif
- Lieu: Annecy
- Date d'inscription: 3 Aug 2011
- Messages: 59
[PostGIS] Regroupement de polygones distants avec récursivité
Bonjour,
Mon objectif est de générer des ensembles d'"éco-paysages". Pour cela je souhaite regrouper les polygones se trouvant à moins de 100m les uns des autres pour obtenir des multi-polygones regroupant tous les polygones à moins de 100m les uns des autres.
Pour le moment je suis parti sur la méthode ci-dessous, mais je stagne un peu sans vraiment obtenir un résultat juste. J'obtient bien des groupes mais ils ne sont pas complets malgré qu'aucun de mes tableaux soit complet (10 valeurs) et en plus j'ai des groupes que se superposent ce qui complique les choses.
-- Table de distance des polygones 2 à 2
-- Optimisation avec <#> pour éviter de faire le calculs sur tous les polygones
Code:
create table distance as( select p1.gid, t.gid as gid2, t.dist from poly cross join lateral (select p2.gid, st_distance(p1.geom, p2.geom) as dist from poly p2 where p1.gid <> p2.gid and p1.geom <#> p2.geom < 100 order by p1.geom <-> p2.geom ) as t order by p1.gid, t.dist);
-- Sélection des distances inférieures à 100m
-- Group by dist, selection de min(gid), max(gid2) pour supprimer les doublons de couple (ex : poly 1 à 2.66666m de poly 2 & poly 2 à 2.66666m de poly 1)
Code:
drop table distance_100; create table distance_100 as select min(gid) as gid, max(gid2) as gid2, dist from distance where dist < 100 group by dist order by gid;
-- Fusion des polygones à moins de 100m les uns des autres
Code:
drop table distance_100_group; create table distance_100_group as with t as ( /* Avec cette étape je tente de faire une "chaine" pour trouver les polygones connectés Ex : Si - poly 1 connecté à 2 et 3 - poly 2 connecté à 5 et 6 --> Alors poly connecté à 2,3,5,6 */ SELECT a.gid, array_remove(ARRAY [a.gid, a.gid2, b.gid2, c.gid2, d.gid2, e.gid2, f.gid2, g.gid2, h.gid2, i.gid2, j.gid2], NULL) as ids, array_length(array_remove(ARRAY [a.gid, a.gid2, b.gid2, c.gid2, d.gid2, e.gid2, f.gid2, g.gid2, h.gid2, i.gid2, j.gid2], NULL),1) as long FROM distance_100 a LEFT JOIN distance_100 AS b ON a.gid2 = b.gid LEFT JOIN distance_100 AS c ON b.gid2 = c.gid LEFT JOIN distance_100 AS d ON c.gid2 = d.gid LEFT JOIN distance_100 AS e ON d.gid2 = e.gid LEFT JOIN distance_100 AS f ON e.gid2 = f.gid LEFT JOIN distance_100 AS g ON f.gid2 = g.gid LEFT JOIN distance_100 AS h ON g.gid2 = h.gid LEFT JOIN distance_100 AS i ON h.gid2 = i.gid LEFT JOIN distance_100 AS j ON i.gid2 = j.gid ), t1 as ( -- Calcul de la longueur max des tableau pour un même gid de départ afin de trouver la plus grande chaine de polygones SELECT gid, max(long) AS max FROM t GROUP BY gid ), t2 as -- Selection des chaines de polygones les plus longues et explosion des tableaux SELECT t.gid, unnest(t.ids) as ids FROM t RIGHT JOIN t1 ON t.gid = t1.gid AND t.long = t1.max ) -- Récupération des geom et union des geom avec un group by gid SELECT t2.gid, st_union(p.geom) FROM t2 LEFT JOIN polygon p ON t2.ids = p.gid GROUP BY t2.gid
Je pense me compliquer un peu la chose mais n'ai pas d'autres pistes pour le moment.
Avez-vous déjà eu ce genre de traitement à faire ?
Merci d'avance
Guillaume
Dernière modification par CGuillaume (Sun 28 February 2016 15:31)
Hors ligne
#2 Sun 28 February 2016 15:33
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [PostGIS] Regroupement de polygones distants avec récursivité
Bonjour,
Postgis 2.2+: http://postgis.net/docs/manual-2.2/ST_C … ithin.html
Hou trop puissant
Nicolas
Hors ligne
#3 Sun 28 February 2016 17:21
- CGuillaume
- Participant actif
- Lieu: Annecy
- Date d'inscription: 3 Aug 2011
- Messages: 59
Re: [PostGIS] Regroupement de polygones distants avec récursivité
ok je m'incline !
Trop Trop puissant et pas si lent que ça en plus !
En 6 lignes j'ai ce que je veux :
Code:
with t as ( select unnest(ST_ClusterWithin(geom, 100)) as geom from polygon ) select row_number()over() as gid, ST_CollectionExtract(geom,3)::geometry(multipolygon,2154) as geom from t;
Bonne fin de week-end et merci.
Hors ligne
Pages: 1
- Sujet précédent - [PostGIS] Regroupement de polygones distants avec récursivité - Sujet suivant