Tham gia dựa trên sự chồng chéo tối đa trong PostGIS / PostGresQL?


11

Tôi có hai bộ đa giác trong hai bảng. Các bộ chồng lên nhau. Đối với mỗi đa giác trong tập A, tôi muốn lấy ID của đa giác trong tập B mà nó trùng nhau nhất. Tôi đang sử dụng PostgreSQL với tiện ích mở rộng PostGIS.

Tôi biết vừa đủ về SQL để biết rằng bạn chỉ có thể tham gia dựa trên các điều kiện đúng / sai. Vì vậy, điều này sẽ không hoạt động:

SELECT
  a.id as a_id,
  b.id as b_id,
FROM
  a
JOIN
  b
ON
  max(ST_Area(ST_Intersection(a.geom, b.geom)))

bởi vì max () không thể nằm trong mệnh đề ON.

ST_Intersects()là một thử nghiệm đúng / sai, vì vậy tôi có thể tham gia vào đó, nhưng đa giác trong tập A thường sẽ trùng lặp với nhiều hơn một đa giác trong tập B, và tôi cần biết cái nào trùng với nhau nhất . ST_Intects có lẽ chỉ cần trả lại ID trùng lặp đầu tiên mà nó gặp, bất kể mức độ trùng lặp.

Điều này có vẻ như là có thể làm được, nhưng nó vượt xa tôi. Có suy nghĩ gì không?

Câu trả lời:


13

Bạn có thể sử dụng một cái gì đó như:

SELECT DISTINCT ON (a.id)
  a.id as a_id,
  b.id as b_id,
  ST_Area(ST_Intersection(a.geom, b.geom)) as intersect_area
FROM a, b
ORDER BY a.id, ST_Area(ST_Intersection(a.geom, b.geom)) DESC

Nó:

1) Tính ST_Area (ST_Intersection (a.geom, b.geom)) cho mỗi (a, b) cặp bản ghi.

2) Đặt hàng chúng theo a.id và bởi interect_area khi a.id bằng nhau.

3) Trong mọi nhóm bằng a.id, nó chọn bản ghi linh sam (bản ghi đầu tiên có giao điểm cao nhất vì đặt hàng ở bước 2).


Điều đó giải quyết vấn đề rất gọn gàng. Cảm ơn cảm ơn! DISTINCT ONlà mới đối với tôi - rất tiện dụng trong bối cảnh này.
Hugh Promotionson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.