2016-02-18 30 views
7

desidero calcolare gruppo di punti e, per ogni cluster per ottenere la somma di un attributo specifico (diciamo, la somma dei punteggi di ogni punto del cluster)PostGIS raggruppamento con altro aggregato

I sono già riuscito a creare cluster usando ST_ClusterWithin ma non riesco a calcolare la somma.

Ecco cosa ho provato:

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

ma ottengo il seguente errore ERROR: aggregate functions are not allowed in GROUP BY

Se rimuovo il GROUP BY, ottengo la somma del punteggio per tutte le posizioni, che non è quello che ho voglio (Voglio la somma per le posizioni nel cluster)

+0

Prova wraping con un altro di selezione, e fare il gruppo da in quello esterno selezionare .... sELEZIONA somma, cluster da (la query) gruppo per cluster – sagi

+0

non può farlo funzionare. Per riassumere nella mia query esterna, ho bisogno di raggruppare o aggregare l'attributo punteggio nella mia query interna (perché ST_Clusterwithin è già una funzione aggregata) – Chris

risposta

3

Questo è un problema e lo st_clusterwith in api non sembra ben progettato per quello che dovrebbe essere un caso comune.

L'unica soluzione che ho trovato è stato per ricongiungersi di nuovo in cluster come segue:

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; 

Edit: ho cambiato ST_CollectionHomogenize-ST_CollectionExtract(<geometrycollection>, 1) (pick 1 per il punto, 2 per stringa lineare e 3 per poligono) come suggerito in questa risposta: https://gis.stackexchange.com/questions/195915/ a causa di questo bug: https://trac.osgeo.org/postgis/ticket/3569

non mi chiedere perché non si può fare ST_Contains(<geometrycollection>, <geometry>); Abbiamo bisogno di convertire in un multipunto che è ammissibile come argomento.

Meta: questa domanda sarebbe stata una grande partita per https://gis.stackexchange.com/

+0

Ottima risposta, grazie – Chris

+0

Dovrebbe essere "FROM locations", invece di " Dalla posizione, "nella selezione esterna? – Vesanto

+0

@Vesanto grazie, aggiornato! – EoghanM

0

Con PostGIS 2.3, si potrebbe trarre profitto dalla funzione ST_ClusterDBSCAN (la scelta del terzo parametro riduce al clustering gerarchico) che restituisce direttamente il cluster corrispondente Indice:

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