J'ai un tableau des rues que j'ai sélectionné en fonction d'un ensemble d'attributs (disons que c'est speed_limit < 25
). Il y a des groupes de rues qui sont localement contiguës; Je voudrais regrouper ces ensembles de chaînes de lignes connectées dans GeometryCollections. Dans l'image ci-dessous, il y aurait deux GeometryCollections: une avec les lignes rouges et une avec les lignes bleues.
J'ai essayé d'exécuter quelques requêtes "dissoudre, désagréger" selon les lignes suivantes:
SELECT (ST_Dump(st_union)).geom
FROM
(SELECT ST_Union(geom) FROM roads) sq
Avec tout ce que j'ai essayé, je me retrouve avec une seule fonction ( ST_Union
) ou ma géométrie d'origine ( ST_Dump
de ST_Union
).
Peut-être qu'il est possible de faire cela avec une sorte de WITH RECURSIVE
magie?
Réponses:
Donc, par exemple. Voici un tableau simple avec deux groupes d'arêtes connectés:
Maintenant, voici une fonction récursive qui, étant donné l'id d'un bord, accumule tous les bords qui se touchent:
Cela nous laisse juste besoin de trouver, après que chaque groupe est accumulé, l'identifiant d'un bord qui ne fait pas déjà partie d'un groupe. Ce qui, tragiquement, nécessite une deuxième requête récursive.
Ce qui, pris ensemble, renvoie un joli ensemble avec l'identifiant de la graine et chaque groupe qu'il a accumulé. Je laisse le soin au lecteur de transformer les tableaux d'id en requête pour créer une géométrie pour la cartographie.
la source
grouplist
tableau:insert into lines (id, geom) values ( 15, 'LINESTRING(0 0, 10 10)');
. La modificationarray_agg(id)
de la fonction de retour àarray_agg(DISTINCT id)
semble résoudre le problème.Voici une approche qui utilise une table temporaire pour agréger progressivement des clusters ensemble. Je ne me soucie pas vraiment de l'approche de table temporaire, mais cela semble fonctionner assez bien à mesure que le nombre de lignes augmente (j'ai 1,2 M de lignes en entrée).
la source
ST_ClusterIntersecting
fonction dans PostGIS. Si vos données sont suffisamment petites pour tenir en mémoire, je vous suggère de vérifier cela pour une solution plus performante.