paint-brush
Lage, Lage, Lage! PostGIS und Heroku Postgresvon@josephcaudle
588 Lesungen
588 Lesungen

Lage, Lage, Lage! PostGIS und Heroku Postgres

von Joseph Caudle9m2024/04/16
Read on Terminal Reader

Zu lang; Lesen

Kürzlich habe ich erfahren, dass Heroku auch PostGIS unterstützt. Ich persönlich habe PostGIS noch nie zuvor verwendet. Ich kenne mehrere proprietäre Konkurrenten des Produkts, daher dachte ich, dies wäre ein guter Zeitpunkt, die Open-Source-Option auszuprobieren.
featured image - Lage, Lage, Lage! PostGIS und Heroku Postgres
Joseph Caudle HackerNoon profile picture

Erweiterung von Postgres zur Unterstützung georäumlicher Datenabfragen

Ich habe zu viel Zeit damit verschwendet, an Konfigurationen und Diensten herumzufummeln, nur um eine Compute-Instanz in AWS hochzufahren. Manchmal brauche ich einfach eine produktionsreife Umgebung, mit der ich herumspielen und Anwendungen und Ideen testen kann. Mit Heroku kann ich das mit nur ein paar einfachen Befehlen in der CLI erreichen.


Kürzlich habe ich erfahren, dass Heroku auchPostGIS unterstützt . Ich persönlich habe PostGIS noch nie zuvor verwendet. Ich kenne mehrere proprietäre Konkurrenten des Produkts, daher dachte ich, dies wäre ein guter Zeitpunkt, die Open-Source-Option auszuprobieren.


In diesem Artikel zeige ich Ihnen, wie Sie eine PostGIS-fähige Postgres-Instanz auf Heroku zum Laufen bringen. Dann führe ich einige Beispielabfragen in der Datenbank aus, damit Sie ein Gefühl dafür bekommen, wie es funktioniert. Und das Beste daran? Sie können uns dabei folgen und Ihre eigenen Erkundungen durchführen!

Was ist PostGIS?

Selbst wenn Sie Postgres schon eine Weile verwenden, sind Sie möglicherweise nicht mit PostGIS vertraut. GIS steht für Geographic Information System . In diesem Bereich gibt es viele Lösungen. Das Schöne an PostGIS ist jedoch, dass es auf der beliebten PostgreSQL-Datenbank basiert. Zusätzlich zu der Leistung, die Sie von Postgres erwarten, erhalten wir ein voll funktionsfähiges Tool zum Speichern georäumlicher Daten.


PostGIS bietet nicht nur eine gute Speicherlösung für diesen Datentyp, sondern kann auch nahtlos in verschiedene Anwendungen integriert werden, die diese Daten nutzen können (wie ArcGIS und Tableau).


TL; DR – Wenn Sie Standortdaten verarbeiten, speichern oder abfragen müssen, ist PostGIS eine großartige Option dafür. Glücklicherweise ist es so einfach wie das Hinzufügen eines Add-Ons zu einer Heroku-App, um eine neue Postgres-Instanz zum Laufen zu bringen. Also, lasst uns das jetzt tun.

Wie können wir PostGIS verwenden?

Um loszulegen, benötigen Sie eine App beliebiger Größe. Anschließend fügen Sie Ihrer App eine Instanz von Heroku Postgres hinzu.

Erstellen einer Heroku-App

Für meine Demo werde ich eine leere App erstellen.

Anfügen eines Heroku Postgres-Add-ons

Sobald die App erstellt ist, kann ich das Heroku Postgres-Add-on erstellen. Da mein Beispieldatensatz zu groß für eine Mini-Planinstanz ist, muss ich stattdessen den Basic-Plan verwenden. Ich kann dies über die Befehlszeile tun:

 $ heroku login $ heroku addons:create heroku-postgresql:basic -a postgis-demo Creating heroku-postgresql:basic on ⬢ postgis-demo... ~$0.013/hour (max $9/month) Database has been created and is available ! This database is empty. If upgrading, you can transfer ! data from another database with pg:copy Created postgresql-fitted-78461 as DATABASE_URL

Nachdem ich meine Postgres-Datenbank erstellt habe, sind nur noch wenige Schritte erforderlich, um PostGIS einzurichten .

Erstellen der PostGIS-Erweiterung

Heroku Postgres bietet viele mögliche Erweiterungen, die wir installieren könnten. Um sie aufzulisten, können wir unsere Instanz fragen:

 $ heroku pg:psql -a postgis-demo --> Connecting to postgresql-fitted-78461 … postgis-demo::DATABASE=> \x on; Expanded display is on. postgis-demo::DATABASE=> show extwlist.extensions; … address_standardizer,address_standardizer_data_us,amcheck,autoinc,bloom,btree_gin,btree_gist,citext,cube,dict_int,earthdistance,fuzzystrmatch,hstore,insert_username,intarray,isn,lo,ltree,moddatetime,pg_partman,pg_stat_statements,pg_trgm,pgcrypto,pgrowlocks,postgis,postgis_raster,postgis_topology,refint,seg,sslinfo,tablefunc,tcn,tsm_system_rows,tsm_system_time,unaccent,uuid-ossp


