Message posté par : Nicolas Ribot
----------------------------------------
Ok je vois mieux (enfin je sais pas :) )
Peut etre avec une CTE récursive, style brute force:
• On prend chaque point comme point de départ d'un cluster potentiel: cluster de
multipoints donc
• A chaque itération, on cherche le point le plus proche de notre cluster, on l'ajoute
au cluster, on fait la somme des distances pour ce cluster.
• On stocke les ids déjà trouvés dans un tableau histoire de ne pas rechercher parmi des
points du cluster
• On s'arrete quand on a construit des clusters ayant le nbre de points requis (qui
peut etre le pourcentage du nbre de points dans la table, comme dans l'exemple
ci-dessous.
• On prend alors le cluster ayant la somme de distance la plus petite comme bon cluster,
on peut construire son convexHull.
En SQL: (ma table de test a 68 points, cf. Image)
Note: Le code utilise l'extension intarray pour classer le tableau des ids des points
et eviter ainsi des doublons, mais c'est complètement optionnel en fait:
order by sumdist limit 1 renverra toujours le cluster avec la plus petite somme de
distance, peu importe l'ordre des identifiants dans le tableau des ids composant le
cluster
-----------------
Code :
with recursive clusters(idcluster, ids, step, maxpts, sumdist, geom) as (
select gid as idcluster, array[gid] as ids, 1 as step,
(select round(count(*) * 0.05)::int as numpts from testpt) as maxpts,
0.0::float as sumdist,
st_multi(geom)::geometry(MULTIPOINT, 0) as geom
from testpt
UNION ALL
select c.idcluster, c.ids || t.gid, step+1, c.maxpts,
c.sumdist + t.dist,
st_multi(st_union(c.geom, t.geom))::geometry(MULTIPOINT, 0) as geom
from clusters c cross join lateral (
select tp.gid, c.geom <-> tp.geom as dist, tp.geom
from testpt tp
where not(tp.gid = any(c.ids))
order by c.geom <-> tp.geom
limit 1
) as t
where c.step <= maxpts - 1
) select sort(ids) as ids, sumdist, st_convexhull(geom) as geom
from clusters
where step = maxpts
group by sort(ids), 2, 3
order by sumdist;
-----------------
Sur l'image, les convexhulls pour 6, 7 et 8 points dans le cluster
Nicolas
----------------------------------------
Ce message est accompagné de fichiers, pour les télécharger, suivre le lien ci-dessous.
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=332862#p332862
Pour y répondre : geobd(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net