Mehr

Räumliches Clustering mit PostGIS?


Ich suche nach einem räumlichen Clustering-Algorithmus, um ihn in einer PostGIS-fähigen Datenbank für Punkt-Features zu verwenden. Ich werde eine plpgsql-Funktion schreiben, die den Abstand zwischen Punkten innerhalb desselben Clusters als Eingabe verwendet. Am Ausgang gibt die Funktion ein Array von Clustern zurück. Die naheliegendste Lösung besteht darin, Pufferzonen mit einer bestimmten Entfernung um das Feature zu erstellen und in diesem Puffer nach Features zu suchen. Wenn solche Features existieren, dann baue weiter einen Puffer um sie herum auf usw. Wenn solche Features nicht existieren, bedeutet dies, dass die Clusterbildung abgeschlossen ist. Vielleicht gibt es clevere Lösungen?


Es gibt mindestens zwei gute Clustering-Methoden für PostGIS: k-bedeutet (überkmeans-postgresqlExtension) oder Clustering-Geometrien innerhalb einer Schwellenentfernung (PostGIS 2.2)


1) k-bedeutet mitkmeans-postgresql

Installation: Sie müssen dies aus dem Quellcode kompilieren und installieren, was unter *NIX einfacher ist als unter Windows (ich weiß nicht, wo ich anfangen soll). Wenn Sie PostgreSQL aus Paketen installiert haben, stellen Sie sicher, dass Sie auch über die Entwicklungspakete verfügen (z.postgresql-develfür CentOS).

Herunterladen, extrahieren, erstellen und installieren:

wget http://api.pgxn.org/dist/kmeans/1.1.0/kmeans-1.1.0.zip entpacken kmeans-1.1.0.zip cd kmeans-1.1.0/ make USE_PGXS=1 sudo make install

Aktivieren Sie die Erweiterung in einer Datenbank (mit psql, pgAdmin usw.):

ERWEITERUNG ERSTELLEN kmeans;

Verwendung/Beispiel: Sie sollten irgendwo eine Tabelle mit Punkten haben (ich habe eine Reihe von pseudozufälligen Punkten in QGIS gezeichnet). Hier ist ein Beispiel mit dem, was ich gemacht 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 NACH kmeans;

das5Ich habe im zweiten Argument derkmeansFensterfunktion ist die K Ganzzahl, um fünf Cluster zu erzeugen. Sie können dies in eine beliebige Ganzzahl ändern.

Unten sind die 31 pseudozufälligen Punkte, die ich gezeichnet habe, und die fünf Schwerpunkte mit der Beschriftung, die die Anzahl in jedem Cluster anzeigt. 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 einer Schwellenentfernung mitST_ClusterWithin

Diese Aggregatfunktion ist in PostGIS 2.2 enthalten und gibt ein Array von GeometryCollections zurück, bei denen sich alle Komponenten in einem Abstand voneinander befinden.

