Vì bạn nói rằng bạn nhận được một nhóm đa giác giao nhau cho mỗi đa giác mà bạn quan tâm, bạn có thể muốn tạo cái được gọi là "lớp phủ đa giác".
Đây không phải là chính xác những gì giải pháp của Adam đang làm. Để thấy sự khác biệt, hãy xem hình ảnh về giao lộ ABC:
Tôi tin rằng giải pháp của Adam sẽ tạo ra một đa giác "AB" bao trùm cả khu vực "AB! C" và "ABC", cũng như một đa giác "AC" bao gồm "AC! B" và "ABC" và " Đa giác BC "đó là" BC! A "và" ABC ". Vì vậy, các đa giác đầu ra "AB", "AC" và "BC" sẽ chồng lên vùng "ABC".
Một lớp phủ đa giác tạo ra các đa giác không chồng lấp, vì vậy AB! C sẽ là một đa giác và ABC sẽ là một đa giác.
Tạo lớp phủ đa giác trong PostGIS thực sự khá đơn giản.
Về cơ bản có ba bước.
Bước 1 là trích xuất đường kẻ [Lưu ý rằng tôi đang sử dụng vòng ngoài của đa giác, sẽ phức tạp hơn một chút nếu bạn muốn xử lý chính xác các lỗ]:
SELECT ST_ExteriorRing(polygon_col) AS the_geom FROM my_table) AS lines
Bước 2 là "nút" đường kẻ (tạo một nút tại mỗi giao lộ). Một số thư viện như JTS có các lớp "Noder" mà bạn có thể sử dụng để làm điều này, nhưng trong PostGIS, hàm ST_Union thực hiện điều đó cho bạn:
SELECT ST_Union(the_geom) AS the_geom FROM (...your lines...) AS noded_lines
Bước 3 là tạo tất cả các đa giác không chồng lấp có thể đến từ tất cả các dòng đó, được thực hiện bởi hàm ST_Polygonize :
SELECT ST_Polygonize(the_geom) AS the_geom FROM (...your noded lines...)
Bạn có thể lưu đầu ra của từng bước đó vào một bảng tạm thời hoặc bạn có thể kết hợp tất cả chúng vào một câu lệnh:
CREATE TABLE my_poly_overlay AS
SELECT geom FROM ST_Dump((
SELECT ST_Polygonize(the_geom) AS the_geom FROM (
SELECT ST_Union(the_geom) AS the_geom FROM (
SELECT ST_ExteriorRing(polygon_col) AS the_geom FROM my_table) AS lines
) AS noded_lines
)
)
Tôi đang sử dụng ST_Dump vì đầu ra của ST_Polygonize là một bộ sưu tập hình học và sẽ thuận tiện hơn khi có một bảng trong đó mỗi hàng là một trong các đa giác tạo nên lớp phủ đa giác.