Partecipa in base alla massima sovrapposizione in PostGIS / PostGresQL?


11

Ho due serie di poligoni in due tabelle. I set si sovrappongono. Per ogni poligono nel set A, vorrei ottenere l'ID del poligono nel set B che si sovrappone maggiormente. Sto usando PostgreSQL con l'estensione PostGIS.

So abbastanza su SQL per sapere che puoi unirti solo in base a condizioni vere / false. Quindi questo non funzionerà:

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

perché max () non può essere nella clausola ON.

ST_Intersects()è un test vero / falso, quindi potrei unirmi a questo, ma i poligoni nel set A spesso si sovrappongono con più di un poligono nel set B, e devo sapere quale si sovrappone di più . Presumibilmente ST_Intersects restituirebbe semplicemente il primo ID di sovrapposizione rilevato, indipendentemente dall'entità della sovrapposizione.

Sembra che dovrebbe essere fattibile, ma è oltre me. qualche idea?

Risposte:


13

Puoi usare qualcosa come:

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

It:

1) Calcola ST_Area (ST_Intersection (a.geom, b.geom)) per ogni (a, b) coppia di record.

2) Li ordina per a.id e intersect_area quando a.id sono uguali.

3) In ogni gruppo di uguale a.id seleziona il primo record (il primo record ha la intersect_area più alta a causa dell'ordinamento al passaggio 2).


Ciò risolve il problema in modo molto ordinato. Grazie grazie! DISTINCT ONè nuovo per me - molto utile in questo contesto.
Hugh Stimson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.