Hier ist 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)) / Fpi .) AS Radius ( 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 etwa 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 zusammengefügt werden.


Ich habe eine Funktion geschrieben, die Cluster von Features basierend auf der Entfernung zwischen ihnen berechnet und eine konvexe Hülle über diesen Features erstellt:

FUNKTION ERSTELLEN ODER ERSETZEN get_domains_n(lname varchar, geom varchar, gid varchar, radius numerisch) RETURNS SETOF record AS $$ DECLARE lid_new integer; dmn_number integer := 1; Outr-Rekord; innr-Datensatz; r-Aufzeichnung; BEGIN DROP TABLE IF EXISTS tmp; EXECUTE 'CREATE TEMPORARY TABLE tmp AS SELECT '||gid||', '||geom||' FROM '||lname; ALTER TABLE tmp ADD COLUMN dmn integer; ALTER TABLE tmp ADD COLUMN chk boolesch DEFAULT FALSE; EXECUTE 'UPDATE tmp SET dmn = '||dmn_number||', chk = FALSE WHERE '||gid||' = (SELECT MIN('||gid||') VON tmp)'; LOOP LOOP FOR outr IN EXECUTE 'SELECT '||gid||' AS gid, '||geom||' AS geom FROM tmp WHERE dmn = '||dmn_nummer||' AND NOT chk' SCHLEIFE FÜR innr IN EXECUTE 'SELECT '||gid||' AS gid, '||geom||' AS geom FROM tmp WHERE dmn IS NULL' LOOP IF ST_DWithin(ST_Transform(ST_SetSRID(outr.geom, 4326), 3785), ST_Transform(ST_SetSRID(innr.geom, 4326), 3785), radius) THEN --IF ST_DWithin(outr .geom, innr.geom, radius) THEN EXECUTE 'UPDATE tmp SET dmn = '||dmn_number||', chk = FALSE WHERE '||gid||' = '||innr.gid; ENDE WENN; SCHLEIFE ENDE; EXECUTE 'UPDATE tmp SET chk = TRUE WHERE '||gid||' = '||outr.gid; SCHLEIFE ENDE; SELECT INTO r dmn FROM tmp WO dmn = dmn_number AND NOT chk LIMIT 1; BEENDEN, WENN NICHT GEFUNDEN; SCHLEIFE ENDE; SELECT INTO r dmn FROM tmp WO dmn NULL IST LIMIT 1; WENN GEFUNDEN DANN dmn_number := dmn_number + 1; EXECUTE 'UPDATE tmp SET dmn = '||dmn_number||', chk = FALSE WHERE '||gid||' = (SELECT MIN('||gid||') FROM tmp WO dmn NULL LIMIT IST 1)'; SONST EXIT; ENDE WENN; SCHLEIFE ENDE; RETURN QUERY EXECUTE 'SELECT ST_ConvexHull(ST_Collect('||geom||')) FROM tmp GROUP by dmn'; RÜCKKEHR; ENDE $$ SPRACHE plpgsql;

Beispiel für die Verwendung dieser Funktion:

SELECT * FROM get_domains_n('poi', 'wkb_geometry', 'ogc_fid', 14000) AS g(gm Geometrie)

'poi' - Name des Layers, 'wkb_geometry' - Name der Geometriespalte, 'ogc_fid' - Primärschlüssel der Tabelle, 14000 - Clusterdistanz.

Das Ergebnis der Verwendung dieser Funktion:


Am vielversprechendsten fand ich bisher diese Erweiterung für K-Means-Clustering als Fensterfunktion: http://pgxn.org/dist/kmeans/

Allerdings konnte ich es noch nicht erfolgreich installieren.


Andernfalls können Sie für einfaches Grid-Clustering SnapToGrid verwenden.

SELECT array_agg(id) AS ids, COUNT( position ) AS count, ST_AsText( ST_Centroid(ST_Collect( position )) ) AS center, FROM mytable GROUP BY ST_SnapToGrid( ST_SetSRID(position, 4326), 22.25, 11.125) ORDER BY count DESC ;

Sie können die Kmeans-Lösung einfacher mit der ST_ClusterKMeans-Methode verwenden, die in Postgis ab 2.3 verfügbar ist. Beispiel:

SELECT kmean, count(*), ST_SetSRID(ST_Extent(geom), 4326) als bbox FROM ( SELECT ST_ClusterKMeans(geom, 20) OVER() AS kmean, ST_Centroid(geom) als geom FROM sls_product ) tsub GROUP BY kmean;

Die Bounding Box von Features wird im obigen Beispiel als Cluster-Geometrie verwendet. Das erste Bild zeigt die Originalgeometrien und das zweite ist das Ergebnis der obigen Auswahl.


Bottom-up-Clustering-Lösung von Holen Sie sich einen einzelnen Cluster aus einer Punktwolke mit maximalem Durchmesser in Postgis, die keine dynamischen Abfragen erfordert.

CREATE TYPE pt AS ( gid-Zeichen variieren(32), the_geom-Geometrie (Punkt))

und ein Typ mit Cluster-ID

CREATE TYPE clustered_pt AS ( gid Zeichenvariation(32), the_geom Geometrie(Point) cluster_id int)

Als nächstes die Algorithmusfunktion

FUNKTION ERSTELLEN ODER ERSETZEN buc(Punkte pt[], Radius Integer) RETURNS SETOF clustered_pt AS $BODY$ DECLARE srid int; Joined_clusters int[]; BEGIN --Wenn es nur 1 Punkt gibt, kümmere dich nicht um die Schleife. IF array_length(points,1)<2 THEN RETURN QUERY SELECT gid, the_geom, 1 FROM unnest(points); RÜCKKEHR; ENDE WENN; TEMPORÄRE TABELLE ERSTELLEN, WENN NICHT VORHANDEN punkte2 (WIE pt) BEI COMMIT DROP; BEGIN ALTER TABLE points2 ADD COLUMN cluster_id serial; AUSNAHME, WENN duplizierte_Spalte DANN --Nichts tun. Ausnahme tritt auf, wenn diese Funktion mehrmals verwendet wird END; TRUNCATE Punkte2; --Einfügen von Punkten in INSERT INTO points2(gid, the_geom) (SELECT (unnest(points)).* ); --Speichere das srid, um die Punkte danach wieder umzuwandeln, geht davon aus, dass alle Punkte das gleiche SRID-srid haben := ST_SRID(the_geom) FROM points2 LIMIT 1; UPDATE points2 --transformiert Punkte in ein UTM-Koordinatensystem, sodass Entfernungen in Metern berechnet werden. SET the_geom = ST_TRANSFORM(the_geom,26986); --Hinzufügen des räumlichen Indexes CREATE INDEX points_index ON points2 USING gist (the_geom); ANALYSE Punkte2; LOOP --Wenn der kleinste maximale Abstand zwischen zwei Clustern größer als das 2-fache des gewünschten Clusterradius ist, dann müssen keine Cluster mehr gebildet werden IF (SELECT ST_MaxDistance(ST_Collect(a.the_geom),ST_Collect(b.the_geom)) FROM points2 a, Punkte2 b WHERE a.cluster_id <> b.cluster_id GROUP BY a.cluster_id, b.cluster_id ORDER BY ST_MaxDistance(ST_Collect(a.the_geom),ST_Collect(b.the_geom)) LIMIT 1) > 2 * Radius THEN EXIT; ENDE WENN; Joined_clusters := ARRAY[a.cluster_id,b.cluster_id] FROM points2 a, points2 b WHERE a.cluster_id <> b.cluster_id GROUP BY a.cluster_id, b.cluster_id ORDER BY ST_MaxDistance(ST_Collect(ST_Collect(a.the_geom), b.the_geom)) GRENZE 1; UPDATE points2 SET cluster_id = Joined_clusters[1] WHERE cluster_id = Joined_clusters[2]; --Wenn nur noch 1 Cluster übrig ist, beenden Sie die Schleife IF (SELECT COUNT(DISTINCT cluster_id) FROM points2) < 2 THEN EXIT; ENDE WENN; SCHLEIFE ENDE; RETURN QUERY SELECT gid, ST_TRANSFORM(the_geom, srid)::geometry(point), cluster_id FROM points2; ENDE; $BODY$ SPRACHE plpgsql

Verwendung:

WITH subq AS( SELECT ARRAY_AGG((gid, the_geom)::pt) AS-Punkte FROM data GROUP BY collection_id) SELECT (Cluster).* FROM (SELECT buc(Punkte, Radius) AS-Cluster FROM subq ) y;

Ergänzende @MikeT-Antwort…

Für MS-Windows:

Bedarf:

  • Jede Visual C++ Express-Version wie diese
  • Das kmeans-postgresql-Modul.

Was du tun wirst:

  • Optimieren Sie den Quellcode, um die kmeans-Funktion in eine DLL zu exportieren.
  • Kompilieren Sie den Quellcode mitcl.exeCompiler zum Generieren einer DLL mitkmeansFunktion.
  • Legen Sie die generierte DLL in den Ordner PostgreSQLlib ab.
  • Dann können Sie die UDF über den SQL-Befehl in PostgreSQL "erstellen" (verlinken).

Schritte:

  1. Anforderungen herunterladen und installieren/extrahieren.
  2. Öffne daskmeans.cin jedem Editor:

    1. Nach dem#einschließenZeilen definieren das DLLEXPORT-Makro mit:

      #wenn definiert(_WIN32) #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT #endif
    2. StellenDLLEXPORTvor jeder dieser Zeilen:

      PG_FUNCTION_INFO_V1(kmeans_with_init); PG_FUNCTION_INFO_V1(kmeans); externes Datum kmeans_with_init(PG_FUNCTION_ARGS); externes Datum kmeans(PG_FUNCTION_ARGS);
  3. Öffnen Sie die Visual C++-Befehlszeile.

  4. In der Befehlszeile:

    1. Gehe zu den extrahiertenkmeans-postgresql.
    2. Stellen Sie Ihren POSTGRESPATH ein, meiner ist zum Beispiel:SET POSTGRESPATH=C:ProgrammePostgreSQL9.5
    3. Lauf

      cl.exe /I"%POSTGRESPATH%include" /I"%POSTGRESPATH%includeserver" /I"%POSTGRESPATH%includeserverportwin32" /I"%POSTGRESPATH%includeserverport win32_msvc" /I"C:Program Files (x86)Microsoft SDKsWindowsv7.1AInclude" /LD kmeans.c "%POSTGRESPATH%libpostgres.lib"
  5. Kopiere daskmeans.dllzu%POSTGRESPATH%lib

  6. Führen Sie nun den SQL-Befehl in Ihrer Datenbank aus, um die Funktion zu "ERSTELLEN".

    CREATE FUNCTION kmeans(float[], int) RETURNS int AS '$libdir/kmeans' SPRACHE c VOLATILE STRICT WINDOW; CREATE FUNCTION kmeans(float[], int, float[]) RETURNS int AS '$libdir/kmeans', 'kmeans_with_init' SPRACHE C IMMUTABLE STRICT WINDOW;

Hier ist eine Möglichkeit, das Ergebnis der in 2) in dieser Antwort angegebenen PostGIS-Abfrage in QGIS anzuzeigen

