Tôi đang vật lộn với một vấn đề trong vài ngày và nhận ra nhiều người cũng gặp khó khăn khi chủ đề là giao điểm trong PostGIS (v2,5). Đó là lý do tại sao tôi quyết định hỏi một câu hỏi phổ biến và chi tiết hơn.
Tôi có bảng sau:
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 );
Nó trông như thế này:
Tôi muốn có được tất cả các đa giác con dựa trên giao điểm của đa giác cha. Đối với kết quả, nó sẽ được mong đợi:
- Các đa giác con không có sự chồng chéo giữa chúng.
- Một cột chứa tổng giá trị của đa giác cha của chúng,
- Một cột chứa số lượng đa giác cha của một loại
- Một cột chứa số lượng của một loại khác
- Một cột chứa danh mục của đa giác con, dựa trên quy tắc sau: -Nếu TẤT CẢ các đa giác cha là từ một lớp, đa giác con cũng có lớp này. Khác, thể loại của đa giác con là một thể loại thứ ba.
Vì vậy, nó trông giống như nó:
Vì vậy, cuối cùng, bảng sản lượng tạo ra (ví dụ này) sẽ có 7 hàng (tất cả 7, không chồng chéo, đa giác con), chứa các cột category
, sum_value
, ct_overlap_cat1
,ct_overlap_cat2
Đoạn mã sau tôi đã bắt đầu, cung cấp cho tôi các giao điểm riêng lẻ, so sánh cha mẹ này với cha mẹ khác.
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);
Làm thế nào để tôi lặp lại đệ quy thông qua kết quả của mã được đề cập này, rằng, độc lập với số lượng đa giác chồng lấp, tôi luôn nhận được đa giác 'nhỏ nhất' (con) của nó (Hình 2)?