PostGIS / PostGresQL에서 최대 중복을 기반으로 가입 하시겠습니까?


11

두 테이블에 두 개의 다각형 세트가 있습니다. 세트가 서로 겹칩니다. 세트 A의 각 다각형에 대해 세트 B의 다각형의 ID가 가장 겹치는 것을 원합니다. PostGIS 확장과 함께 PostgreSQL을 사용하고 있습니다.

나는 참 / 거짓 조건에 대해서만 조인 할 수 있다는 것을 알기에 SQL에 대해 충분히 알고 있습니다. 그래서 이것은 작동하지 않습니다 :

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)))

max ()는 ON 절에있을 수 없기 때문입니다.

ST_Intersects()true / false 테스트이므로 결합 할 수 있지만 세트 A의 다각형은 종종 세트 B의 둘 이상의 다각형과 겹치므로 어느 것이 가장 겹치는 지 알아야합니다 . ST_Intersects는 겹치는 정도에 관계없이 처음 겹친 ID를 반환합니다.

이것은 할 수 있어야하는 것처럼 보이지만 나 저쪽에 있습니다. 이견있는 사람?

답변:


13

다음과 같은 것을 사용할 수 있습니다.

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

그것:

1) 모든 (a, b) 레코드 쌍에 대해 ST_Area (ST_Intersection (a.geom, b.geom))를 계산합니다.

2) a.id가 같으면 a.id 및 intersect_area로 주문하십시오.

3) 동일한 a.id의 모든 그룹에서 firs 레코드를 선택합니다 (첫 번째 레코드는 2 단계의 순서 때문에 intersect_area가 가장 높습니다).


그것은 문제를 매우 깔끔하게 해결합니다. 감사합니다 감사합니다! DISTINCT ON이 상황에서 매우 편리합니다.
휴 스팀슨
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.