Einführung
PostGIS ist die räumliche Erweiterung der relationalen PostgreSQL-Datenbank. Mit PostGIS können Sie räumliche Daten mithilfe von Geometrie- und Geografiedatentypen speichern, räumliche Abfragen mit räumlichen Funktionen ausführen, um Fläche, Entfernung, Länge und Umfang zu bestimmen, und räumliche Indizes für Ihre Daten erstellen, um räumliche Abfragen zu beschleunigen.
In diesem Handbuch installieren Sie PostGIS, konfigurieren PostgreSQL für räumliche Daten, laden einige räumliche Objekte in Ihre Datenbank und führen eine grundlegende Abfrage durch.
Voraussetzungen
Bevor Sie mit diesem Handbuch beginnen, benötigen Sie Folgendes:
-
Ein Ubuntu 14.04 Server
-
Ein Benutzer ohne Rootberechtigung mit sudo-Berechtigungen. Das Tutorial Initial Server Setup-Anleitung für Ubuntu 14.04 erklärt, wie Sie dies einrichten.
-
Eine PostgreSQL-Datenbank. Folgen Sie unserer Anleitung unter Installation und Verwendung von PostgreSQL unter Ubuntu 14.04. Wir verwenden die "+ test1 +" - Datenbank und den Benutzer, die Sie in diesem Handbuch für dieses Tutorial eingerichtet haben.
Schritt 1 - PostGIS installieren
PostGIS ist nicht in den Standard-Repositorys für Ubuntu enthalten, kann jedoch über UbuntuGIS abgerufen werden, ein externes Repository, das eine Reihe von Open-Source-GIS-Paketen verwaltet. Obwohl das PostGIS-Paket in diesem Repository nicht immer die neueste Version ist, ist es gut gepflegt und es ist nicht mehr erforderlich, PostGIS aus dem Quellcode zu kompilieren. Um PostGIS zu installieren, fügen wir dieses Repository zu unseren Quellen hinzu und installieren es dann mit unserem Paketmanager.
Melden Sie sich bei Ihrem Server mit Ihrem Nicht-Root-Benutzer an:
ssh @
Da wir Ubuntu 14.04 verwenden, benötigen wir den instabilen Zweig des Repositorys. Führen Sie den folgenden Befehl aus, um das Repository zu Ihren Quellen hinzuzufügen:
sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable
Sie sehen die folgende Ausgabe:
OutputUnstable releases of Ubuntu GIS packages. These releases are more bleeding edge and while generally they should work well, they dont receive the same amount of quality assurance as our stable releases do.
More info: https://launchpad.net/~ubuntugis/+archive/ubuntu/ubuntugis-unstable
Press [ENTER] to continue or ctrl-c to cancel adding it
Drücken Sie + ENTER +
, um die Warnung zu akzeptieren, und die Quelle wird hinzugefügt:
Outputgpg: keyring `/tmp/tmpintg192h/secring.gpg' created
gpg: keyring `/tmp/tmpintg192h/pubring.gpg' created
gpg: requesting key 314DF160 from hkp server keyserver.ubuntu.com
gpg: /tmp/tmpintg192h/trustdb.gpg: trustdb created
gpg: key 314DF160: public key "Launchpad ubuntugis-stable" imported
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)
OK
Bevor Sie PostGIS installieren können, aktualisieren Sie Ihre Liste der verfügbaren Pakete, damit die Pakete aus dem neuen Repository zur Liste hinzugefügt werden.
sudo apt-get update
Installieren Sie nach dem Update Ihrer Quellen PostGIS.
sudo apt-get install postgis
Geben Sie "+ Y +" ein, wenn Sie aufgefordert werden, PostGIS zusammen mit den erforderlichen Abhängigkeiten zu installieren.
Wir können uns nun mit PostgreSQL verbinden und PostGIS integrieren.
Schritt 2 - Aktivieren von räumlichen Merkmalen mit PostGIS
PostGIS-Funktionen müssen für jede Datenbank einzeln aktiviert werden, bevor Sie räumliche Daten speichern können. Wir werden mit der + test1 +
Datenbank und dem + postgres +
Benutzer von https://www.digitalocean.com/community/tutorials/how-to-install-and-use-postgresql-on-ubuntu- arbeiten. 14-04 [So installieren und verwenden Sie PostgreSQL unter Ubuntu 14.04] Tutorial, dem Sie gefolgt sind, bevor Sie dieses Tutorial gestartet haben.
Wechseln Sie mit dem Befehl + sudo +
zum Benutzer + postgres +
:
sudo -i -u postgres
Dann verbinden Sie sich mit der + test1 +
Datenbank:
psql -d test1
Aktivieren Sie als Nächstes die PostGIS-Erweiterung für die Datenbank:
CREATE EXTENSION postgis;
Vergewissern wir uns, dass alles richtig funktioniert hat. Führen Sie den folgenden Befehl aus:
SELECT PostGIS_version();
Sie sehen diese Ausgabe:
Output postgis_version
---------------------------------------
2.2 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
(1 row)
Wir sind fertig. Type
\q
um die SQL-Sitzung zu beenden und zur Eingabeaufforderung Ihres Terminals zurückzukehren.
Wechseln Sie dann zurück zu Ihrem Hauptbenutzerkonto:
su
Wir haben jetzt eine Datenbank mit PostGIS installiert, aber lassen Sie uns einige PostgreSQL-Einstellungen anpassen, um einen reibungslosen Ablauf zu gewährleisten.
Schritt 3 - Optimieren von PostgreSQL für GIS-Datenbankobjekte
PostgreSQL kann auf allen Systemen, von integrierten Systemen bis hin zu großen Unternehmensdatenbanken, ausgeführt werden, ist jedoch standardmäßig sehr konservativ konfiguriert. GIS-Datenbankobjekte sind im Vergleich zu Textdaten groß. Lassen Sie uns PostgreSQL so konfigurieren, dass es mit diesen Objekten besser funktioniert.
Wir konfigurieren PostgreSQL, indem wir die Datei + postgresql.conf +
bearbeiten. Öffnen Sie diese Datei:
sudo nano /etc/postgresql/9.3/main/postgresql.conf
An dieser Datei müssen einige Änderungen vorgenommen werden, um Geodaten zu unterstützen.
Zunächst sollte "+ shared_buffers " auf etwa 75% des RAM Ihres Servers geändert werden. " 200MB " ist also ein guter Wert für einen Server mit 512MB RAM. Suchen Sie die Zeile ` shared_buffers +` und ändern Sie sie wie folgt:
/etc/postgresql/9.3/main/postgresql.conf
shared_buffers = # min 128kB
Suchen Sie als nächstes die Zeile, die mit + # work_mem +
beginnt. Diese Zeile ist standardmäßig auskommentiert. Kommentieren Sie diese Zeile aus und erhöhen Sie ihren Wert auf "+ 16MB +":
/etc/postgresql/9.3/main/postgresql.conf
work_mem = # min 64kB
Suchen Sie dann "+ # maintenance_work_mem ", kommentieren Sie es aus und erhöhen Sie seinen Wert auf " 128MB +":
/etc/postgresql/9.3/main/postgresql.conf
maintenance_work_mem = # min 1MB
Suchen Sie nach "+ checkpoint_segments ", entfernen Sie das Kommentarzeichen und ändern Sie den Wert in " 6 +":
/etc/postgresql/9.3/main/postgresql.conf
checkpoint_segments = 6 # in logfile segments, min 1, 16MB each
Suchen Sie abschließend nach "+ # random_page_cost ". Wenn Sie es finden, kommentieren Sie es aus und setzen Sie seinen Wert auf " 2.0 +":
/etc/postgresql/9.3/main/postgresql.conf
random_page_cost = 2.0 # same scale as above
Drücken Sie zum Beenden die Tastenkombination "+ STRG + X ", gefolgt von " Y " und " ENTER +", um die Änderungen in dieser Datei zu speichern.
Weitere Informationen zu diesen Einstellungen finden Sie im Tutorial Tuning PostgreSQL for Spatial.
Starten Sie PostgreSQL neu, damit die folgenden Änderungen wirksam werden:
sudo service postgresql restart
Wir haben jetzt PostGIS installiert und PostgreSQL konfiguriert. Lassen Sie uns einige Daten in die Datenbank aufnehmen, damit wir sie testen können.
Schritt 4 - Laden von Geodaten
Laden Sie einige räumliche Daten in unsere Datenbank, damit wir uns mit den Tools und dem Verfahren zum Abrufen dieser Daten in PostgreSQL vertraut machen und später einige räumliche Abfragen durchführen können.
Natural Earth bietet eine großartige Basisdatenquelle für die ganze Welt in verschiedenen Maßstäben. Das Beste ist, dass diese Daten gemeinfrei sind.
Navigieren Sie zu Ihrem Basisordner und erstellen Sie einen neuen Ordner mit dem Namen "+ nedata +". In diesem Ordner werden die von uns heruntergeladenen Natural Earth-Daten gespeichert.
cd ~
mkdir nedata
Navigieren Sie dann in diesen neuen Ordner:
cd nedata
Wir werden den 1: 110m Länderdatensatz von Natural Earth herunterladen. Verwenden Sie "+ wget +", um diese Datei auf Ihren Server zu ziehen:
wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_0_countries.zip
Die soeben heruntergeladene Datei ist komprimiert. Sie benötigen daher den Befehl "+ unzip +", den Sie über den Paket-Manager installieren können. Installieren Sie es mit dem folgenden Befehl:
sudo apt-get install unzip
Dann entpacke die Datei:
unzip ne_110m_admin_0_countries.zip
Sie haben jetzt sechs zusätzliche Dateien im Ordner:
-
+ ne_110m_admin_0_countries.README.html
-
+ ne_110m_admin_0_countries.VERSION.txt +
-
+ ne_110m_admin_0_countries.dbf +
-
+ ne_110m_admin_0_countries.prj +
-
+ ne_110m_admin_0_countries.shp +
-
+ ne_110m_admin_0_countries.shx +
Die Dateien * .dbf *, * .prj *, * .shp * und * .shp * bilden eine http://help.arcgis.com/de/arcgisdesktop/10.0/help/index.html#/Shapefile_file_extensions/ 005600000003000000 / [ShapeFile], ein beliebtes Geodatenformat, das von der GIS-Software verwendet wird. Wir können dies in unsere + test1 +
Datenbank laden.
Dazu installieren wir GDAL, die Geospatial Data Abstraction Library. Bei der Installation von GDAL erhalten wir auch OGR (OpenGIS Simple Features Reference Implementation) und den Befehl "+ ogr2ogr +". Dies ist eine Vektordaten-Übersetzungsbibliothek, mit der wir das Shapefile in Daten übersetzen, die PostGIS verwenden kann.
Installieren Sie GDAL mit dem Paketmanager:
sudo apt-get install gdal-bin
Wechseln Sie nun wieder zum Benutzer + postgres +
:
sudo -i -u postgres
Konvertieren Sie nun das Shapefile, das Sie von Natural Earth erhalten haben, mit + ogr2ogr +
in eine PostGIS-Tabelle:
ogr2ogr -f PostgreSQL PG:dbname=test1 -progress -nlt PROMOTE_TO_MULTI /home//nedata/ne_110m_admin_0_countries.shp
Lassen Sie uns diesen Befehl aufschlüsseln und jede Option im Detail betrachten. Als erstes spezifizieren wir diese Option:
-f PostgreSQL
Dieser Schalter gibt an, dass der Ausgabedateityp eine PostgreSQL-Tabelle ist.
Als nächstes haben wir diese Option:
PG:dbname=test1
Dadurch wird die Verbindungszeichenfolge zu unserer Datenbank festgelegt. Wir geben hier nur den Datenbanknamen an. Wenn Sie jedoch einen anderen Benutzer, Host und Port verwenden möchten, können Sie die folgenden Optionen festlegen:
PG:"dbname='databasename' host='addr' port='5432' user='x' password='y'"
Als nächstes in unserer Liste der Optionen ist dies:
-progress
Diese Option zeigt einen Fortschrittsbalken an, damit wir den Prozess visualisieren können.
Als nächstes übergeben wir dieses Argument:
-nlt PROMOTE_TO_MULTI
PostgreSQL ist streng auf Objekttypen. Mit dem Befehl "+ ogr2ogr +" wird basierend auf den ersten Features in einer Datei eine Annahme über den Geometrietyp getroffen. Die Daten, die wir importieren, enthalten eine Mischung aus * Polygon * -Typen und mehrteiligen Polygonen oder * MultiPolygons *. Diese können nicht in dasselbe Feld eingefügt werden. Daher werden alle Features in mehrteilige Polygone umgewandelt, und das Geometriefeld wird als * MultiPolygon * erstellt.
Zuletzt geben wir den Pfad zur Eingabedatei an:
/home//nedata/ne_110m_admin_0_countries.shp
Besuchen Sie die Website ogr2ogr, um alle Optionen anzuzeigen.
Wenn Sie den vollständigen Befehl ausführen, wird die folgende Ausgabe angezeigt:
Output0...10...20...30...40...50...60...70...80...90...100 - done.
Wir können überprüfen, ob die Daten importiert wurden, indem wir den Befehl "+ ogrinfo +" verwenden. Führen Sie den folgenden Befehl aus:
ogrinfo -so PG:dbname=test1 ne_110m_admin_0_countries
Dies zeigt die folgende Ausgabe an:
OutputINFO: Open of `PG:dbname=test1'
using driver `PostgreSQL' successful.
Layer name:
Geometry:
Feature Count: 177
Extent: (-180.000000, -90.000000) - (180.000000, 83.645130)
Layer SRS WKT:
GEOGCS["WGS 84",
DATUM["WGS_1984",
SPHEROID["WGS 84",6378137,298.257223563,
AUTHORITY["EPSG","7030"]],
AUTHORITY["EPSG","6326"]],
PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],
UNIT["degree",0.0174532925199433,
AUTHORITY["EPSG","9122"]],
AUTHORITY["EPSG","4326"]]
FID Column = ogc_fid
Geometry Column = wkb_geometry
scalerank: Integer (4.0)
featurecla: String (30.0)
...
region_wb: String (254.0)
name_len: Real (16.6)
long_len: Real (16.6)
abbrev_len: Real (16.6)
tiny: Real (16.6)
homepart: Real (16.6)
Wir haben jetzt räumliche Daten in unserer Datenbank. Schauen wir uns also an, wie wir sie zur Lösung von Problemen verwenden können.
Schritt 5 - Abfragen von räumlichen Daten
Angenommen, wir wurden gebeten, die zehn nördlichsten Länder der Welt zu finden. Mit PostGIS und den von uns importierten Daten ist das ganz einfach.
Loggen Sie sich wieder in die + test1 +
Datenbank ein.
psql -d test1
Listen Sie die Tabellen in der Datenbank auf:
\dt
Dies gibt zwei Tabellen zurück:
Output List of relations
Schema | Name | Type | Owner
--------+---------------------------+-------+----------
public | ne_110m_admin_0_countries | table | postgres
public | spatial_ref_sys | table | postgres
(2 rows)
Wir verwenden die Tabelle "+ ne_110m_admin_0_countries ", die die Daten enthält, die uns bei der Beantwortung unserer Frage helfen. Diese Tabelle enthält eine Spalte " admin " mit dem Namen des Landes und eine Spalte " wkb_gemoetry " mit geometrischen Daten. Wenn Sie alle Spalten in der Tabelle ` ne_110m_admin_0_countries +` anzeigen möchten, können Sie den folgenden Befehl ausführen:
\d ne_110m_admin_0_countries
Sie sehen die Spalten und ihre Datentypen. Der Datentyp der Spalte "+ wbk_geometry +" sieht folgendermaßen aus:
wkb_geometry | geometry(MultiPolygon,4326) |
Die Spalte "+ wbk_geometry " enthält Polygone. Wir haben es mit Ländern und ihren irregulären Grenzen zu tun, und daher hat jedes Land in unserer Datenbank keinen einzigen Wert für den Breitengrad. Um den Breitengrad für jedes Land zu ermitteln, ermitteln wir zunächst den Schwerpunkt jedes Landes mit der Funktion ` ST_Centroid ` von PostGIS. Dann extrahieren wir den Y-Wert des Schwerpunkts mit der Funktion " ST_Y +". Wir können diesen Wert als Breitengrad verwenden.
Hier ist die Abfrage, die wir ausführen:
SELECT admin, ST_Y(ST_Centroid(wkb_geometry)) as latitude
FROM ne_110m_admin_0_countries
ORDER BY latitude DESC
LIMIT 10;
Wir ordnen die Ergebnisse in absteigender Reihenfolge, da das nördlichste Land den höchsten Breitengrad hat.
Wenn Sie diese Abfrage ausführen, werden die zehn nördlichsten Länder angezeigt:
Output admin | latitude
-----------+------------------
Greenland | 74.7704876939899
Norway | 69.1568563971328
Iceland | 65.074276335291
Finland | 64.5040939185674
Sweden | 62.8114849680803
Russia | 61.9808407507127
Canada | 61.4690761453491
Estonia | 58.643695240707
Latvia | 56.8071751342793
Denmark | 56.0639344617945
(10 rows)
Nachdem Sie Ihre Antwort erhalten haben, können Sie die Datenbank mit beenden
\q
Weitere Informationen zu den verschiedenen PostGIS-Funktionen finden Sie im Abschnitt PostGIS Reference der PostGIS-Dokumentation.
Fazit
Sie haben jetzt eine räumlich aktivierte Datenbank, die für räumliche Abfragen konfiguriert ist, und Sie haben einige Daten in dieser Datenbank, die Sie für die weitere Untersuchung verwenden können.
Eine ausführlichere Anleitung zum Erstellen räumlicher Abfragen finden Sie unter Boundless PostGIS Tutorial.