Est-il possible de regrouper par géométrie dans PostGIS?

17

Est-il OK de regrouper par géométrie?

Nous comptons beaucoup de points par géométrie polygonale, ce qui implique de couper les données en premier afin de compter les instances des élèves. par limite d'école, groupe de blocs, 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

La deuxième étape consiste à encapsuler dans une sous-requête afin de joindre la géométrie de la table des polygones à la requête de comptage:

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

Mais il semble que vous pouvez également utiliser la géométrie dans 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

L'inclusion de la géométrie dans GROUP BY est-elle une approche correcte?

DPSSpatial
la source
Qu'est-ce que cela GROUP BYvous rapporte? N'est-il pas joignable par une clé unique de nbhd_id? Vous élargissez le tri, ce qui augmente le temps d'exécution, éventuellement de plus d'une jointure ultérieure.
Vince
1
Cela me permet de ne pas avoir à encapsuler la requête de comptage en tant que sous-requête à joindre sur le nbhd_id - si cela augmente le temps d'exécution pour regrouper par géométrie, alors c'est une raison possible de NE PAS le faire, ne diriez-vous pas?
DPSSpatial

Réponses:

18

Il n'y a presque certainement rien de mal à grouper par géométrie dans ce cas, puisque vous êtes déjà en train de grouper par un ID unique ( nbhd_id). Et, comme vous le faites remarquer, cela vous permet d'économiser une jointure et de nettoyer la requête.

Il est important de savoir qu'une GROUP BY geomclause dans PostGIS 2.3 et versions antérieures regroupe en fait des lignes en fonction de l'égalité de la boîte englobante, et non de l'égalité géométrique. Avec des données réelles et non artificielles, cela a souvent le même effet que le regroupement sur l'égalité géométrique (et est beaucoup plus rapide), mais peut ne pas produire les résultats attendus lorsque plusieurs polygones distincts ont le même cadre de délimitation. À partir de PostGIS 2.4, GROUP BYfonctionne sur une définition rigide de l'égalité géométrique, en tenant compte du point de départ et de l'orientation des géométries.

Étant donné que vous effectuez déjà un regroupement nbhd_id, vous verrez toujours des lignes distinctes même si deux polygones de voisinage distincts partagent un cadre de sélection.

dbaston
la source
cet article de Paul a-t-il un changement sur cette réponse? blog.cleverelephant.ca/2017/09/postgis-operators.html
DPSSpatial