2016-02-18 102 views
7

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,我得到的分數的總和的所有位置,這是不是我想要(我想要在羣集中的位置的總和)

+0

嘗試用另一種選擇包木窗它,並通過在外部做組選擇.... SELECT總和,產業集羣的(您的查詢)組由集羣 – sagi

+0

不能讓它工作。爲了總結我的外部查詢,我需要在我的內部查詢中對分數屬性進行分組或彙總(因爲ST_Clusterwithin已經是一個聚合函數) – Chris

回答

3

這是一個棘手的一個和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_CollectionHomogenizeST_CollectionExtract(<geometrycollection>, 1)(選擇多邊形1爲點,2的線串和3)如建議在這個答案: https://gis.stackexchange.com/questions/195915/ 因爲這個錯誤:https://trac.osgeo.org/postgis/ticket/3569

不要問我,你爲什麼不能做ST_Contains(<geometrycollection>, <geometry>); 我們需要轉換爲允許作爲參數的多點。

元:這個問題本來是一個偉大的比賽爲https://gis.stackexchange.com/

+0

很好的答案,謝謝 – Chris

+0

如果是「FROM locations」而不是「 FROM位置「,在外部選擇? – Vesanto

+0

@Vesanto謝謝,更新! – EoghanM

0

在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