Можно ли группировать по геометрии в 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

Но, похоже, вы также можете использовать геометрию в 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

Является ли включение геометрии в GROUP BY правильным подходом?

DPSSpatial
источник
Что GROUP BYвы получаете? Разве это не соединяется уникальным ключом nbhd_id? Вы расширяете сортировку, что увеличивает время выполнения, возможно, больше, чем последующее соединение.
Винс
1
Это позволяет мне не оборачивать запрос подсчета как подзапрос для присоединения к nbhd_id - если это увеличивает время выполнения для группировки по геометрии, то это является возможной причиной НЕ делать этого, не так ли?
DPSSpatial

Ответы:

18

В этом случае почти наверняка нет ничего плохого в группировке по геометрии, поскольку вы уже группируете по уникальному идентификатору ( nbhd_id). И, как вы отмечаете, это экономит ваше объединение и делает запрос чище.

Важно знать, что GROUP BY geomпредложение в PostGIS 2.3 и более ранних версиях фактически группирует строки на основе равенства ограничивающего прямоугольника, а не геометрического равенства. С реальными, не выдуманными данными это часто имеет тот же эффект, что и группирование по геометрическому равенству (и намного быстрее), но может не дать ожидаемых результатов, когда несколько разных полигонов имеют одну и ту же ограничивающую рамку. Начиная с PostGIS 2.4, GROUP BYдействует жесткое определение геометрического равенства с учетом начальной точки и ориентации геометрии.

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

dbaston
источник
есть ли в этой статье от Пола какие-либо изменения в этом ответе? blog.cleverelephant.ca/2017/09/postgis-operators.html
DPSSpatial