Erstellen und Befüllen von PostGIS mit Docker / Sudo Null IT News

Inhaltsverzeichnis:

Bedarf für PostGIS

In einem der Projekte war es notwendig, städtische Verkehrswege zu analysieren und Informationen abzugleichen OpenStreetMap (OSM)

Und für die bequeme Speicherung und Arbeit mit Geoinformationen habe ich eine beliebte Erweiterung gewählt PostGIS zum PostgreSQL.

Ausgaben

Die einfachste Möglichkeit, die ich gesehen habe, ist, diese Erweiterung bei der Installation von PostgreSQL zu installieren, aber es hat mir nicht gepasst, da die lokale Datenbank (DB) Daten enthält und einige der Prozesse an das aktuelle PostgreSQL gebunden sind.

Aufgrund eines Versionskonflikts war es nicht möglich, PostGIS im aktuellen PostgreSQL zu installieren, es war notwendig, mein PostgreSQL zu aktualisieren, und ich habe keine alten Versionen von PostGIS für mein PostgreSQL gefunden.

Basierend auf dem oben Gesagten habe ich die Option gewählt – PostGIS verwenden in Docker. Zum Glück gibt es dafür bereits montiert Bild. Docker fügt dem Projekt auch Isolierung hinzu, und nach der Analyse können Sie den Container sicher löschen.

Containerinstallation

Verwendete Technologien

Alle Operationen wurden durchgeführt an:

Um den Container zu starten, müssen Sie den folgenden Befehl im Terminal ausführen:

docker run -d –name -e POSTGRES_PASSWORD= -e POSTGRES_DB= -p 1:5432 postgis/postgis

Sie müssen die Felder mit Ihren eigenen Werten ohne Anführungszeichen ausfüllen

Danach können wir uns über DBeaver mit unserer Datenbank verbinden.
Standard-PostgreSQL-Port “5432“Ich habe mich geändert zu”eines“, da sich das lokale PostgreSQL auf diesem Port befindet, hat dies theoretisch keinen Einfluss, wir haben viele solcher Ports.

So sieht die Datenbankverbindung aus:

So sieht die verbundene Datenbank in DBeaver aus, mit allen Erweiterungen, die wir brauchen:

Container-Setup

Die wichtigste Geodatenquelle ist OpenStreetMap (OSM) ist ein Wikipedia der Geoinformationen, bei dem beim Arbeiten einige Feinheiten auftauchen können, dass die Daten nicht ausreichen, sie werden nicht immer “sauber“oder völlig wahr. Aber die meisten Informationen sind zuverlässig.

Zum Download benötigen wir Dateien im .pbf-Format

Es gibt zwei Quellen, um die erforderlichen .pbf-Dateien zu erhalten:

  • GeoFabrik – enthält große Deponien von Ländern und Bezirken.

  • BBBbike – Ermöglicht das Hochladen von Daten aus einem bestimmten Bereich

Um Daten in die Datenbank zu exportieren, müssen Sie das Paket osm2pgsql in unserem Container installieren

Um den Container zu betreten, müssen Sie die folgenden Skripte im Terminal ausführen:

  • docker ps – Aktive Container anzeigen

  • Kopieren Sie dann die Container-ID und führen Sie den Befehl aus: docker exec -it sh

Anfänglich ist das Paket osm2pgsql nicht installiert; zur Installation müssen Sie die folgenden Befehle ausführen:

apt-get updateapt-get install make cmake g++ libboost-dev libboost-system-dev \ libboost-filesystem-dev libexpat1-dev zlib1g-dev \ libbz2-dev libpq-dev libproj-dev lua5.2 liblua5.2-devapt-get osm2pgsql installieren

Überprüfen Sie schließlich mit dem folgenden Befehl, ob das Paket osm2pgsql installiert ist:

osm2pgsql –version

Bei Erfolg sollten Sie eine Nachricht wie diese erhalten:

Sie müssen auch das wget-Paket mit dem folgenden Befehl installieren:

apt-get install wget

Jetzt ist unser Container fertig. Alle Pakete sind installiert. Fahren Sie mit dem Laden von Daten in die Datenbank fort

Laden von Daten in die Datenbank mit osm2pgsql

Vor dem Hochladen müssen Sie entscheiden, was Sie hochladen möchten, und danach ein Schema in der Datenbank für Ihre Bedürfnisse erstellen. Beispielsweise werde ich meine Stadt hochladen und dafür ein Irkutsk-Schema in der Datenbank erstellen. osm2pgsql selbst erstellt keine Schemas für Ihre Aufgaben, wenn Sie Daten in ein nicht vorhandenes Schema laden, erhalten Sie eine Ausnahme.

Zuvor habe ich ein Nagen von der Seite gemacht BBBbike in Irkutsk und deshalb erhalte ich diese Datei.

Um Ihren Dump in einen Container zu legen, müssen Sie den folgenden Befehl verwenden:

wget https://download.bbbike.org/osm/extract/planet_104.066,52.123_101.536,52.423.osm.pbf

Der Upload war erfolgreich und wir prüfen mit dem Befehl ls, ob sich die Datei im Container befindet

Die Datei befindet sich im Container und kann nun in die Datenbank geladen werden. Ich möchte Sie daran erinnern, dass der Container eine isolierte Umgebung ist und es daher nicht möglich ist, Dateien von Ihrem PC hochzuladen.