Wir sehen postgis in der Liste der verfügbaren Erweiterungen. Von dort aus können wir die Erweiterung erstellen.

 postgis-demo::DATABASE=> CREATE EXTENSION postgis; CREATE EXTENSION


Wir können bestätigen, dass die Erweiterung installiert ist, und die Version überprüfen:

 postgis-demo::DATABASE=> SELECT postgis_version(); -[ RECORD 1 ]---+-------------------------------------- postgis_version | 3.4 USE_GEOS=1 USE_PROJ=1 USE_STATS=1


Alles klar! Es sieht so aus, als ob wir mit PostGIS 3.4 einsatzbereit sind.

Ursprünglichen Datensatz laden

Nachdem ich nun die PostGIS-Erweiterung aktiviert habe, muss ich einen Datensatz laden, mit dem ich herumexperimentieren kann. Ich verwende den Datensatz aus dem Buch „Einführung in PostGIS“ . Das heruntergeladene Datenpaket ist eine 21,5 MB große ZIP-Datei. Im Unterordner „ data “ des extrahierten Archivs befindet sich eine 9,5 MB große Datei namens nyc_data.backup .


Dies ist eine Datei mit allen Volkszählungsdaten der New Yorker Volkszählung von 2000 sowie allen Straßen, Stadtvierteln und U-Bahn-Stationen der Stadt.


Wir können die Datensicherung direkt auf unserer Heroku Postgres-Instanz wiederherstellen, indem wir den Befehl heroku pg:backups:restore verwenden. Das ist unglaublich praktisch. Beachten Sie jedoch die folgenden Einschränkungen:


  • Die Sicherungsdatei, aus der Sie wiederherstellen können, kann nicht von Ihrem lokalen Computer hochgeladen werden. Sie muss online verfügbar sein. Glücklicherweise habe ich ein GitHub-Repository gefunden, das nyc_data.backup verfügbar macht.


  • Die Datenbankwiederherstellung beginnt mit dem vollständigen Zurücksetzen Ihrer Heroku Postgres-Instanz, einschließlich der Installation der postgis Erweiterung. Obwohl wir oben gezeigt haben, wie die Erweiterung manuell installiert wird, müssen wir beim Wiederherstellen unserer Datenbank ein Flag hinzufügen, um die Erweiterung vor dem Laden der Daten vorzuinstallieren.


Hier ist der Befehl, den wir zum Wiederherstellen der Datenbanksicherung verwenden würden:

 $ heroku pg:backups:restore \ https://github.com/Giorgi/PostgresSamples/raw/main/nyc_data.backup \ -e postgis \ -a postgis-demo

Unsere Sicherungsdatei wird über eine öffentlich zugängliche URL angegeben. Sie können den Datensatz jederzeit aus dem PostGIS-Tutorial herunterladen, die Datei nyc_data.backup extrahieren und sie an einem Ort Ihrer Wahl online veröffentlichen.


Das Flag -e postgis gibt an, dass wir die postgis Erweiterung installieren möchten, bevor wir das Schema und die Daten des Backups laden.


Das war es! Nicht schlecht für ein paar einfache Befehle. Wir haben unsere Datenbank und Daten.

Warum Heroku?

Wenn Sie bereits wissen, wie man Postgres auf einem lokalen Rechner einrichtet, fragen Sie sich vielleicht, warum ich mich für Heroku entschieden habe. Der wichtigste Grund ist für mich die Einfachheit. Außer der Auswahl eines ausreichend großen Heroku-Postgres-Plans für die von mir geplante Analyse und der Installation der PostGIS-Erweiterung muss ich nichts weiter tun, um loszulegen.


Außerdem ist die Zusammenarbeit bei allen von mir durchgeführten Analysen ganz einfach. Ich kann anderen Personen als Mitarbeiter Zugriff auf meine Datenbank gewähren oder schnell eine Anwendung auf der Datenbank erstellen und den Zugriff über eine normale Weboberfläche statt über den Postgres-Client freigeben.


Wenn ich mit der Arbeit an einem Projekt fertig bin und es nicht mehr brauche, kann ich die App einfach auf Heroku löschen und alles ist weg. Keine Datendateien auf meinem Computer, um die ich mir Sorgen machen muss. Keine zusätzliche Software, die lokal installiert ist. Ich kann einen kurzen Ausflug in eine neue Technologie genießen und dann weitermachen, wenn ich fertig bin.

Arbeiten mit PostGIS

Sehen wir uns nun an, wie PostGIS funktioniert.

Arbeiten Sie wie mit Postgres

Zunächst einmal ist zu beachten, dass PostGIS eine Erweiterung innerhalb von Postgres ist. Das bedeutet, dass Sie damit auch jede Standardabfrage von Postgres ausführen können.


Nehmen wir an, ich möchte herausfinden, wie viele Straßen in New York mit B beginnen. Eine einfache SQL-Abfrage sagt mir:

 postgis-demo::DATABASE=> SELECT count(*) postgis-demo::DATABASE-> FROM nyc_streets postgis-demo::DATABASE-> WHERE name LIKE 'B%'; count 1282 (1 row)


