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!
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.
Um loszulegen, benötigen Sie eine App beliebiger Größe. Anschließend fügen Sie Ihrer App eine Instanz von Heroku Postgres hinzu.
Für meine Demo werde ich eine leere App erstellen.
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 .
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.
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:
nyc_data.backup
verfügbar macht.
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.
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.
Sehen wir uns nun an, wie PostGIS funktioniert.
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.
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.
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!