Verwenden Sie den folgenden Befehl, um Daten aus einer Datei in die Datenbank zu laden

osm2pgsql -U postgres -W -l -d geo -H localhost –output-pgsql-schema=irkutsk –number-processes 24 -C 20480 planet_104.066,52.123_101.536,52.423.osm.pbf

Ich werde nicht alle Attribute dieses Befehls erklären, ich werde das nur sagen Dokumentation Das Paket osm2pgsql ist gut erklärt. Hat auch gute Ergänzung zur Hauptdokumentation.

Aber ein paar Punkte müssen noch geklärt werden:

  1. Ich empfehle, das Attribut -l zu verwenden, damit die Koordinaten das übliche Format haben (Breitengrad, Längengrad). Wenn Sie dieses Attribut nicht festlegen, werden die Koordinaten im Format x, y (Pseudo-Mercator) angezeigt. Beim Hinzufügen von Daten müssen Sie Ihre Daten durch Funktionen laufen lassen, um Breiten- und Längengrad in x bzw. y umzuwandeln. Mehr hier (siehe Geografische Projektionen).

  2. Kleine Dateien werden schnell geladen und verbrauchen nicht viel von den Ressourcen Ihres Geräts, aber große Dateien erfordern ziemlich viel RAM zum Laden.

    Um große Dateien herunterzuladen, wird daher empfohlen, das Attribut –slim zu verwenden, das den RAM-Verbrauch reduziert, aber die Ausführungszeit des Datendownloads erhöht. Aber wenn Sie endlos RAM haben, dann können Sie auf dieses Attribut verzichten. Ein Beispiel für das Laden des Central Federal District ist unten.

Auf meinem Laptop dauerte das Laden des Central Federal District (CFD) 2 Stunden 16 MinutenAuf meinem Laptop dauerte das Laden des Central Federal District (CFD) 2 Stunden 16 Minuten

Ich stelle fest, dass das Skript selbst alle Tabellen und Indizes erstellt.

So sieht central_federal_district (CFD) in der Datenbank ausSo sieht central_federal_district (CFD) in der Datenbank aus

Nun zurück nach Irkutsk.

Erfolgreiche Ausführung und alle Protokolle sehen so aus:

So sehen die Daten in der Datenbank aus:

Die Daten sind in der Datenbank und jetzt können Sie zu Abfragen gehen

Abfragen und Datenvisualisierung

Lassen Sie uns eine einfache Abfrage ausführen:

WÄHLE Bevölkerung, “Name”, Weg FROM irkutsk.planet_osm_point, WO Bevölkerung NICHT NULL IST

Und wir erhalten dieses Ergebnis:

Ich stelle fest, dass Tools zur Visualisierung von Geoinformationen bereits in DBeaver installiert sind und wir uns daher keine Gedanken darüber machen müssen.

Leicht synthetisiertes Beispiel

PostGIS verfügt über viele Funktionen, die es Ihnen ermöglichen, mit Geoinformationen zu arbeiten. Alle Funktionen befinden sich im öffentlichen Schema

Die Dokumentation beschreibt alle Funktionen, aber jetzt betrachten wir die Funktionen zum Berechnen Entfernungen:

Lassen Sie uns zunächst eine Tabelle mit den Punkten erstellen, die wir mit dieser Abfrage benötigen:

CREATE TABLE irkutsk.point (id int, name text, latitude NUMERIC(128,20), longitude NUMERIC(128,20), way public.geometry(point, 4326), PRIMARY KEY(id))

Dann fügen wir mit der folgenden Abfrage Daten zur Tabelle hinzu:

INSERT INTO irkutsk.point VALUES ( 254, ‘Soviet’, 52.280067, 104.32905, ST_SetSRID(ST_MakePoint(104.32905, 52.280067), 4326) )

Jetzt können Sie sich das Ergebnis der Abfrage ansehen und sehen, dass der Punkt erfolgreich zur Datenbank hinzugefügt wurde:

Und jetzt das versprochene synthetische Beispiel: Wir müssen die Entfernung zwischen einem bestimmten Haus und einer Haltestelle des öffentlichen Verkehrs berechnen. Dieses Beispiel soll Funktionen in PostGIS demonstrieren und daher ist es besser, vorerst nicht über seine Logik nachzudenken 🙂

WITH stop AS ( SELECT p.way AS point_stop, p.name AS name_stop, (SELECT way AS point_branch FROM irkutsk.point) FROM irkutsk.planet_osm_point AS p WHERE p.osm_id = 1527941151 ) SELECT public.st_distance( public.st_transform(point_stop ::geometry, 3857), public.st_transform(point_branch::geometry, 3857) ),* FROM stop

Und wir erhalten folgendes Ergebnis:

Es wurde auch in DBeaver gerendert:

Zusammenfassung: PostGIS ist ein mächtiges Werkzeug für die Arbeit mit Geoinformationen, es hat viele Funktionen, die Ihnen helfen werden, Ihr Ziel zu erreichen. Und auch dank DBeaver können Sie das Ergebnis Ihrer Aktionen sofort sehen, ohne Daten in Dienste von Drittanbietern hochzuladen, ohne Python mit dieser Arbeit zu verbinden.

Similar Posts

Leave a Reply

Your email address will not be published.