2016-02-18 15 views
7

Ich mag würde Cluster von Punkten berechnen und für jeden Cluster die Summe eines bestimmten Attribut zu erhalten (sagen wir mal, die Summe der Punkte von jedem Punkt im Cluster)PostGIS-Clustering mit anderen Aggregat

I bereits geschafft, Cluster mit ST_ClusterWithin zu bauen, aber ich kann die Summe nicht berechnen. Hier

ist, was ich versuchte:

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

aber ich bekomme die folgenden Fehler ERROR: aggregate functions are not allowed in GROUP BY

Wenn ich die GROUP BY entfernen, ich die Summe der Punkte für alle Standorte erhalten, was nicht, was ich bin will (ich möchte die Summe für Standorte im Cluster)

+0

Versuchen sie es mit einer anderen wählen wraping, und die Gruppe tun, indem sie in den äußeren wählen .... SELECT Summe, Cluster FROM (IHR QUERY) Gruppe von Cluster – sagi

+0

Kann nicht bekommt es funktioniert. Um in meiner äußeren Abfrage zu summieren, muss ich entweder das Score-Attribut in meiner inneren Abfrage gruppieren oder aggregieren (da ST_Clusterwithin bereits eine Aggregatfunktion ist) – Chris

Antwort

3

Dies ist eine knifflige und die st_clusterwithinin api scheint nicht gut für was ein häufiger Fall sein soll.

Die einzige Lösung, die ich finden konnte, war auf den Clustern und erneut zurück, wie folgt:

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: Ich ST_CollectionHomogenize-ST_CollectionExtract(<geometrycollection>, 1) (Pick-1 für Punkt, 2 für Linienzug und 3 für Polygon) geändert haben wie in dieser Antwort vorgeschlagen: https://gis.stackexchange.com/questions/195915/ wegen dieses Fehlers: https://trac.osgeo.org/postgis/ticket/3569

fragen Sie mich nicht, warum Sie nicht ST_Contains(<geometrycollection>, <geometry>) tun können; Wir müssen in eine Multipoint konvertieren, die als Argument zulässig ist.

Meta: diese Frage ein großartiges Spiel für https://gis.stackexchange.com/ gewesen wäre

+0

Große Antwort, danke – Chris

+0

Sollte das "Von Standorten" statt " FROM Standort, "in der äußeren Auswahl? – Vesanto

+0

@Vesanto danke, aktualisiert! – EoghanM

0

Mit PostGIS 2.3, könnte man von der ST_ClusterDBSCAN Funktion (die Wahl des dritten Parameters reduziert sie auf hierarchisches Clustering) profitieren, die direkt den entsprechenden Cluster zurückgibt Index:

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