Tôi đối mặt với một thách thức với PostGIS mà dường như tôi không thể quấn lấy đầu mình. Tôi biết tôi có thể giải quyết vấn đề này bằng ngôn ngữ lập trình (và đó là kế hoạch dự phòng của tôi), nhưng tôi thực sự muốn giải quyết vấn đề này trong PostGIS. Tôi đã thử tìm kiếm, nhưng không thể tìm thấy bất kỳ câu trả lời nào phù hợp với vấn đề của tôi, điều này có thể là do tôi không chắc chắn về các thuật ngữ tìm kiếm của mình, vì vậy xin vui lòng xin lỗi và chỉ cho tôi đi đúng hướng có câu trả lời.
Vấn đề của tôi là:
- Tôi có một bảng với Đa giác hỗn hợp / MultiPolygons
- Mỗi đa giác (đa) có một thuộc tính xếp hạng nó (ưu tiên)
- Mỗi đa giác cũng có một giá trị tôi muốn biết
- Tôi có một khu vực tìm kiếm (đa giác)
- Đối với khu vực truy vấn của tôi, tôi muốn tìm khu vực được bao phủ bởi mỗi giá trị đa giác
Thí dụ:
Nói rằng tôi có ba đa giác được mô tả bằng màu đỏ, xanh lá cây và màu chàm ở đây:

Và hình chữ nhật nhỏ hơn, màu xanh là đa giác truy vấn của tôi
Ngoài ra, các thuộc tính là
geom | rank | value
-------|------|----
red | 3 | 0.1
green | 1 | 0.2
indigo | 2 | 0.2
Điều tôi muốn là chọn những hình học này, sao cho thứ hạng cao nhất (màu xanh lá cây) lấp đầy tất cả các khu vực có thể (tức là giao điểm giữa geom truy vấn của tôi và geom đó), sau đó cao nhất tiếp theo (màu chàm) lấp đầy giao điểm giữa geom truy vấn và geom MINUS đã được bảo hiểm) vv
Tôi đã tìm thấy câu hỏi này: Sử dụng ST_Difference để xóa các tính năng chồng chéo? nhưng nó dường như không làm những gì tôi muốn.
Tôi có thể tự mình tìm ra cách tính các khu vực và như vậy, vì vậy một truy vấn cung cấp cho tôi ba hình học như được mô tả trong hình ảnh thứ hai là tốt!
Thông tin bổ sung: - Đây không phải là một bảng lớn (~ 2000 hàng) - có thể có 0 hoặc nhiều chồng chéo (không chỉ ba) - có thể không có bất kỳ đa giác nào trong khu vực truy vấn của tôi (hoặc chỉ trong các phần của nó) - i ' m đang chạy postgis 2.3 trên postgres 9.6.6
Giải pháp dự phòng của tôi là thực hiện một truy vấn như thế này:
SELECT
ST_Intersection(geom, querygeom) as intersection, rank, value
FROM mytable
WHERE ST_Intersects(geom, querygeom)
ORDER by rank asc
Và sau đó lặp đi lặp lại "chặt" các phần của hình học trong mã. Nhưng, như tôi đã nói, tôi thực sự muốn làm điều này trong PostGIS

WITH RECURSIVE ...CTE ( tài liệu và hướng dẫn chung )