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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

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

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 ! wink

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

 

Pied de page des forums

Powered by FluxBB