PostGis与其他聚合集群

我想计算点的集群,并且为每个集群获取特定属性的总和(比方说,集群中每个点的分数的总和)

我已经设法使用ST_ClusterWithin构建集群,但我无法计算总和。

这是我试过的:

SELECT sum(score), unnest(ST_ClusterWithin(coordinates, 0.1)) AS cluster
FROM locations
GROUP BY cluster;

但是我收到以下错误ERROR: aggregate functions are not allowed in GROUP BY

如果我删除了GROUP BY ,我得到了所有位置的分数总和,这不是我想要的(我想要集群中位置的总和)


这是一个棘手的问题,st_clusterwithin api似乎并不适合应用于常见的情况。

我能找到的唯一解决方案是重新回到集群上,如下所示:

SELECT SUM(score), cluster FROM locations, (
    SELECT unnest(ST_ClusterWithin(coordinates, 0.1)) AS cluster
    FROM locations
) as location_clustered
WHERE ST_Contains(ST_CollectionExtract(cluster, 1), coordinates)
GROUP BY cluster;

编辑:我已经将ST_CollectionHomogenize更改为ST_CollectionExtract(<geometrycollection>, 1) (点1选择点, ST_CollectionExtract(<geometrycollection>, 1) 2选择2 ,多边形选择3 ),如下所示:https://gis.stackexchange.com/questions/195915/由于这个错误:https://trac.osgeo.org/postgis/ticket/3569

不要问我为什么你不能做ST_Contains(<geometrycollection>, <geometry>) ; 我们需要转换成可以作为参数使用的多点。

Meta:这个问题对于https://gis.stackexchange.com/是一个很好的匹配


使用PostGIS 2.3,人们可以从ST_ClusterDBSCAN函数中获益(第三个参数的选择将其减少为层次聚类),该函数直接返回相应的聚类索引:

WITH stat AS (
  SELECT
    score, ST_ClusterDBSCAN(coordinates, 0.1, 1) OVER () AS cluster_id
  FROM
    tmp_locations
)
SELECT
  cluster_id, SUM(score)
FROM
  stat
GROUP BY
  cluster_id
ORDER BY
  cluster_id
链接地址: http://www.djcxy.com/p/32175.html

上一篇: PostGis clustering with other aggregate

下一篇: Matrix exponentiation in Python