Czy można grupować według geometrii?
Wykonujemy wiele punktów zliczania według geometrii wielokątów, co polega na przecięciu danych w celu zliczenia wystąpień studentów. według granicy szkoły, grupy bloków itp .:
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
Drugim krokiem jest zawinięcie zapytania częściowego w celu połączenia geometrii z tabeli wielokątów z powrotem do zapytania zliczającego:
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
Wygląda jednak na to, że możesz także używać geometrii w 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
Czy uwzględnienie geometrii w GROUP BY jest poprawnym podejściem?
postgis
grouping
st-geometry
DPSSpatial
źródło
źródło
GROUP BY
zyskujesz? Czy to nie łączy unikalny klucznbhd_id
? Rozszerzasz sortowanie, co wydłuża czas działania, prawdopodobnie o więcej niż kolejne przyłączenie.Odpowiedzi:
W tym przypadku prawie na pewno nie ma nic złego w grupowaniu według geometrii, ponieważ już grupujesz według unikalnego identyfikatora (
nbhd_id
). I, jak zauważyłeś, zapisuje ci połączenie i sprawia, że zapytanie jest czystsze.Ważne jest, aby wiedzieć, że
GROUP BY geom
klauzula w PostGIS 2.3 i wcześniejszych faktycznie grupuje wiersze na podstawie równości obwiedni, a nie równości geometrycznej. W przypadku rzeczywistych, nieskonstruowanych danych, ma to często taki sam efekt jak grupowanie na równości geometrycznej (i jest znacznie szybsze), ale może nie dawać oczekiwanych rezultatów, gdy wiele różnych wielokątów ma tę samą ramkę graniczną. Począwszy od PostGIS 2.4,GROUP BY
działa na sztywnej definicji równości geometrycznej, biorąc pod uwagę punkt początkowy i orientację geometrii.Ponieważ już grupujesz
nbhd_id
, nadal zobaczysz osobne wiersze, nawet jeśli dwa odrębne wielokąty sąsiedztwa dzielą obwiednię.źródło