Ist es in PostGIS in Ordnung, nach Geometrie zu gruppieren?

17

Ist es in Ordnung, nach Geometrie zu gruppieren?

Wir zählen viele Punkte anhand von Polygongeometrien, wobei die Daten zuerst geschnitten werden, um Instanzen von Schülern zu zählen. nach Schulgrenze, Blockgruppe usw.:

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

Der zweite Schritt ist das Einschließen einer Unterabfrage, um die Geometrie aus der Polygontabelle wieder mit der Zählabfrage zu verknüpfen:

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

Sie können Geometrie aber auch in GROUP BY verwenden:

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

Ist die Einbeziehung von Geometrie in GROUP BY ein korrekter Ansatz?

DPSSpatial
quelle
Was bringt GROUP BYdir das? Ist es nicht mit einem eindeutigen Schlüssel von verbindbar nbhd_id? Sie erweitern die Sortierung, wodurch sich die Laufzeit möglicherweise um mehr als einen nachfolgenden Join erhöht.
Vince
1
Es ermöglicht mir, die Count-Abfrage nicht als Unterabfrage zu verpacken, um der nbhd_id beizutreten. Wenn dies die Laufzeit erhöht, um nach Geometrie zu gruppieren, ist dies ein möglicher Grund, dies NICHT zu tun, oder?
DPSSpatial,

Antworten:

18

In diesem Fall ist die Gruppierung nach Geometrie mit ziemlicher Sicherheit kein Problem, da Sie bereits nach einer eindeutigen ID gruppiert sind ( nbhd_id). Und wie Sie bereits betont haben, erspart es Ihnen einen Join und macht die Abfrage übersichtlicher.

Es ist wichtig zu wissen, dass eine GROUP BY geomKlausel in PostGIS 2.3 und früheren Versionen Zeilen auf der Grundlage der Begrenzungsrahmengleichheit und nicht der geometrischen Gleichheit gruppiert. Bei realen, nicht erfundenen Daten hat dies häufig den gleichen Effekt wie eine Gruppierung auf geometrische Gleichheit (und ist viel schneller), führt jedoch möglicherweise nicht zu erwarteten Ergebnissen, wenn mehrere unterschiedliche Polygone denselben Begrenzungsrahmen haben. Ab PostGIS 2.4 wird GROUP BYeine starre Definition der geometrischen Gleichheit unter Berücksichtigung des Startpunkts und der Ausrichtung von Geometrien verwendet.

Da Sie bereits eine Gruppierung nbhd_idvornehmen, werden auch dann separate Zeilen angezeigt, wenn zwei unterschiedliche Nachbarschaftspolygone einen Begrenzungsrahmen gemeinsam nutzen.

dbaston
quelle
Hat dieser Artikel von Paulus irgendeine Änderung an dieser Antwort? blog.cleverelephant.ca/2017/09/postgis-operators.html
DPSSpatial