Можно ли группировать по геометрии?
Мы много подсчитываем точки по геометриям многоугольника, что включает в себя пересечение данных в первую очередь, чтобы подсчитать количество учеников. по школьной границе, группе блоков и т.д .:
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 правильным подходом?
postgis
grouping
st-geometry
DPSSpatial
источник
источник
GROUP BY
вы получаете? Разве это не соединяется уникальным ключомnbhd_id
? Вы расширяете сортировку, что увеличивает время выполнения, возможно, больше, чем последующее соединение.Ответы:
В этом случае почти наверняка нет ничего плохого в группировке по геометрии, поскольку вы уже группируете по уникальному идентификатору (
nbhd_id
). И, как вы отмечаете, это экономит ваше объединение и делает запрос чище.Важно знать, что
GROUP BY geom
предложение в PostGIS 2.3 и более ранних версиях фактически группирует строки на основе равенства ограничивающего прямоугольника, а не геометрического равенства. С реальными, не выдуманными данными это часто имеет тот же эффект, что и группирование по геометрическому равенству (и намного быстрее), но может не дать ожидаемых результатов, когда несколько разных полигонов имеют одну и ту же ограничивающую рамку. Начиная с PostGIS 2.4,GROUP BY
действует жесткое определение геометрического равенства с учетом начальной точки и ориентации геометрии.Поскольку вы уже группируете
nbhd_id
, вы по-прежнему будете видеть отдельные строки, даже если два разных многоугольника соседства имеют ограничивающий прямоугольник.источник