Wie wäre es mit der Anzahl der Stadtteile in jedem Bezirk? Auch hier eine einfache SQL-Abfrage:

 postgis-demo::DATABASE=> SELECT boroname, count(*) postgis-demo::DATABASE-> FROM nyc_neighborhoods postgis-demo::DATABASE-> GROUP BY boroname; boroname | count ---------------+------- Queens | 30 Brooklyn | 23 Staten Island | 24 The Bronx | 24 Manhattan | 28 (5 rows)

Bisher haben wir uns nur mit Standard-PostgreSQL beschäftigt. Sehen wir uns nun an, wie man die PostGIS-Funktionen nutzt.

Beispiele für die Arbeit mit georäumlichen Geometrien

Da unser Datensatz alle New Yorker Straßen enthält, können wir mit dieser Abfrage fragen, wie viele Kilometer Straßen es in der Stadt gibt:

 postgis-demo::DATABASE=> SELECT Sum(ST_Length(geom)) / 1000 as street_length FROM nyc_streets; street_length -------------------- 10418.904717199996 (1 row)


Wir können auch Flächen berechnen, beispielsweise die Fläche von ganz Manhattan:

 postgis-demo::DATABASE=> SELECT Sum(ST_Area(geom)) / 4047 as acreage FROM nyc_neighborhoods WHERE boroname = 'Manhattan'; acreage ------------------- 13965.32012239119 (1 row)

Beachten Sie, dass diese Berechnungen auf den Geodaten basieren und nicht auf Spalten, die mit aggregierten Daten dieser Art in Zusammenhang stehen. Darüber hinaus werden diese Abfragen auch extrem schnell ausgeführt.


Eine letzte Abfrage, die mich wirklich erstaunt, betrifft die Verwendung von räumlichen Verknüpfungen . Ähnlich wie bei herkömmlichen Datenbankverknüpfungen können räumliche Verknüpfungen mehrere Tabellen zusammenführen, allerdings auf der Grundlage räumlicher Beziehungen. Beispielsweise können wir anhand der räumlichen Daten abfragen, in welchem Viertel sich eine bestimmte U-Bahn-Station befindet. Dazu können wir ST_Contains von PostGIS verwenden, um zu ermitteln, ob die Geometrie des Viertels die Geometrie der U-Bahn-Station vollständig enthält.


Basierend auf dem Namen der U-Bahn (in nyc_subway_stations ) fragen wir nach dem Viertel (in nyc_neighborhoods ), für das ST_Contains wahr ist. Unsere Abfrage sieht folgendermaßen aus:

 postgis-demo::DATABASE=> SELECT subways.name AS subway_name, neighborhoods.name AS neighborhood_name, neighborhoods.boroname AS borough FROM nyc_neighborhoods AS neighborhoods JOIN nyc_subway_stations AS subways ON ST_Contains(neighborhoods.geom, subways.geom) WHERE subways.name = 'Broad St'; subway_name | neighborhood_name | borough -------------+--------------------+----------- Broad St | Financial District | Manhattan (1 row)

PostGIS stellt mit Geometrien sogar noch erweiterte Funktionen zur Standortabfrage bereit, dies geht jedoch über den Rahmen unserer einfachen Demo hier hinaus.

Abschluss

Obwohl ich PostGIS noch nie zuvor verwendet habe, bin ich wirklich beeindruckt von den Möglichkeiten, die es bietet. Ich könnte mit dieser Datenbank noch viel mehr machen, da ich erst etwa die Hälfte des offiziellen Einführungsbuchs zu PostGIS geschafft habe. Darüber hinaus kann ich auf PostGIS basierende Anwendungen erstellen und bereitstellen, indem ich eine beliebige Anzahl von von Heroku unterstützten Sprachen verwende.


Insbesondere denke ich, dass ich einen Anwendungsfall für die Erstellung einer Rails-App auf PostGIS finden möchte. Ich habe bereits einige Dokumentationen gefunden, die mir den Einstieg erleichtern.


Aber im Moment brauche ich diese Instanz nicht mehr, also werde ich sie bereinigen und meine App löschen. Über die CLI muss ich Folgendes tun:

 $ heroku apps:destroy postgis-demo ▸ WARNING: This will delete ⬢ postgis-demo including all add-ons. ▸ To proceed, type postgis-demo or re-run this command with --confirm postgis-demo > postgis-demo Destroying ⬢ postgis-demo (including all add-ons)... done

Warte, das ist alles? Ja, das ist alles. Mit einem einzigen Befehl und einer Bestätigung wird alles abgerissen und ich muss mich nicht mehr darum kümmern.

 $ heroku apps You have no apps. $ heroku addons No add-ons.

Nachdem ich meine App gelöscht habe, bietet sich Ihnen eine unglaubliche Chance: Der einzigartige App-Name postgis-demo ist für den ersten Leser verfügbar, der ihn auf Heroku ergattern möchte! Sind Sie bereit, Ihre nächste großartige PostGIS-App zu erstellen? Heute ist der Tag!