Bazı rasgele noktalarla başlayarak, OP görüntüsünde, ilk ikisinin mekansal olarak kesiştiği yerlere taklit etme girişiminde, 2. ve 3. aynı özellik kimliğine (2) sahip, mekansal olarak kesişmeyen veya sahip olmayan birkaç nokta daha var. aynı öznitelikte, aşağıdaki sorgu 3 küme üretir:
WITH
temp (id, geom) AS
(VALUES (1, ST_Buffer(ST_Makepoint(0, 0), 2)),
(2, ST_Buffer(ST_MakePoint(-0.7,0.5), 2)),
(2, ST_Buffer(ST_MakePoint(10, 10), 2)),
(3, ST_Buffer(ST_MakePoint(-2, 12), 2)),
(4, ST_Buffer(ST_MakePoint(5, -6), 2))),
unions(geoms) AS
(SELECT ST_Union(geom) FROM temp GROUP BY id),
clusters(geoms) AS
(SELECT ST_CollectionExtract(unnest(ST_ClusterIntersecting(geoms)), 3)
FROM unions),
multis(id, geoms) AS
(SELECT row_number() over() as id, geoms FROM clusters)
SELECT ST_UNION(d.geom) FROM
(SELECT id, (ST_DUMP(geoms)).geom FROM multis) d GROUP BY id;
Burada birkaç adım var:
- kullanmak
ST_Union
özelliğe göre ilk gruba, kimliğine göre, gruplama
ST_ClusterIntersecting
mekansal olarak kesişen aynı gruptaki insanları birleştirmek için kullanın
- kümelerin her birine bir kimlik ekleyin (tablo multis) - bunu doğrudan ClusterIntersecting'te yapmaya çalışmak, 1
- 2. adımdaki dökümlenmiş geometrileri, 3. adımdaki kimliğe göre gruplandırın - bu çözülme kısmıdır. Bu, küme A'nızdaki üst üste gelen iki çokgenin üst üste gelmek yerine adım 2'nin sonunda olduğu gibi birbirine birleştirilmesine neden olur.
Oldukça uzun, ama işe yarıyor (ve daha kısa bir yol olduğuna eminim).
QGIS'de WKT aracını kullanmak (ve düzenleme araçlarıyla ne kadar korkunç olduğumu keşfetmek), a olarak etiketlenmiş kümeyi görebileceğiniz aşağıdaki gibi kümeler üretir - yani tek renk.
Bir ST_AsText finaline ST_UNION (d.geom) koyarsanız, sonuçları doğrudan görebilirsiniz.
Yorumlarda daha fazla bilgi DÜZENLEYİN: Noktalarla başlarken tamponu orijinal çözümüme dahil etmeniz gerekecek - bu da şemayı taklit etmek için başlangıçta geçici CTE'ye koydum. Tamponları CTE sendikalarına eklemek daha kolay olacaktır, böylece tüm geometrileri bir kerede yapabilirsiniz. Dolayısıyla, örnek olarak 1000 arabellek mesafesi kullanıldığında, aşağıdakiler artık beklendiği gibi 3 küme döndürmektedir.
WITH temp(id, geom) AS
(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))
),
unions(geoms) AS
(SELECT st_buffer(ST_Union(geom), 1000) FROM temp GROUP BY id),
clusters(geoms) AS
(SELECT ST_CollectionExtract(unnest(ST_ClusterIntersecting(geoms)), 3)
FROM unions),
multis(id, geoms) AS
(SELECT row_number() over() as id, geoms FROM clusters)
SELECT id, ST_UNION(d.geom) FROM
(SELECT id, (ST_DUMP(geoms)).geom FROM multis) d GROUP BY id;