Da QGIS weder Geometriesammlungen noch unterschiedliche Datentypen in derselben Geometriespalte verarbeitet, habe ich zwei Layer erstellt, einen für Cluster und einen für geclusterte Punkte.

Zunächst benötigen Sie für Cluster nur Polygone, andere Ergebnisse sind einsame Punkte:

SELECT id,countfeature,circle FROM (SELECT row_number() over () AS id, ST_NumGeometries(gc) as countfeature, ST_MinimumBoundingCircle(gc) AS circle FROM ( SELECT unnest(ST_ClusterWithin(the_geom, 100)) gc FROM rand .point ) f) WHERE ST_GeometryType(Kreis) = 'ST_Polygon'

Für geclusterte Punkte müssen Sie dann Geometriesammlungen in Multipoint transformieren:

SELECT row_number() over () AS id, ST_NumGeometries(gc) as countfeature, ST_CollectionExtract(gc,1) AS multipoint FROM ( SELECT unnest(ST_ClusterWithin(the_geom, 100)) gc FROM rand_point ) f

Einige Punkte befinden sich an denselben Koordinaten, sodass die Beschriftung verwirrend sein könnte.


PostGIS

PostGIS fügt der objektrelationalen PostgreSQL-Datenbank Unterstützung für geografische Objekte hinzu. Tatsächlich aktiviert PostGIS den PostgreSQL-Server “räumlich, sodass er als räumliche Backend-Datenbank für geografische Informationssysteme (GIS) verwendet werden kann, ähnlich wie die SDE von ESRI oder die Spatial-Erweiterung von Oracle. PostGIS folgt der OpenGIS “Simple Features Specification for SQL”.

1. Installation auf Ubuntu

Laden Sie das folgende Paket mit dem Synaptic Package Manager herunter und installieren Sie es:

1.1. postgis

Unterstützung von geografischen Objekten für allgemeine PostgreSQL —-Dateien. Dieses Paket enthält die PostGIS-Userland-Binärdateien, allgemeine Dateien und Dokumentation.

1.2. postgressql-8.4-postgis

Unterstützung von geografischen Objekten für PostgreSQL 8.4. Dieses Paket unterstützt PostgreSQL 8.4.

1.3. libpostgis-java

Unterstützung von geografischen Objekten für PostgreSQL — JDBC-Unterstützung. Dieses Paket enthält JDBC-Unterstützung für PostGIS.


Verwenden von GeoDjango und PostGIS in Django

Geodaten sind alle geografischen Daten, die Informationen über die Erde enthalten, z. B. Flüsse, Grenzen, Städte oder natürliche Sehenswürdigkeiten. Es beschreibt die Konturen, Topologie, Größe und Form dieser Features. Karten sind eine gängige Methode zur Visualisierung räumlicher Daten, die normalerweise in Vektor- oder Rasterform dargestellt werden.

In diesem Artikel stelle ich Ihnen Geodaten in PostgreSQL und Django vor. Sie erfahren, wie Sie mit PostGIS und GeoDjango geographische Daten (sowohl Raster als auch Vektoren) in einer Python-Webanwendung erstellen, speichern und bearbeiten. Unterwegs sehen Sie mehrere Anwendungsfälle für Geodaten, denen Sie als Softwareentwickler wahrscheinlich begegnen werden.

Vektordaten vs. Rasterdaten

Vektordaten ist eine Darstellung der Erde mit Punkten, Linien und Polygonen. Ein Punkt wird verwendet, um kleine, diskrete Bereiche unter Verwendung einer „x“- und „y“-Koordinate darzustellen. Verbundene Punkte erzeugen Linien, die zur Beschreibung von Straßen, Bächen und Netzwerken verwendet werden können. Polygone werden aus einer geschlossenen Verbindung von Linien gebildet und stellen Features mit einer geschlossenen Fläche wie Gebäude, Inseln und Grenzen dar. Vektordatentypen sind in relationalen Datenbanken häufiger als Rasterdaten.

