Ich suche nach einem räumlichen Clustering-Algorithmus, um ihn in einer PostGIS-fähigen Datenbank für Punkt-Features zu verwenden. Ich werde die Funktion plpgsql schreiben, die den Abstand zwischen Punkten innerhalb desselben Clusters als Eingabe misst. Bei der Ausgabe gibt die Funktion ein Array von Clustern zurück. Die naheliegendste Lösung besteht darin, um das Feature herum Pufferzonen zu erstellen und in diesem Puffer nach Features zu suchen. Wenn solche Features vorhanden sind, erstellen Sie weiterhin einen Puffer um sie herum usw. Wenn solche Features nicht vorhanden sind, bedeutet dies, dass die Clustererstellung abgeschlossen ist. Vielleicht gibt es einige clevere Lösungen?
postgis
clustering
drnextgis
quelle
quelle
Antworten:
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 mit
kmeans-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:Vor dem Erstellen müssen Sie die
USE_PGXS
Umgebungsvariable festlegen (in meinem vorherigen Beitrag wurde angewiesen, diesen Teil der zu löschenMakefile
, was nicht die beste Option war). Einer dieser beiden Befehle sollte für Ihre Unix-Shell funktionieren:Erstellen und installieren Sie nun die Erweiterung:
(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:
Das
5
im zweiten Argument derkmeans
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 :
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:
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.
quelle
Ich habe eine Funktion geschrieben, die Cluster von Features basierend auf dem Abstand zwischen ihnen berechnet und einen konvexen Rumpf über diesen Features erstellt:
Beispiel für die Verwendung dieser Funktion:
'poi' - Name des Layers, 'wkb_geometry' - Name der Geometriespalte, 'ogc_fid' - Primärschlüssel der Tabelle, 14000 - Clusterabstand.
Das Ergebnis der Verwendung dieser Funktion:
quelle
geometry
Spalte in Ihrer Tabelle erstellen, nicht einzeln speichern und Spalten mit eindeutigen Werten (IDs) erstellen.Das bisher vielversprechendste, was ich gefunden habe, ist diese Erweiterung für K-Means-Clustering als Fensterfunktion: http://pgxn.org/dist/kmeans/
Ich konnte es jedoch noch nicht erfolgreich installieren.
Andernfalls können Sie für das grundlegende Grid-Clustering SnapToGrid verwenden .
quelle
Komplementäre Antwort von @MikeT ...
Für MS Windows:
Bedarf:
Was du tun wirst:
cl.exe
Compiler, um eine DLL mitkmeans
Funktion zu generieren .Schritte:
Öffnen Sie das
kmeans.c
in einem beliebigen Editor:Nach den
#include
Zeilen definieren Sie das DLLEXPORT-Makro mit:Stellen Sie
DLLEXPORT
vor jede dieser Zeilen:Öffnen Sie die Visual C ++ - Befehlszeile.
In der Kommandozeile:
kmeans-postgresql
.SET POSTGRESPATH=C:\Program Files\PostgreSQL\9.5
Lauf
Kopieren Sie das
kmeans.dll
an%POSTGRESPATH%\lib
Führen Sie nun den SQL-Befehl in Ihrer Datenbank aus, um die Funktion zu "ERSTELLEN".
quelle
Hier ist eine Möglichkeit, das Ergebnis der in 2) angegebenen PostGIS-Abfrage in dieser Antwort in QGIS anzuzeigen
Da QGIS weder Geometriesammlungen noch andere Datentypen in derselben Geometriespalte verarbeitet, habe ich zwei Ebenen erstellt, eine für Cluster und eine für Clusterpunkte.
Erstens brauchen Sie für Cluster nur Polygone, andere Ergebnisse sind Einsamkeitspunkte:
Dann müssen Sie für Clusterpunkte Geometriesammlungen in Mehrpunkt transformieren:
Einige Punkte haben die gleichen Koordinaten, sodass die Beschriftung verwirrend sein kann.
quelle
Sie können die Kmeans-Lösung einfacher mit der ST_ClusterKMeans- Methode verwenden, die in postgis ab 2.3 verfügbar ist. Beispiel:
Der Begrenzungsrahmen für Features wird im obigen Beispiel als Clustergeometrie verwendet. Das erste Bild zeigt die Originalgeometrien und das zweite ist das Ergebnis der obigen Auswahl.
quelle
Bottom-up-Clustering-Lösung von Holen Sie sich einen einzelnen Cluster aus Punktewolken mit maximalem Durchmesser in Postgis, für den keine dynamischen Abfragen erforderlich sind .
und ein Typ mit Cluster-ID
Als nächstes die Algorithmusfunktion
Verwendungszweck:
quelle