Приєднатися на основі максимального збігу в PostGIS / PostGresQL?


11

У мене два набори многокутників у двох таблицях. Набори перетинаються один з одним. Для кожного багатокутника в наборі A я хотів би отримати ідентифікацію полігону в наборі B, який він найбільше перекривається. Я використовую PostgreSQL з розширенням PostGIS.

Я знаю досить просто про 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()це істина / неправда тест, так що я міг би приєднатися на що, але багатокутники безлічі А часто перетинаються з більш ніж одного багатокутника в безлічі В, і мені потрібно знати , який з них перекриває більшість . ST_Intersects, ймовірно, просто поверне перший ідентифікатор, що перекривається, на який він натрапив, незалежно від ступеня перекриття.

Це здається, що це має бути спроможним, але це поза мене. Будь-які думки?

Відповіді:


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) Обчислює ST_Area (ST_Intersection (a.geom, b.geom)) для кожної (a, b) пари записів.

2) Замовляє їх a.id та intersect_area, коли a.id рівні.

3) У кожній групі рівних a.id вибирає запис перших (перший запис має найвищий проміжок_area через замовлення на кроці 2).


Це вирішує проблему дуже акуратно. Дякую дякую! DISTINCT ONдля мене нова - дуже зручна в цьому контексті.
Х'ю Стімсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.