Rasterdaten, andererseits ist eine Darstellung von geografischen Daten in Pixeln. Es bezieht sich normalerweise auf Bilder der Erde, die von Luftsatelliten aufgenommen wurden. Sie werden normalerweise in einem Raster aus Zeilen und Spalten mit relevanten Metadaten wie Messungen und Auflösung gespeichert. Rasterdaten sind schneller und kostengünstiger zu erstellen als Vektordatentypen.

Geodaten in Postgres mit PostGIS

Wann immer Sie Fragen zu Ihrer geografischen Umgebung beantworten müssen, z. B. „Wie weit ist das Krankenhaus entfernt?“, „Wo ist das nächste Geschäft?“, „Wie hoch ist der Wolkenkratzer?“ oder „Was ist der schnellste Weg?“ Geodaten dürften ins Spiel kommen.

Geodaten sind auch Wird in der Statistik zur Analyse von Mustern und Beziehungen zwischen Elementen verwendet. Bei der Analyse der Ausbreitung einer Krankheit in einem geografischen Gebiet können beispielsweise heiße Zonen anhand von Geodaten identifiziert und unter Quarantäne gestellt werden. Diese Daten können verwendet werden, um die Quelle eines Ausbruchs, die Zoneneinteilung von Städten und vieles mehr zu identifizieren. Da mehr Softwareanwendungen standortabhängig sind, ist die Art und Weise, wie Sie Geodaten verwalten und speichern, wichtiger denn je.

PostgreSQL allein bietet keine Unterstützung für die Speicherung von Geodaten. Hier kommt PostGIS ins Spiel. PostGIS ist eine kostenlose Open-Source-Erweiterung, die PostgreSQL-Datenbanken um räumliche Datenfunktionen erweitert. Mit PostGIS können Sie Geodaten speichern und seine Funktionsbibliothek nutzen es zu manipulieren. Eine Datenbank mit PostGIS kann geographische Koordinaten, Linien und Formen speichern und mit räumlichen Funktionen abfragen.

Wenn Sie einen Database-as-a-Service-Anbieter wie Amazon RDS oder Google Cloud SQL verwenden, ist PostGIS wahrscheinlich bereits installiert. Wenn Sie einen eigenen Server betreiben, finden Sie weitere Informationen auf der PostGIS-Website. Nach der Installation ist die Aktivierung von PostGIS so einfach wie:

Sehen wir uns nun an, wie wir mit Geodaten in Django arbeiten können.

GeoDjango für Geodaten in Django verwenden

GeoDjango ist ein Django-Modul zum Erstellen von geografischen Anwendungen. Es kann verwendet werden, um eine räumliche Datenbank in Python zu verwalten. Es ist in Django integriert, kann aber auch als eigenständiges Framework verwendet werden. Ziel ist es, die Erstellung standortbasierter Webanwendungen so einfach wie möglich zu gestalten.

In den folgenden Abschnitten sehen Sie vier verschiedene Anwendungsfälle für GeoDjango. Diese veranschaulichen, wie Sie räumliche Daten in einer Django-Anwendung erstellen, speichern und abrufen können, die von einer Postgres-Datenbank unterstützt wird, die PostGIS verwendet. Außerdem erfahren Sie, wie Sie räumliche Daten für allgemeine Vorgänge verwenden, z. B. zum Ermitteln der Entfernung zwischen zwei Orten im Weltraum.

Speichern von Polygonen mit GEOSGeometry

Ein Polygon ist eine Art von Vektordaten: eine Verbindung von Punkten, die eine geschlossene Form bilden. Sie können einer räumlichen Datenbank in Django mithilfe von GEOSGeometry ein Polygon hinzufügen.

Die Klasse GEOSGeometry stammt aus der GEOS-API. Es benötigt zwei Argumente, wobei das erste Argument eine Zeichenfolgeneingabe ist, die die zu speichernde Geometrie darstellt, und ein zweites optionales Argument, eine SRID-Nummer (Raumreferenzkennung). Die SRID ist eine eindeutige Kennung, die definiert, welches Koordinatensystem Sie verwenden möchten, und beschreibt, wie Daten in reale Standorte konvertiert werden. Bei der Durchführung von Geodatenfunktionen wie der Suche nach Entfernungs- und Flächendaten ist es wichtig, Daten mit derselben SRID wie in der Datenbank zu verwenden, um das korrekte Ergebnis zu gewährleisten.

Um ein Polygon mithilfe von GEOSGeometry in einer räumlichen Datenbank zu speichern, stellen Sie sicher, dass in Ihrem Modell ein Polygon-Feld definiert ist. Angenommen, Sie haben ein Bankmodell, das alle Banken in einem Bundesstaat mit einem PolygonField ( poly ) darstellt, das die physische Grenze und Form einer bestimmten Bankfiliale umreißt:

Um Daten zu einem solchen Feld mit GEOSGeometry zu speichern, können Sie Folgendes ausführen:

Mit der Klasse GEOSGeometry haben Sie ein Polygon-Objekt erstellt, das einen Umriss einer bestimmten Suntrust-Bank in San Antonio, Texas, darstellt. Jede dem Parameter POLYGON übergebene Koordinate definiert eine „Ecke“ des Gebäudeumrisses.

Speichern von Modellen mit Rasterfeldern mit GDALRaster

Wenn Sie mit Raster-Daten arbeiten, benötigen Sie das Feld, das zum Speichern eines Rasters verwendet wird (als RasterField bezeichnet). Die Raster-Funktionalität war schon immer Teil von PostGIS, aber ab PostGIS 3.0 wurde die Raster-Erweiterung in eine separate Erweiterung aufgeteilt. Stellen Sie nach der Installation sicher, dass die Erweiterung in Ihrer Datenbank aktiviert ist, indem Sie Folgendes ausführen:

