Muszę tworzyć rozpuszczone bufory z funkcji wprowadzania wielopunktowego. W poniższym przykładzie tabela wprowadzania zawiera 4 funkcje. Obiekt #2
składa się z dwóch geometrii punktowych. Po utworzeniu bufora otrzymuję 4 geometrie wielokątów:
Czy istnieje sposób na pogrupowanie wyniku? Bufory punktów #1
i #2
są rozpuszczone i powinny być pojedynczą funkcją wielokąta ( a
).
Co zrobiłem do tej pory:
-- 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;
EDYTOWAĆ:
-- 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));
Odpowiedzi:
Zaczynając od kilku losowych punktów, w celu naśladowania tych na obrazie PO, gdzie pierwsze dwa przestrzennie przecinają się, następnie drugi i trzeci mają ten sam atrybut id (2), z kilkoma innymi punktami, które ani przecinają się przestrzennie, ani nie mają ten sam atrybut, następujące zapytanie tworzy 3 klastry:
Tutaj jest kilka kroków:
ST_Union
, pogrupuj według identyfikatora, aby najpierw pogrupować według atrybutuST_ClusterIntersecting
aby połączyć te z tej samej grupy, które przecinają się przestrzennieDość długo, ale działa (i jestem pewien, że jest krótsza droga).
Za pomocą narzędzia WKT w QGIS (i odkrywając, jak okropnie jestem z narzędziami do edycji), powstają klastry takie jak poniżej, w których widać klaster oznaczony jako a, wszystko razem - tzn. Jeden kolor.
Jeśli umieścisz ST_AsText w finale, ST_UNION (d.geom), możesz zobaczyć wyniki bezpośrednio.
EDYTUJ następujące informacje w komentarzach: Gdy zaczynasz od punktów, musisz włączyć bufor do mojego oryginalnego rozwiązania - które umieszczam w temp CTE na początku, aby naśladować twój schemat. Łatwiej byłoby dodać bufor w związkach CTE, dzięki czemu można wykonywać wszystkie geometrie jednocześnie. Tak więc, przykładowo, używając odległości bufora 1000, teraz zwraca 3 klastry, zgodnie z oczekiwaniami.
źródło
ST_SetSRID
,ST_Multi
a::geometry(Multipolygon, /*SRID*/)
, ale w tej chwili nie działa.Jednym ze sposobów, aby to zrobić, jest połączenie
ST_Union
wszystkich buforów razem,ST_Dump
aby uzyskać składniki wynikowego wielokąta i połączyć się zST_Intersects
powrotem z punktami wejściowymi, aby dowiedzieć się, ile / które punkty tworzyły każdy klaster.Można to zrobić bez konieczności łączenia, grupując punkty przed połączeniem
ST_Buffer
. Aby dwa punkty znajdowały się w tym samym rozpuszczonym buforze, muszą być osiągalne przez przeskok między punktami na odległość mniejszą niżeps
. Jest to tylko problem klastrowania minimalnego powiązania, który można rozwiązać za pomocąST_ClusterDBSCAN
:Zauważ, że nie da to dokładnie takiego samego wyniku, jak metoda polegająca na pierwszym buforowaniu, ponieważ bufory PostGIS nie są idealnymi okręgami, a dwa punkty w odległości 1000 m nie mogą być połączone dwoma buforami 500m.
źródło
Zgodnie z tą odpowiedzią chcesz wykonać ST_DUMP w swoim podzapytaniu.
Coś takiego:
Powodem tego jest to, że
ST_UNION
zwraca rozpuszczonyST_DUMP
wielobok wszystkich cech i dzieli je na poszczególne cechy wielokąta (które zostały rozwiązane).źródło
ST_Multi((ST_Dump(ST_Union(ST_Buffer(geom, 1000, 8)))).geom)::geometry(MultiPolygon, /*SRID*/) AS geom
, ale powoduje to utworzenie 4 funkcji zamiast 3.GROUP_BY
przed sobąST_UNION
.