Es gibt mindestens zwei gute Clustering-Methoden für PostGIS: k- Mittel (über kmeans-postgresql
Erweiterung) oder Clustering-Geometrien innerhalb eines Schwellenabstands (PostGIS 2.2).
1) k bedeutet mitkmeans-postgresql
Installation: Auf einem POSIX-Hostsystem muss PostgreSQL 8.4 oder höher installiert sein (ich würde nicht wissen, wo ich mit MS Windows anfangen soll). Wenn Sie dies aus Paketen installiert haben, stellen Sie sicher, dass Sie auch die Entwicklungspakete haben (z. B. postgresql-devel
für CentOS). Herunterladen und extrahieren:
wget http://api.pgxn.org/dist/kmeans/1.1.0/kmeans-1.1.0.zip
unzip kmeans-1.1.0.zip
cd kmeans-1.1.0/
Vor dem Erstellen müssen Sie die USE_PGXS
Umgebungsvariable festlegen (in meinem vorherigen Beitrag wurde angewiesen, diesen Teil der zu löschen Makefile
, was nicht die beste Option war). Einer dieser beiden Befehle sollte für Ihre Unix-Shell funktionieren:
# bash
export USE_PGXS=1
# csh
setenv USE_PGXS 1
Erstellen und installieren Sie nun die Erweiterung:
make
make install
psql -f /usr/share/pgsql/contrib/kmeans.sql -U postgres -D postgis
(Hinweis: Ich habe dies auch mit Ubuntu 10.10 versucht, aber kein Glück, da der Pfad in pg_config --pgxs
nicht existiert! Dies ist wahrscheinlich ein Ubuntu-Paketierungsfehler.)
Verwendung / Beispiel: Sie sollten irgendwo eine Punktetabelle haben (ich habe eine Reihe von Pseudozufallspunkten in QGIS gezeichnet). Hier ist ein Beispiel für das, was ich getan habe:
SELECT kmeans, count(*), ST_Centroid(ST_Collect(geom)) AS geom
FROM (
SELECT kmeans(ARRAY[ST_X(geom), ST_Y(geom)], 5) OVER (), geom
FROM rand_point
) AS ksub
GROUP BY kmeans
ORDER BY kmeans;
Das 5
im zweiten Argument der kmeans
Fensterfunktion angegebene I ist die K- Ganzzahl, um fünf Cluster zu erzeugen. Sie können dies in eine beliebige Ganzzahl ändern.
Unten sind die 31 Pseudozufallspunkte, die ich gezeichnet habe, und die fünf Zentroide mit der Bezeichnung, die die Anzahl in jedem Cluster angibt. Dies wurde mit der obigen SQL-Abfrage erstellt.
Sie können auch versuchen, mit ST_MinimumBoundingCircle zu veranschaulichen, wo sich diese Cluster befinden :
SELECT kmeans, ST_MinimumBoundingCircle(ST_Collect(geom)) AS circle
FROM (
SELECT kmeans(ARRAY[ST_X(geom), ST_Y(geom)], 5) OVER (), geom
FROM rand_point
) AS ksub
GROUP BY kmeans
ORDER BY kmeans;
2) Clustering innerhalb eines Schwellenabstandes mit ST_ClusterWithin
Diese Aggregatfunktion ist in PostGIS 2.2 enthalten und gibt ein Array von GeometryCollections zurück, in dem sich alle Komponenten in einem Abstand voneinander befinden.
Hier ein Anwendungsbeispiel, bei dem ein Abstand von 100,0 der Schwellenwert ist, der zu 5 verschiedenen Clustern führt:
SELECT row_number() over () AS id,
ST_NumGeometries(gc),
gc AS geom_collection,
ST_Centroid(gc) AS centroid,
ST_MinimumBoundingCircle(gc) AS circle,
sqrt(ST_Area(ST_MinimumBoundingCircle(gc)) / pi()) AS radius
FROM (
SELECT unnest(ST_ClusterWithin(geom, 100)) gc
FROM rand_point
) f;
Der größte mittlere Cluster hat einen umschließenden Kreisradius von 65,3 Einheiten oder ungefähr 130, was größer als der Schwellenwert ist. Dies liegt daran, dass die einzelnen Abstände zwischen den Elementgeometrien kleiner als der Schwellenwert sind, sodass sie zu einem größeren Cluster zusammengefasst werden.