Angenommen, Sie haben ein Modell namens Elevation mit einem Rasterfeld darauf. Das Höhenmodell würde die vertikale und horizontale Dimension verschiedener Oberflächen darstellen, und das RasterField darauf ( rast , wie unten zu sehen) wäre ein Feld, das ein abstrahiertes Rasterobjekt aufnimmt, das die Höhe beschreibt. Dies könnte beispielsweise eine Satellitenkartierung des Geländes eines Hügels sein:

Das RasterField speichert ein GDALRaster-Objekt. GDALRaster ist ein Objekt, das das Lesen von räumlichen Dateiformaten wie Rasterdateien unterstützt. Es kann instanziiert werden mit zwei Eingänge. Der erste Parameter kann sein entweder eine Zeichenfolge, die einen Dateipfad oder ein Wörterbuch darstellt, oder ein Byte-Objekt, das das Raster darstellt. Der zweite Parameter gibt an, ob das Raster im „Schreibmodus“ geöffnet werden soll. Wenn Sie den Schreibmodus nicht verwenden, können Sie die Raster-Daten nicht ändern.

Unten nimmt GDALRaster die Datei raster.tif auf, liest sie als Dateiobjekt und abstrahiert sie in ein GDALRaster-Objekt, das im RasterField des Modells gespeichert werden kann:

Auf diese Weise können Sie die .tif-Bilddatei eines Rasters speichern, die das Gelände des Mount Fuji darstellt.

Ein neues Raster kann auch mit Rohdaten aus einem Python-Wörterbuch erstellt werden, das die Parameter scale, size, origin und srid enthält. Unten sehen Sie, wie Sie ein neues Raster definieren, das einen Canyon mit einer Breite und Höhe von 10 Pixeln und Bändern beschreibt, die eine einzelne Datenschicht im Raster darstellen:

Suchen nach Punkten im Raum mithilfe von Geometrie-Lookups

Geometrie-Lookups helfen Ihnen, Punkte, Linien und Polygone in einer anderen Geometrie zu finden. Sie können beispielsweise Geometrie-Lookups verwenden, um zu bestimmen, ob ein Punkt innerhalb einer Polygonoberfläche liegt.

Erstellen Sie zunächst ein Ländermodell, das wie folgt definiert ist:

Country stellt eine Tabelle dar, in der die Grenzen der Länder der Welt gespeichert sind. Als nächstes können Sie GeoDjango verwenden, um zu überprüfen, ob eine bestimmte Punktkoordinate in einem mpoly-Feld in einem der Länder in der Datenbank gespeichert ist:

Sie können auch eine räumliche Suche durchführen, um festzustellen, ob sich ein Punkt in einem bestimmten Land befindet. Führen Sie den folgenden Code aus, um ein Point-Objekt zu definieren, das einen Standort in Valdagrone, San Marino, darstellt. Anschließend können Sie mit der Methode enthält nach diesem Punkt suchen:

Berechnung des Abstands zwischen Punkten

Schließlich kann GeoDjango verwendet werden, um die Entfernung zwischen zwei Punkten zu berechnen. Angenommen, Sie kennen zwei Punktkoordinaten und möchten den Abstand zwischen ihnen ermitteln, können Sie Folgendes in Ihrer Python-Shell ausführen:

In diesem Beispiel wird die Transformationsmethode verwendet, um die Punktkoordinaten von dezimalen Breiten-/Längengraden in metrische Entfernungen umzuwandeln.

Um ein Django-spezifischeres Beispiel zu veranschaulichen, könnten Sie ein Modell für Städte in den USA erstellen, das wie folgt aussieht:

Um die Entfernung zwischen den Städten zu berechnen Punkt Hoffnung und Punkt legen, können Sie die Modelle wie folgt verwenden:

GeoDjango bietet auch einige Entfernungs-Lookup-Funktionen wie Distance_lt, Distance_lte, Distance_gt, Distance_gte und dwithin. Beispielsweise:

Auf diese Weise können Sie GeoDjango verwenden, um den Abstand zwischen zwei Modellen mit Positionspunkten oder zwei Rohpunktobjekten zu ermitteln. Wenn Sie diese Methode mit Vektor- oder Rasterdaten zu Straßen kombinieren, können Sie komplexe Entfernungsberechnungen für Autofahren, Gehen oder Radfahren in Ihre Anwendung integrieren.

Geodaten haben viele wichtige praktische Anwendungsfälle. In diesem Beitrag haben Sie gesehen, wie PostGIS und GeoDjango Ihnen helfen können, räumliche Daten zum Erstellen von standortbezogenen Webanwendungen zu verwenden, aber es gibt noch viel mehr zu diesem Thema zu erfahren. Weitere Informationen und Beispiele finden Sie in der PostGIS-Einführungsdokumentation und der GeoDjango-API.

Teile diesen Artikel: Wenn Ihnen dieser Artikel gefallen hat, möchten Sie ihn vielleicht an Ihre Kollegen twittern.


Räumliches Clustering mit PostGIS? - Geografisches Informationssystem

