Je dois créer des tampons dissous à partir de fonctionnalités d'entrée multipoints. Dans l'exemple ci-dessous, le tableau d'entrée contient 4 fonctionnalités. La fonction se #2
compose de deux géométries de points. Après avoir créé un tampon, j'obtiens 4 géométries de polygone:
Existe-t-il un moyen de regrouper le résultat? Les tampons des points #1
et #2
sont dissous et doivent être une seule entité multi-polygone ( a
).
Ce que j'ai fait jusqu'à présent:
-- collect all buffers to a single multi-polygon feature
-- dissolve overlapping polygon geometries
CREATE TABLE public.pg_multibuffer AS SELECT
row_number() over() AS gid,
sub_qry.*
FROM (SELECT
ST_Union(ST_Buffer(geom, 1000, 8))::geometry(MultiPolygon, /*SRID*/) AS geom
FROM
public.multipoints)
AS sub_qry;
ÉDITER:
-- create sample geometries
CREATE TABLE public.multipoints (
gid serial NOT NULL,
geom geometry(MultiPoint, 31256),
CONSTRAINT multipoints_pkey PRIMARY KEY (gid)
);
CREATE INDEX sidx_multipoints_geom
ON public.multipoints
USING gist
(geom);
INSERT INTO public.multipoints (gid, geom) VALUES
(1, ST_SetSRID(ST_GeomFromText('MultiPoint(12370 361685)'), 31256)),
(2, ST_SetSRID(ST_GeomFromText('MultiPoint(13520 360880, 19325 364350)'), 31256)),
(3, ST_SetSRID(ST_GeomFromText('MultiPoint(11785 367775)'), 31256)),
(4, ST_SetSRID(ST_GeomFromText('MultiPoint(19525 356305)'), 31256));
Réponses:
En commençant par quelques points aléatoires, dans un attept pour imiter ceux de l'image de l'OP, où les deux premiers se croisent spatialement, puis les 2ème et 3ème ont le même attribut id (2), avec quelques autres points qui ne se croisent pas spatialement ni n'ont le même attribut, la requête suivante produit 3 clusters:
Il y a plusieurs étapes ici:
ST_Union
, regroupement par id, au premier groupe par attributST_ClusterIntersecting
pour combiner ceux du même groupe qui se croisent spatialementPlutôt long, mais ça marche (et, je suis sûr qu'il y a un chemin plus court).
L'utilisation de l'outil WKT dans QGIS (et en découvrant à quel point je suis affreux avec les outils d'édition) produit des clusters comme celui-ci, où vous pouvez voir le cluster que vous étiquetez comme un, est tout ensemble - c'est-à-dire une couleur.
Si vous mettez un ST_AsText autour de la finale, ST_UNION (d.geom), vous pouvez voir les résultats directement.
EDIT suivant plus d'informations dans les commentaires: Comme vous commencez avec des points, vous devrez incorporer le tampon dans ma solution d'origine - que j'ai mis dans le CTE temporaire au début pour imiter votre diagramme. Il serait plus facile d'ajouter le tampon dans les unions CTE, donc vous pouvez faire toutes les géométries à la fois. Ainsi, en utilisant une distance tampon de 1000, par exemple, ce qui suit renvoie désormais 3 clusters, comme prévu.
la source
ST_SetSRID
,ST_Multi
et::geometry(Multipolygon, /*SRID*/)
, mais pour le moment cela ne fonctionne pas.Une façon de le faire est
ST_Union
de rassembler tous les tampons,ST_Dump
le résultat pour obtenir les composants du polygone résultant, et de rejoindreST_Intersects
les points d'entrée pour découvrir combien / quels points constituaient chaque cluster.Cela peut être fait sans exiger une jointure en regroupant les points avant d' appeler
ST_Buffer
. Pour que deux points soient situés dans le même tampon dissous, ils doivent être accessibles par sauts entre des points d'une distance inférieure àeps
. Ceci est juste un problème de clustering de liaison minimale, qui peut être résolu en utilisantST_ClusterDBSCAN
:Notez que cela ne produira pas exactement le même résultat que la méthode tampon d'abord, car les tampons PostGIS ne sont pas des cercles parfaits et deux points distants de 1000 m peuvent ne pas être connectés par deux tampons de 500 m.
la source
Selon cette réponse, vous souhaitez effectuer ST_DUMP dans votre sous-requête.
Quelque chose comme ça:
La raison en est que cela
ST_UNION
renvoie un multipolygone dissous de toutes les entités, et leST_DUMP
décompose en entités polygonales individuelles (qui ont été dissoutes).la source
ST_Multi((ST_Dump(ST_Union(ST_Buffer(geom, 1000, 8)))).geom)::geometry(MultiPolygon, /*SRID*/) AS geom
, mais cela crée 4 fonctionnalités au lieu de 3.GROUP_BY
avant vousST_UNION
.