È possibile raggruppare per geometria in PostGIS?


17

È corretto raggruppare per geometria?

Facciamo molti punti di conteggio per geometrie poligonali, il che implica prima di tutto intersecare i dati per contare le istanze degli studenti. per confine della scuola, gruppo di blocchi, ecc .:

SELECT
  n.nbhd_id
  , count(*) AS count_burglaries
FROM denver.crime AS c
  JOIN denver.neighborhoods AS n
    ON ST_Intersects(c.geom, n.geom)

WHERE c.offense_ty LIKE 'BURG%'
GROUP BY n.nbhd_id

Il secondo passaggio consiste nell'avvolgere una sottoquery per unire la geometria dalla tabella poligonale alla query conteggio:

SELECT

count.*
, n.nbhd_name
, n.geom
FROM (
SELECT
n.nbhd_id
, count(*) AS count_burglaries
FROM denver.crime AS c
JOIN denver.neighborhoods AS n
ON ST_Intersects(c.geom, n.geom)

WHERE c.offense_ty LIKE 'BURG%'
GROUP BY n.nbhd_id

) AS count

JOIN denver.neighborhoods AS n
ON count.nbhd_id = n.nbhd_id

Ma sembra che puoi anche usare la geometria in GROUP BY:

SELECT
n.nbhd_id
, n.nbhd_name
, n.geom

, count(*) AS count_burglaries
FROM denver.crime AS c
JOIN denver.neighborhoods AS n
ON ST_Intersects(c.geom, n.geom)

WHERE c.offense_ty LIKE 'BURG%'
GROUP BY n.nbhd_id, nbhd_name, n.geom

Includere la geometria nel GROUP BY è un approccio corretto?


Cosa GROUP BYti guadagna? Non è associabile con una chiave unica di nbhd_id? Stai allargando l'ordinamento, aumentando il tempo di esecuzione, probabilmente di più di un join successivo.
Vince,

1
Mi permette di non dover racchiudere la query di conteggio come sottoquery per unirmi su nbhd_id - se aumenta il tempo di esecuzione per raggruppare in base alla geometria, allora questo è un possibile motivo per NON farlo, non diresti?
DPSSpatial

Risposte:


18

In questo caso non c'è quasi nulla di sbagliato nel raggruppamento per geometria, poiché stai già raggruppando per un ID univoco ( nbhd_id). E, come fai notare, ti fa risparmiare un join e rende la query più pulita.

È importante sapere che una GROUP BY geomclausola di PostGIS 2.3 e precedenti raggruppa effettivamente le righe in base all'uguaglianza del riquadro di selezione, non all'uguaglianza geometrica. Con dati reali e non elaborati, ciò ha spesso lo stesso effetto del raggruppamento sull'uguaglianza geometrica (ed è molto più veloce), ma potrebbe non produrre risultati previsti quando più poligoni distinti hanno lo stesso riquadro di selezione. A partire da PostGIS 2.4, GROUP BYopera su una rigida definizione di uguaglianza geometrica, tenendo conto del punto iniziale e dell'orientamento delle geometrie.

Poiché stai già raggruppando nbhd_id, vedrai comunque righe separate anche se due poligoni di vicinato distinti condividono un rettangolo di selezione.


questo articolo di Paul ha qualche cambiamento su questa risposta? blog.cleverelephant.ca/2017/09/postgis-operators.html
DPSSpatial
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.