在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中包括几何体是否正确?


你有什么GROUP BY收获?它不是可以通过唯一键来加入的nbhd_id吗?您正在扩大排序范围,从而增加了运行时间,可能比后续的连接更多。
文斯(Vince)2009年

1
它使我不必将count查询包装为要连接到nbhd_id的子查询-如果它增加了按几何进行分组的运行时间,那么这就是不这样做的可能原因,您不是说吗?
DPSSpatial

Answers:


18

在这种情况下,按几何进行分组几乎没有问题,因为您已经按唯一的ID(nbhd_id)进行分组。而且,正如您指出的那样,它可以节省连接并使查询更整洁。

重要的是要知道,GROUP BY geomPostGIS 2.3及更早版本中的子句实际上是根据边界框等式而不是几何等式对行进行分组的。对于真实的非人为数据,这通常与对几何相等性进行分组具有相同的效果(并且速度更快),但是当多个不同的多边形具有相同的边界框时,可能不会产生预期的结果。从PostGIS 2.4开始GROUP BY,考虑了几何的起点和方向,对几何等式进行了严格的定义。

因为您已经在上分组nbhd_id,所以即使两个不同的邻域多边形共享一个边界框,您仍将看到单独的行。


保罗的这篇文章对这个答案有什么改变吗?blog.cleverelephant.ca/2017/09/postgis-operators.html
DPSSpatial
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.