Rejoindre sur la base d'un chevauchement maximal dans PostGIS / PostGresQL?

11

J'ai deux ensembles de polygones dans deux tables. Les ensembles se chevauchent. Pour chaque polygone de l'ensemble A, je voudrais obtenir l'ID du polygone de l'ensemble B qui se chevauche le plus. J'utilise PostgreSQL avec l'extension PostGIS.

Je sais juste assez de choses sur SQL pour savoir que vous ne pouvez adhérer qu'en fonction de conditions vraies / fausses. Donc ça ne marchera pas:

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

car max () ne peut pas être dans la clause ON.

ST_Intersects()est un test vrai / faux, donc je pourrais me joindre à cela, mais les polygones de l'ensemble A se chevauchent souvent avec plus d'un polygone de l'ensemble B, et j'ai besoin de savoir lequel se chevauche le plus . ST_Intersects retournerait probablement le premier ID de chevauchement rencontré, quelle que soit l'étendue du chevauchement.

Cela semble être réalisable, mais cela me dépasse. Des pensées?

Hugh Stimson
la source

Réponses:

13

Vous pouvez utiliser quelque chose comme:

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

Il:

1) Calcule ST_Area (ST_Intersection (a.geom, b.geom)) pour chaque (a, b) paire d'enregistrements.

2) Les ordonne par a.id et par intersect_area lorsque a.id sont égaux.

3) Dans chaque groupe d'égalité a.id, il sélectionne le premier enregistrement (le premier enregistrement a la plus haute intersect_area en raison de l'ordre à l'étape 2).

Igor Romanchenko
la source
Cela résout très bien le problème. Merci merci! DISTINCT ONest nouveau pour moi - très pratique dans ce contexte.
Hugh Stimson