Ich muss gelöste Puffer aus Mehrpunkteingabefunktionen erstellen. Im folgenden Beispiel enthält die Eingabetabelle 4 Funktionen. Das Feature #2
besteht aus zwei Punktgeometrien. Nach dem Erstellen eines Puffers erhalte ich 4 Polygongeometrien:
Gibt es eine Möglichkeit, das Ergebnis zu gruppieren? Die Puffer der Punkte #1
und #2
werden aufgelöst und sollten ein einzelnes Multi-Polygon-Feature sein ( a
).
Was ich bisher gemacht habe:
-- 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;
BEARBEITEN:
-- 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));
Antworten:
Beginnend mit einigen zufälligen Punkten, um diejenigen im Bild des OP zu imitieren, bei denen sich die ersten beiden räumlich schneiden, haben der zweite und der dritte die gleiche Attribut-ID (2), mit einigen anderen Punkten, die sich weder räumlich schneiden noch haben Mit demselben Attribut erzeugt die folgende Abfrage 3 Cluster:
Hier gibt es mehrere Schritte:
ST_Union
Gruppieren nach ID", um zuerst nach Attribut zu gruppierenST_ClusterIntersecting
diese Option, um diejenigen aus derselben Gruppe zu kombinieren, die sich räumlich schneidenZiemlich lang, aber es funktioniert (und ich bin sicher, es gibt einen kürzeren Weg).
Wenn Sie das WKT-Tool in QGIS verwenden (und feststellen, wie schrecklich ich mit den Bearbeitungswerkzeugen bin), werden Cluster wie die folgenden erstellt, in denen Sie sehen können, dass der Cluster, den Sie als gekennzeichnet haben, alle zusammen ist - dh eine Farbe.
Wenn Sie einen ST_AsText um das Finale ST_UNION (d.geom) setzen, können Sie die Ergebnisse direkt sehen.
BEARBEITEN Sie nach weiteren Informationen in den Kommentaren: Wenn Sie mit Punkten beginnen, müssen Sie den Puffer in meine ursprüngliche Lösung integrieren - die ich zu Beginn in den temporären CTE eingefügt habe, um Ihr Diagramm nachzuahmen. Es wäre einfacher, den Puffer im CTE der Gewerkschaften hinzuzufügen, damit Sie alle Geometrien gleichzeitig ausführen können. Am Beispiel eines Pufferabstands von 1000 gibt das Folgende nun erwartungsgemäß 3 Cluster zurück.
quelle
ST_SetSRID
,ST_Multi
und::geometry(Multipolygon, /*SRID*/)
, aber im Moment ist es funktioniert nicht.Eine Möglichkeit, dies zu tun, besteht darin,
ST_Union
alle Puffer zusammen zuST_Dump
erstellen, um die Komponenten des resultierenden Polygons abzurufen und mitST_Intersects
den Eingabepunkten zu verbinden, um herauszufinden, wie viele / welche Punkte die einzelnen Cluster bilden.Dies kann ohne Join erfolgen, indem die Punkte vor dem Aufruf gruppiert werden
ST_Buffer
. Damit sich zwei Punkte innerhalb desselben gelösten Puffers befinden, müssen sie durch Sprünge zwischen Punkten mit einer Entfernung von weniger als erreichbar seineps
. Dies ist nur ein Minimum-Linkage-Clustering-Problem, das gelöst werden kann mitST_ClusterDBSCAN
:Beachten Sie, dass dies nicht genau das gleiche Ergebnis wie die Buffer-First-Methode liefert, da PostGIS-Puffer keine perfekten Kreise sind und zwei 1000 m voneinander entfernte Punkte möglicherweise nicht durch zwei 500 m-Puffer verbunden sind.
quelle
Entsprechend dieser Antwort möchten Sie ST_DUMP in Ihrer Unterabfrage ausführen.
Etwas wie das:
Der Grund dafür ist, dass
ST_UNION
ein aufgelöstes Multipolygon aller Merkmale zurückgegeben wird undST_DUMP
dieses in die einzelnen Polygonmerkmale (die aufgelöst wurden) aufgeteilt wird.quelle
ST_Multi((ST_Dump(ST_Union(ST_Buffer(geom, 1000, 8)))).geom)::geometry(MultiPolygon, /*SRID*/) AS geom
, aber dies schafft 4 Funktionen anstelle von 3.GROUP_BY
vor IhnenST_UNION
.