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?
postgis
grouping
st-geometry
DPSSpatial
la source
la source
GROUP BY
vous rapporte? N'est-il pas joignable par une clé unique denbhd_id
? Vous élargissez le tri, ce qui augmente le temps d'exécution, éventuellement de plus d'une jointure ultérieure.Réponses:
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 geom
clause 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 BY
fonctionne 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.la source