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?

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


Cela résout très bien le problème. Merci merci! DISTINCT ONest nouveau pour moi - très pratique dans ce contexte.
Hugh Stimson
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.