Чи нормально групуватися за геометрією в PostGIS?


17

Чи добре згрупуватися за геометрією?

Ми робимо багато підрахунків точок за геометрією багатокутника, що передбачає перетин даних спочатку, щоб підрахувати екземпляри учнів. за межами школи, блокової групи тощо:

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

Другий крок - загортання в підзапит, щоб приєднати геометрію від таблиці багатокутника назад до запиту підрахунку:

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

Але, здається, ви також можете використовувати геометрію в групі 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

Чи правильним є підхід геометрії до GROUP BY?


Що виграєте у GROUP BYвас? Хіба це не можна приєднати за допомогою унікального ключа nbhd_id? Ви робите сортування ширшим, що збільшує час виконання, можливо, більш ніж наступним з'єднанням.
Вінс

1
Це дозволяє мені не потрібно обробляти запит підрахунку як підзапит, щоб приєднатись до nbhd_id - якщо це збільшує час виконання для групування за геометрією, то це можлива причина НЕ робити цього, чи не скажете ви?
DPSSpatial

Відповіді:


18

З групуванням за геометрією в цьому випадку майже напевно немає нічого поганого, оскільки ви вже групуєтесь за унікальним ідентифікатором ( nbhd_id). І, як ви зазначаєте, це заощаджує вам приєднання та робить запит чистішим.

Важливо знати, що GROUP BY geomзастереження в PostGIS 2.3 та попередніх версіях насправді групує рядки на основі рівності обмежувальної рамки, а не геометричної рівності. Що стосується реальних даних, що не піддаються обробці, це часто має той самий ефект, що і групування на геометричній рівності (і набагато швидше), але може не дати очікуваних результатів, коли кілька різних багатокутників мають одне і те ж обмежувальне поле. Починаючи з PostGIS 2.4, GROUP BYпрацює на жорсткому визначенні геометричної рівності з урахуванням початкової точки та орієнтації геометрій.

Оскільки ви вже групуєтесь nbhd_id, ви все одно побачите окремі рядки, навіть якщо два різних полігони сусідства розділяють обмежувальне поле.


чи є в цій статті від Пола якісь зміни щодо цієї відповіді? blog.cleverelephant.ca/2017/09/postgis-operators.html
DPSSpatial
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.