¿Está bien agrupar por geometría en PostGIS?

17

¿Está bien agrupar por geometría?

Hacemos muchos puntos de recuento por geometrías de polígonos, lo que implica la intersección de los datos primero para contar instancias de estudiantes. por límite escolar, grupo de bloques, etc.

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

El segundo paso es ajustar una subconsulta para unir la geometría de la tabla de polígonos a la consulta de recuento:

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

Pero parece que también puedes usar geometría en 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

¿Incluir geometría en GROUP BY es un enfoque correcto?

DPSSpacial
fuente
¿Qué GROUP BYte gana? ¿No se puede unir con una clave única de nbhd_id? Está ampliando el orden, lo que aumenta el tiempo de ejecución, posiblemente en más de una unión posterior.
Vince
1
Me permite no tener que ajustar la consulta de recuento como una subconsulta para unirme en el nbhd_id; si aumenta el tiempo de ejecución para agrupar por geometría, entonces esa es una posible razón para NO hacer esto, ¿no dirías?
DPSEspacial

Respuestas:

18

Es casi seguro que no hay nada malo en agrupar por geometría en este caso, ya que ya está agrupando por un ID único ( nbhd_id). Y, como usted señala, le ahorra una unión y hace que la consulta sea más limpia.

Es importante saber que una GROUP BY geomcláusula en PostGIS 2.3 y anteriores en realidad agrupa filas basadas en la igualdad del cuadro delimitador, no en la igualdad geométrica. Con datos reales no inventados, esto a menudo tiene el mismo efecto que agrupar en igualdad geométrica (y es mucho más rápido), pero puede no producir los resultados esperados cuando varios polígonos distintos tienen el mismo cuadro delimitador. Comenzando en PostGIS 2.4, GROUP BYopera en una definición rígida de igualdad geométrica, teniendo en cuenta el punto de inicio y la orientación de las geometrías.

Debido a que ya está agrupando nbhd_id, aún verá filas separadas incluso si dos polígonos vecinos distintos comparten un cuadro delimitador.

dbaston
fuente
¿Este artículo de Paul tiene algún cambio en esta respuesta? blog.cleverelephant.ca/2017/09/postgis-operators.html
DPSSpatial