Working Fork des PostGIS-Projekts svn (http://svn.osgeo.org/postgis/)

Verwenden Sie Git oder checken Sie mit SVN über die Web-URL aus.

Arbeiten Sie schnell mit unserer offiziellen CLI. Mehr erfahren.

Starten von GitHub Desktop

Wenn nichts passiert, laden Sie GitHub Desktop herunter und versuchen Sie es erneut.

Starten von GitHub Desktop

Wenn nichts passiert, laden Sie GitHub Desktop herunter und versuchen Sie es erneut.

Xcode starten

Wenn nichts passiert, laden Sie Xcode herunter und versuchen Sie es erneut.

Starten von Visual Studio-Code

Ihr Codespace wird geöffnet, sobald er fertig ist.

Beim Vorbereiten Ihres Codespace ist ein Problem aufgetreten. Bitte versuchen Sie es erneut.


Kursübersicht

Tag 1

  1. Herzlich willkommen
  2. Einführung
    • Hintergrund und Geschichte von Geodatenbanken, PostgreSQL und PostGIS
    • Erläuterung relationaler Datenbankmanagementsysteme
    • Vorteil einer Datenbank gegenüber Dateien wie Shapefiles
    • Anwendungen, die PostGIS . unterstützen
    • Real-World-Implementierungen von PostGIS
    • Vergleich mit proprietären räumlichen Datenbanklösungen
  3. Installation von PostgreSQL, pgAdmin, PostGIS und QGIS
    • unter Windows, Linux oder OS X
  4. Erstellen einer räumlichen Datenbank
    • Erstellen Sie eine neue Datenbank und aktivieren Sie diese räumlich mit PostGIS
  5. Geodaten laden
    • Werkzeug zum Laden von PostGIS-Shapefiles
    • QGIS DBManager
    • andere Werkzeuge
  6. Übersicht der Übungsdaten
  7. Einfache SQL
    • Alles in PostGIS wird mit SQL (strukturierte Abfragesprache) erledigt. Wenn Sie also keine Kenntnisse haben, erhalten Sie hier die Grundlagen. Alle Datenbanken verwenden SQL, daher ist dies eine wichtige Fähigkeit
  8. Einfache SQL-Übungen
    • Üben von grundlegendem SQL
  9. Geometrien
    • Einfache OGC-Feature-Geometrien verstehen und in der Datenbank speichern und bearbeiten
  10. Geometrieübungen
    • Üben von Geometriefunktionen
  11. Räumliche Beziehung
    • Funktionen zum Testen und Beschreiben von Beziehungen, wie z. B. gleich, überschneidet, innerhalb usw. Wenn Sie GIS verwendet haben, wissen Sie, wie Sie diese in einem Desktop-GIS ausführen - jetzt tun Sie sie in einer Datenbank!
  12. Übungen zu räumlichen Beziehungen
    • Üben von räumlichen Beziehungsfunktionen
  13. Räumliche Verknüpfungen
    • Eine der Kernfähigkeiten in einem GIS, das Durchführen von räumlichen Verknüpfungen in einer Datenbank, ist unglaublich flexibel und leistungsstark.
  14. Räumliche Verknüpfungsübungen
    • Üben von räumlichen Verbindungen
  15. Räumliche Indizierung
    • räumliche Indizierung beschleunigt Abfragen von räumlichen Daten

Tag 2

  1. Daten projizieren
    • Transformieren von Geometrien zwischen verschiedenen Koordinatenbezugssystemen.
  2. Projektionsübungen
  3. Erdkunde
    • Speichern Sie Ihre Daten als lange Lat (unprojiziert) und führen Sie dennoch sehr genaue räumliche Operationen mit sphärischer Geometrie durch (auf dem WGS84-Sphäroid)
  4. Geometriekonstruktionsfunktionen
    • Funktionen, die zu neuen Geometrien führen, z.B.
    • Puffer
    • Schwerpunkt
    • Überschneidung
    • Union (auch bekannt als auflösen oder zusammenführen)
  5. Mehr räumliche Verknüpfungen
    • ein tieferer Blick auf räumliche Verknüpfungen, Einbeziehung anderer Funktionen, die seit dem ersten Abschnitt über räumliche Verknüpfungen abgedeckt wurden
    • Laden und Ausführen von Joins mit nicht-räumlichen Tabellen
  6. Gültigkeit
    • Prüfung der Gültigkeit von Geometrien
  7. Gleichberechtigung
    • ein tieferer Blick darauf, was Gleichheit zwischen Geometrien bedeutet
  8. Lineare Referenzierung
    • Referenz-Features basierend auf ihrer Position entlang einer Linie, anstatt XY- oder Polarkoordinaten zu verwenden.
  9. Dimensional erweitertes Modell mit 9 Schnittpunkten
    • alle möglichen Beziehungen zwischen Geometrien verstehen, testen und nutzen
  10. Clustering auf Indizes
    • Datenbank-Clustering ist ein leistungssteigerndes Tool, das zusammengehörige Daten physisch eng beieinander auf der Festplatte ablegt
  11. 3-D
    • Arbeiten mit 3D-Geometrien in PostGIS
  12. Nächster-Nachbar-Suche
    • egal die entfernung, was ist die nächste? Komplizierter als Sie denken. PostGIS löst es sauber
  13. Verfolgen des Bearbeitungsverlaufs mithilfe von Triggern
    • Verwenden Sie Standard-PostgreSQL-Trigger, um aufzuzeichnen, wer einen Datensatz erstellt/bearbeitet/gelöscht hat
  14. Fortgeschrittene Geometriekonstruktionen
    • Lernen Sie einige fortgeschrittene SQL-Funktionen und Ansätze, um einige knifflige Probleme zu lösen
  15. Optimieren von PostgreSQL für Spatial
    • PostgreSQL als RDBMS kann und wird verwendet, um alles zu speichern, daher ist seine Standardkonfiguration für generische Leistung. Geodaten stellen einzigartige Herausforderungen – erfahren Sie, wie Sie die Datenbank für eine optimale Leistung konfigurieren
  16. PostgreSQL-Sicherheit
    • So schützen Sie die Integrität und Sicherheit Ihrer Daten und Datenbanken
    • Authentifizierung und Rollen
    • Datenbankverbindungen
    • Verschlüsselung
  17. PostgreSQL-Schemas
    • Schemas sind wie Ordner – wie und warum man Schemas verwendet
  18. PostgreSQL-Sicherung und -Wiederherstellung
    • sehr wichtig!
  19. Software-Upgrades
    • So handhaben Sie Upgrades von PostgreSQL oder PostGIS

Die Beurteilung basiert auf dem erfolgreichen Absolvieren der zwischen den Lehrmodulen verteilten Übungen.

QGIS wird während des gesamten Kurses intensiv verwendet, um Ergebnisse zu visualisieren, als SQL-Client (über den DB-Manager) und um Daten in PostGIS zu laden. pgAdmin und andere Clients werden ebenfalls vorgestellt. Während des Kurses geschriebene SQL-Befehle werden vom Kursteilnehmer als Referenz gespeichert, damit er die Abfragen zu Hause oder am Arbeitsplatz überprüfen oder wiederverwenden kann.

Wir ermutigen die Studenten, ihre eigenen Daten mitzubringen, damit sie, wenn sie während des Kurses die Zeit und die Fähigkeit haben, die im Kurs erworbenen Fähigkeiten mit ihren eigenen Daten umsetzen und sogar mit einer gebrauchsfertigen räumlichen Datenbank ins Büro zurückkehren können .


BuntDB – Einbettbare, speicherinterne Schlüssel-/Wertdatenbank für Go mit benutzerdefinierter Indexierung und Geodatenunterstützung

BuntDB ist ein Low-Level-In-Memory-Schlüssel/Wert-Speicher in pure Go. Es bleibt auf der Festplatte erhalten, ist ACID-kompatibel und verwendet Sperren für mehrere Lesegeräte und einen einzelnen Schreiber. Es unterstützt benutzerdefinierte Indizes und Geodaten. Es ist ideal für Projekte, die eine zuverlässige Datenbank benötigen und Geschwindigkeit gegenüber Datengröße bevorzugen. Der Wunsch, BuntDB zu erstellen, ergibt sich aus der Notwendigkeit einer neuen einbettbaren Datenbank für Tile38 und SummitDB.


Analyse von SSURGO-Daten in PostGIS: Ein Überblick

Nachrichten
Es sieht so aus, als hätte die NCSS eine webbasierte SQL-Schnittstelle zu ihrer Hauptdatenbank entwickelt. Dieses neue Tool wurde kürzlich in Ausgabe 40 des NCSS-Newsletters vorgestellt und sieht aus wie ein vielversprechendes neues Tool mit guter Dokumentation. Auf dieser Seite finden Sie eine Auflistung der von der NCSS angebotenen "Webdienste".

Überblick
Die Analyse von SSURGO-Daten wird durch eine Reihe hierarchischer, tabellarischer Eins-zu-viele-Beziehungen zwischen räumlichen und Attributdaten erschwert. Das Verständnis der Struktur der SSURGO-Datenbank ist entscheidend für die korrekte Interpretation und Aggregation von Bodeneigenschaften. Bevor Sie eine SSURGO-basierte Analyse durchführen, nehmen Sie sich bitte etwas Zeit, um sich mit den Details des Produkts vertraut zu machen, einschließlich der beabsichtigten Verwendung, der Mindestgrößen der Kartierungseinheiten und anderer wichtiger Details. Darüber hinaus ist es ein Muss, sich mit den SSURGO-Metadaten vertraut zu machen. Die Metadatenseite enthält detaillierte Beschreibungen der Tabellenstruktur, Spaltennamen und Einheiten sowie wichtige Informationen zu den Quellen vieler Tabellendaten, die in einer SSURGO-Datenbank enthalten sind.

SSURGO-Daten können nach Vermessungsgebiet von The Soil Datamart heruntergeladen werden, wobei räumliche Daten im Shapefile-Format und Attributdaten als Klartext geliefert werden. Leider ist ein M.S. Die Access-Datenbankvorlage ist erforderlich, um SSURGO-Attributdaten zu verwenden, die vom Soil Datamart bereitgestellt werden. Hilfe zu diesem Verfahren finden Sie auf der NRCS SSURGO-Seite. Bei diesem Ansatz müssen die meisten Analysen von SSURGO Umfrage für Umfrage in einer GIS-Umgebung durchgeführt werden. Allgemeine Anweisungen finden Sie in diesem Dokument.

Mehrere Online-Anwendungen ermöglichen eine einfache Interaktion mit der SSURGO-Datenbank, ohne dass GIS- oder RDBMS-Kenntnisse erforderlich sind. Einige Beispiele sind:

    unsere Online-Schnittstelle zu CA-, AZ- und NV-Bodendaten. Beispielinteraktion hier, hier und hier. bereitgestellt von der NRCS-Anwendung

Ein Open-Source-Ansatz für SSURGO
Wir haben einen alternativen Ansatz für die Arbeit mit SSURGO-Daten mit PostGIS entwickelt, einer raumbezogenen Version des beliebten und Open-Source-Verwaltungssystems für relationale Datenbanken Postgresql, um alle räumlichen und tabellarischen Daten für 138 Vermessungsgebiete zu speichern. Dieser Ansatz ermöglicht den schnellen Zugriff, die Analyse und die Aggregation von über einer halben Million Bodenpolygonen. SQL (strukturierte Abfragesprache) wird verwendet, um direkt mit räumlichen und Attributdaten des Bodens zu interagieren. Wenn andere Formen von Geodaten in PostGIS importiert werden (z. B. Landbedeckungs-, Klimadaten usw.), können fast alle Geo- und Attributanalysen vollständig von PostGIS aus durchgeführt werden. Auf den folgenden Seiten wird eine Reihe von Beispielen vorgestellt, die gängige Aufgaben veranschaulichen.

Allgemeiner Ansatz für die Arbeit mit SSURGO (auch in diesem Dokument beschrieben) (weitere Ideen zur Zusammensetzung von Karteneinheiten)

  1. Identifizieren Sie die Bodeneigenschaften, die in eine Analyse einbezogen werden sollen
  2. Entscheiden Sie sich für die geeignete Aggregationsform für die Zusammenfassung von Horizonten
    • Tiefe gewichtet (d.h. um den durchschnittlichen Prozentsatz des Tons durch Horizonte zu berechnen)
    • oben 1m (d.h. die Schrumpfquellfähigkeit des Oberbodens zusammenzufassen)
    • oberer Horizont (d.h. um den organischen Oberflächenkohlenstoff zusammenzufassen)
    • Profilsumme (d.h. um die gesamte Wasserhaltekapazität zu berechnen)
    • am einschränkendsten (d.h. um die limitierteste hydraulische Leitfähigkeit innerhalb des Bodenprofils zu berechnen)
  3. Aggregierte Horizontdaten: nach dem Filtern von NULL-Werten und Gewichten
  4. Entscheiden Sie sich für die geeignete Aggregationsform, die verwendet werden soll, um Komponenten zusammenzufassen
    • Komponente gewichtet (d.h. dies enthält Informationen von jeder Komponente, gewichtet mit ihrem geschätzten Prozentsatz der gesamten Karteneinheit)
    • größte Komponente (d.h. dies führt normalerweise zur Auswahl der 'dominanten' Komponente, jedoch treten bei mehreren Komponenten mit den gleichen geschätzten prozentualen Bindungen auf)
    • Haupt Komponenten-Flag (d.h. Komponenten, die vom NRCS als „Hauptkomponente“ gekennzeichnet sind, repräsentieren dominante Bodentypen innerhalb einer Karteneinheit. Beachten Sie, dass manchmal mehrere Komponenten als "Hauptkomponenten" gekennzeichnet sind.)
    • dominante Bedingung (d.h. dies wird normalerweise für kategoriale Daten wie Wasserbedingungen verwendet. Die Aggregation erfolgt durch Auswahl der häufigsten Bedingung innerhalb einer Karteneinheit)
  5. Aggregation von Komponentendaten: nach dem Filtern von NULL-Werten und Gewichten
  6. Verbinden Sie die oben genannten aggregierten Daten (2x Aggregationsprozess für Horizontdaten) mit den Karteneinheitspolygonen
  7. See the diagram at the bottom of this page for a graphical summary

Notes on the Format of SSURGO


PostGIS

The primary spatial-data extension is PostGIS. PostGIS (Geographic Information Systems) is an open-source extension of the PostgreSQL database that lets you work with geographic objects that integrate directly with your database. With PostGIS, geographic and spatial data can be treated as first-class objects in your database.

By adding the PostGIS extension to your PostgreSQL database, you can work seamlessly with geospatial data without having to convert that data from the format that the rest of your application is working with to use with your database. You can also determine relationships between that spatial data with the extension, such as the distance between two objects in your database. You can also use PostGIS to render visualizations of this data.

Working with data such as cities and geometry data is as simple as something like:

SELECT superhero.name

FROM city, superhero

WHERE ST_Contains(city.geom, superhero.geom)

AND city.name = 'Gotham'

PostGIS includes:

The hierarchy of these spatial-focused type (from Introduction to PostGIS) is below:

  • Spatial-Indexing
  • Efficiently index spatial relationships
  • Spatial-Functions
  • For querying spatial properties, and the relationships between them
  • Functions for analyzing geometric components, determining spatial relationships, and manipulating geometries

In most databases, data is stored in rows and columns. With PostGIS, you can actually store data in a geometry column. This column stores data in a spatial coordinate system that’s defined by an SRID (Spatial Reference Identifier). This allows your database structure to reflect the spatial data that’s stored in the database.


Movement data in GIS: issues & ideas

Since I’ve started working, transport and movement data have been at the core of many of my projects. The spatial nature of movement data makes it interesting for GIScience but typical GIS tools are not a particularly good match.

Dealing with the temporal dynamics of geographic processes is one of the grand challenges for Geographic Information Science. Geographic Information Systems (GIS) and related spatial analysis methods are quite adept at handling spatial dimensions of patterns and processes, but the temporal and coupled space-time attributes of phenomena are difficult to represent and examine with contemporary GIS. (Dr. Paul M. Torrens, Center for Urban Science + Progress, New York University)

It’s still a hot topic right now, as the variety of related publications and events illustrates. For example, just this month, there is an Animove two-week professional training course (18–30 September 2016, Max-Planck Institute for Ornithology, Lake Konstanz) as well as the GIScience 2016 Workshop on Analysis of Movement Data (27 September 2016, Montreal, Canada).

Space-time cubes and animations are classics when it comes to visualizing movement data in GIS. They can be used for some visual analysis but have their limitations, particularly when it comes to working with and trying to understand lots of data. Visualization and analysis of spatio-temporal data in GIS is further complicated by the fact that the temporal information is not standardized in most GIS data formats. (Some notable exceptions of formats that do support time by design are GPX and NetCDF but those aren’t really first-class citizens in current desktop GIS.)

Most commonly, movement data is modeled as points (x,y, and optionally z) with a timestamp, object or tracker id, and potential additional info, such as speed, status, heading, and so on. With this data model, even simple questions like “Find all tracks that start in area A and end in area B” can become a real pain in “vanilla” desktop GIS. Even if the points come with a sequence number, which makes it easy to identify the start point, getting the end point is tricky without some custom code or queries. That’s why I have been storing the points in databases in order to at least have the powers of SQL to deal with the data. Even so, most queries were still painfully complex and performance unsatisfactory.

So I reached out to the Twitterverse asking for pointers towards moving objects database extensions for PostGIS and @bitnerd, @pwramsey, @hruske, and others replied. Amongst other useful tips, they pointed me towards the new temporal support, which ships with PostGIS 2.2. It includes the following neat functions:

  • ST_IsValidTrajectory — Returns true if the geometry is a valid trajectory.
  • ST_ClosestPointOfApproach — Returns the measure at which points interpolated along two lines are closest.
  • ST_DistanceCPA — Returns the distance between closest points of approach in two trajectories.
  • ST_CPAWithin — Returns true if the trajectories’ closest points of approach are within the specified distance.

Instead of points, these functions expect trajectories that are stored as LinestringM (or LinestringZM) where M is the time dimension. This approach makes many analyses considerably easier to handle. For example, clustering trajectory start and end locations and identifying the most common connections:


What Happens Next?

Herzliche Glückwünsche! You’ve just loaded spatial data into a PostGIS database! Here’s a tip to spin up a PostGIS database much faster: try uploading your shapefiles to CartoDB. CartoDB is a mapping and analysis platform that uses PostGIS, and any data uploaded goes into a database. There are advantages to using your own database, but it’s hard to beat the ease of uploading data to CartoDB and watching your shapefile (or spreadsheet) get loaded into PostGIS in seconds.

In the next post in this series we’ll show you some spatial queries you can perform with PostGIS (either in your PostGIS database or CartoDB) to examine the distribution of trees in Edmonton.