Czy można grupować według geometrii w PostGIS?


17

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?


Co GROUP BYzyskujesz? Czy to nie łączy unikalny klucz nbhd_id? Rozszerzasz sortowanie, co wydłuża czas działania, prawdopodobnie o więcej niż kolejne przyłączenie.
Vince

1
Pozwala mi to nie owijać kwerendy liczącej jako sub-kwerendy, aby dołączyć do nbhd_id - jeśli zwiększy czas wykonywania grupowania według geometrii, to jest to możliwy powód, aby tego NIE robić, prawda?
DPSSpatial

Odpowiedzi:


18

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 geomklauzula 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 BYdział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ę.


czy ten artykuł Pawła ma jakieś zmiany w tej odpowiedzi? blog.cleverelephant.ca/2017/09/postgis-operators.html
DPSSpatial
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.