É possível agrupar por geometria no PostGIS?

17

É possível agrupar por geometria?

Fazemos muitos pontos de contagem por geometrias de polígonos, o que envolve a interseção dos dados primeiro para contar instâncias de alunos. por limite de escola, grupo de blocos, 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

A segunda etapa é agrupar uma subconsulta para associar a geometria da tabela de polígonos de volta à consulta de contagem:

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

Mas parece que você também pode usar a geometria no 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

A inclusão da geometria no GROUP BY é uma abordagem correta?

DPSSpatial
fonte
O que GROUP BYvocê ganha? Não é possível unir por uma chave exclusiva de nbhd_id? Você está ampliando a classificação, o que aumenta o tempo de execução, possivelmente em mais de uma associação subsequente.
Vince
1
Ele me permite não precisar agrupar a consulta de contagem como uma subconsulta para ingressar no nbhd_id - se aumentar o tempo de execução para agrupar por geometria, esse é um possível motivo para NÃO fazer isso, não é?
precisa saber é o seguinte

Respostas:

18

Certamente, não há nada de errado em agrupar por geometria neste caso, já que você já está agrupando por um ID exclusivo ( nbhd_id). E, como você indica, ele economiza uma associação e torna a consulta mais limpa.

É importante saber que uma GROUP BY geomcláusula no PostGIS 2.3 e versões anteriores realmente agrupa linhas com base na igualdade da caixa delimitadora, não na igualdade geométrica. Com dados reais e não planejados, isso geralmente tem o mesmo efeito que o agrupamento na igualdade geométrica (e é muito mais rápido), mas pode não produzir resultados esperados quando vários polígonos distintos têm a mesma caixa delimitadora. A partir do PostGIS 2.4, GROUP BYopera em uma definição rígida de igualdade geométrica, levando em consideração o ponto inicial e a orientação das geometrias.

Como você já está agrupando nbhd_id, ainda verá linhas separadas, mesmo que dois polígonos de vizinhança distintos compartilhem uma caixa delimitadora.

dbaston
fonte
este artigo de Paulo tem alguma alteração nesta resposta? blog.cleverelephant.ca/2017/09/postgis-operators.html
DPSSpatial