Birkaç gün boyunca bir sorunla mücadele ediyorum ve konu PostGIS (v2.5) 'de kavşaklar olduğunda birçok insanın da takıldığını fark ettim. Bu yüzden daha ayrıntılı ve genel, ortak bir soru sormaya karar verdim.
Aşağıdaki tablo var:
DROP TABLE IF EXISTS tbl_foo;
CREATE TABLE tbl_foo (
id bigint NOT NULL,
geom public.geometry(MultiPolygon, 4326),
att_category character varying(15),
att_value integer
);
INSERT INTO tbl_foo (id, geom, att_category, att_value) VALUES
(1, ST_SetSRID('MULTIPOLYGON (((0 6, 0 12, 8 9, 0 6)))'::geometry,4326) , 'cat1', 2 );
INSERT INTO tbl_foo (id, geom, att_category, att_value) VALUES
(2, ST_SetSRID('MULTIPOLYGON (((5 0, 5 12, 9 12, 9 0, 5 0)))'::geometry,4326), 'cat1', 1 );
INSERT INTO tbl_foo (id, geom, att_category, att_value) VALUES
(3, ST_SetSRID('MULTIPOLYGON (((4 4, 3 8, 4 12, 7 14,10 12, 11 8, 10 4, 4 4)))'::geometry,4326) , 'cat2', 5 );
Şöyle görünüyor:
Tüm çokgenleri ana çokgenlerin kesişimine dayanarak almak istiyorum. Sonuç için beklenen:
- Aralarında çakışma olmayan çocuk çokgenler.
- Üst çokgenlerinin değerlerinin toplamını içeren bir sütun,
- Bir kategorideki ana çokgen sayısını içeren bir sütun
- Başka bir kategorinin sayısını içeren bir sütun
- Aşağıdaki kurala göre alt çokgenin kategorisini içeren bir sütun: -TÜM ana çokgenler bir sınıftan geliyorsa, alt çokgenin de bu sınıfı vardır. Aksi takdirde, çocuk poligonunun kategorisi üçüncü bir kategoridir.
Yani şöyle görünür:
Yani, sonunda, (bu örneğin) üretilen çıktı tablosu sütunları içeren 7 satır (7, örtüşmeyen, çocuk çokgen) sahip olacak category
, sum_value
, ct_overlap_cat1
,ct_overlap_cat2
Başladığım aşağıdaki kod, bir ebeveyn ile diğerini karşılaştırarak bireysel kavşakları veriyor.
SELECT
(ST_Dump(
ST_SymDifference(a.geom, b.geom)
)).geom
FROM tbl_foo a, tbl_foo b
WHERE a.ID < b.ID AND ST_INTERSECTS(a.geom, b.geom)
UNION ALL
SELECT
ST_Intersection(a.geom, b.geom) as geom
FROM tbl_foo a, tbl_foo b
WHERE a.ID < b.ID AND ST_INTERSECTS(a.geom, b.geom);
Örtüşen çokgenlerin sayısından bağımsız olarak her zaman onun en küçük (alt) çokgenlerini elde ettiğim bu kodun sonucunu özyinelemeli olarak nasıl değiştirebilirim (Şekil 2)?