Chapter 10. Häufige Fragen zu PostGIS Raster

10.1. Wo kann ich detailierte Information über das Raster-Projekt von PostGIS finden?
10.2. Gibt es irgendwelche Bücher oder Übungen, die mir erklären wie Ich mit dieser wunderbare Erfindung loslegen kann?
10.3. Wie installiere Ich die Rasterunterstützung in meiner PostGIS Datenbank?
10.4. Ich bekomme die Fehlermeldung: 'could not load library "C:/Program Files/PostgreSQL/8.4/lib/rtpostgis.dll": The specified module could not be found'. Oder 'could not load library on Linux when trying to run rtpostgis.sql'
10.5. Wie kann ich Rasterdaten in PostGIS laden?
10.6. Welche Rasterformate kann Ich in meine Datenbank laden?
10.7. Kann Ich meine PostGIS Rasterdaten in ein anderes Format exportieren?
10.8. Gibt es Binärdateien von GDAL, die für die PostGIS Rasterunterstützung bereits kompiliert sind?
10.9. Welche Werkzeuge kann Ich benutzen, um Rasterdaten, die sich in PostGIS befinden, anzusehen?
10.10. Wie kann Ich einen PostGIS-Raster zu meiner MapServer-Karte hinzufügen?
10.11. Welche Funktionen kann Ich zurzeit mit meinen Rasterdaten nutzen?
10.12. Ich erhalte die Fehlermeldung "ERROR: function st_intersects(raster, unknown) is not unique or st_union(geometry,text) is not unique." Wie kann ich das beheben?
10.13. Wie unterscheidet sich PostGIS Raster von Oracle GeoRaster (SDO_GEORASTER) und SDO_RASTER-Typen?
10.14. raster2pgsql versagt beim Laden großer Dateien mit einer Fehlermeldung von "N bytes is too long for encoding conversion"?
10.15. Ich erhalte die Fehlermeldung ERROR: RASTER_fromGDALRaster: Could not open bytea with GDAL. Check that the bytea is of a GDAL supported format. wenn ich ST_FromGDALRaster verwende, oder ERROR: rt_raster_to_gdal: Could not load the output GDAL driver wenn Ich ST_AsPNG oder andere Rastereingabefunktionen verwende.

10.1.

Wo kann ich detailierte Information über das Raster-Projekt von PostGIS finden?

Siehe PostGIS Raster Homepage.

10.2.

Gibt es irgendwelche Bücher oder Übungen, die mir erklären wie Ich mit dieser wunderbare Erfindung loslegen kann?

Ein sehr ausführliches Tutorial für Einsteiger ist Intersecting vector buffers with large raster coverage using PostGIS Raster. Jorge hat eine Reihe von Blogartikel über PostGIS Raster erstellt, die zeigen wie Rasterdaten geladen werden können. Hier befindet sich auch ein Vergleich mit Oracle GeoRaster. Siehe Jorge's PostGIS Raster / Oracle GeoRaster Series. Es gibt ein ganzes Kapitel (mehr als 35 Seiten) das PostGIS Raster gewidmet ist - mit freiem Code und Daten zum Herunterladen unter PostGIS in Action - Raster chapter. Sie können PostGIS in Action bei Manning jetzt auch als Buch (wesentliche Vergünstigungen bei gemeinsamen Kauf von mehreren Büchern) oder im E-Book Format kaufen. Sie können das Buch auch bei Amazon und verschiedenen anderen Buchhändlern kaufen. Alle Bücher beinhalten einen kostenlosen Gutschein zum Herunterladen der E-Book Version.

Einen Überblick über eine Anwendung von PostGIS Raster finden Sie unter PostGIS raster applied to land classification urban forestry

10.3.

Wie installiere Ich die Rasterunterstützung in meiner PostGIS Datenbank?

Ab PostGIS 2.0 ist PostGIS Raster vollkommen integriert und wird daher zusammen mit PostGIS kompiliert.

Für eine Anleitung zur Installation und zum Betrieb unter Windows siehe How to Install and Configure PostGIS raster on windows

Wenn Sie unter Windows arbeiten, dann können Sie entweder selbst kompilieren oder Sie verwenden pre-compiled PostGIS Raster windows binaries.

Auf anderen Plattformen können Sie vom Software Repository installieren. Für weitere Details zum Kompilieren vom Quellcode, siehe Installing PostGIS Raster from source

10.4.

Ich bekomme die Fehlermeldung: 'could not load library "C:/Program Files/PostgreSQL/8.4/lib/rtpostgis.dll": The specified module could not be found'. Oder 'could not load library on Linux when trying to run rtpostgis.sql'

rtpostgis.so/dll wird in Abhängigkeit von libgdal.so/dll kompiliert. Stellen Sie auf Windows sicher, dass sich libgdal-1.dll in dem Ordner "bin" Ihrer PostgreSQL Installation befindet. Auf Linux muss sich die Bibliothek "libgdal" in Ihrem Pfad oder im Ordner "bin" befinden.

Wenn Sie PostGIS nicht in Ihrer Datenbank installiert haben, können andersartige Fehler auftreten. Stellen Sie sicher, dass PostGIS in Ihrer Datenbank installiert ist, bevor Sie versuchen die Rasterunterstützung zu installieren.

10.5.

Wie kann ich Rasterdaten in PostGIS laden?

Die neueste Version von PostGIS hat den Rasterlader raster2pgsql mit im Paket. Dieser kann, ohne zusätzliche Software, verschiedenste Rasterformate laden und auch Overviews mit geringerer Auflösung erstellen. Siehe Section 5.1.1, “Verwendung von raster2pgsql zum Laden von Rastern” für weitere Details.

10.6.

Welche Rasterformate kann Ich in meine Datenbank laden?

Jedes Format das von Ihrer Bibliothek "GDAL" unterstützt wird. Die von GDAL unterstützten Formate sind unter GDAL File Formats beschrieben.

Es kann sein, dass Ihre jeweilige Installation von GDAL nicht alle Formate unterstützt. Um zu überprüfen, welche Formate von Ihrer GDAL Installation unterstützt werden, können Sie folgendes ausführen

raster2pgsql -G

10.7.

Kann Ich meine PostGIS Rasterdaten in ein anderes Format exportieren?

Yes

GDAL enthält einen PostGIS Raster-Treiber; dieser ist allerdings nur dann vorhanden, wenn GDAL mit PostgreSQL-Unterstützung kompiliert wurde.

Zurzeit werden von dem Treiber keine unregelmäßigen Raster unterstützt, obwohl Sie unregelmäßige Raster unter PostGIS als Datentyp Raster speichern können.

Wenn Sie den Quellcode kompilieren, dann müssen Sie

--with-pg=path/to/pg_config

bei der Konfiguration angeben um die Treiber zu aktivieren. Siehe GDAL Build Hints für Tipps zum Kompilieren von GDAL auf verschiedenen Betriebssystemen.

Falls Ihre Version von GDAL mit dem PostGIS Rastertreiber kompiliert wurde, sollten PostGIS Raster aufgelistet werden, wenn Sie folgendes ausführen

gdalinfo --formats

Um eine Zusammenfassung Ihrer Raster über GDAL zu erhalten, benutzen Sie bitte gdalinfo:

gdalinfo  "PG:host=localhost port=5432 dbname='mygisdb' user='postgres' password='whatever' schema='someschema' table=sometable"

Um die Daten in andere Rasterformate zu exportieren, können Sie gdal_translate verwenden. Im folgenden exportieren wir sämtliche Daten einer Tabelle in eine PNG-Datei mit einer Dateigröße von 10%.

Abhängig von dem Pixeltyp Ihrer Bänder, können einige Übersetzungen nicht funktionieren, wenn das Exportformat diesen Pixeltyp nicht unterstützt. Zum Beispiel können Bänder vom Pixeltyp Gleitpunkt, oder vorzeichenlose 32bit-Ganzzahlen, nicht ohne weiters in ein JPG- oder in ein anderes Format konvertiert werden.

Ein Beispiel für eine einfache Übersetzung:

gdal_translate -of PNG -outsize 10% 10% "PG:host=localhost port=5432 dbname='mygisdb' user='postgres' password='whatever' schema='someschema' table=sometable" C:\somefile.png

Sie können auch SQL WHERE Klauseln bei Ihrem Export anwenden, indem Sie where=... in der Verbindungszeichenfolge angeben. Unterhalb sind einige Beispiele, welche die WHERE-Klausel verwenden

gdal_translate -of PNG -outsize 10% 10% "PG:host=localhost port=5432 dbname='mygisdb' user='postgres' password='whatever' schema='someschema' table=sometable where='filename=\'abcd.sid\''" " C:\somefile.png
gdal_translate -of PNG -outsize 10% 10% "PG:host=localhost port=5432 dbname='mygisdb' user='postgres' password='whatever' schema='someschema' table=sometable where='ST_Intersects(rast, ST_SetSRID(ST_Point(-71.032,42.3793),4326) )' " C:\intersectregion.png

Für weitere Beispiele und Syntax siehe Reading Raster Data of PostGIS Raster section

10.8.

Gibt es Binärdateien von GDAL, die für die PostGIS Rasterunterstützung bereits kompiliert sind?

Ja. Siehe GDAL Binaries. Jene, die mit PostgreSQL-Unterstützung kompiliert sind, sollten PostGIS Raster implementiert haben.

PostGIS Raster ist vielen Änderungen unterworfen. Wenn Sie das letzte "nightly build" für Windows möchten, dann können Sie das "nigthly build" von Tamas Szekeres austesten, welches mit Visual Studio erstellt wurde und mit GDAL gebündelt ist. Weiters enthält es eine Python Anbindung, ausführbare MapServer Dateien und einen eingebauten Treiber für PostGIS Raster. Sie können einfach auf die SDK BAT-Datei klicken und die gewünschten Befehle von da aus ausführen. http://www.gisinternals.com. Auch als VS Projektdateien erhältlich.

Die neueste, stabile Version von FWTools für Windows ist mit Rasterunterstützung kompiliert.

10.9.

Welche Werkzeuge kann Ich benutzen, um Rasterdaten, die sich in PostGIS befinden, anzusehen?

Wenn Sie MapServer mit GDAL 1.7+ und den Rastertreibern für PostGIS kompiliert haben, können Sie diesen zur Visualisierung von Rasterdaten verwenden. QGIS unterstützt die Anzeige von PostGIS Rastern, falls Sie die PostGIS Rastertreiber installiert haben.

Theoretisch kann jedes Tool, das GDAL verwendet um Daten zu visualisieren, mit relativ wenig oder keinem Aufwand mit PostGIS Rasterdaten arbeiten. Wiederum sind für Windows die Binärdateien von Tamas http://www.gisinternals.com eine gute Wahl, wenn Sie nicht selbst die Mühe für das Setup und die Kompilierung aufbringen wollen.

10.10.

Wie kann Ich einen PostGIS-Raster zu meiner MapServer-Karte hinzufügen?

Zuerst benötigen Sie eine Installation von GDAL 1.7 oder höher mit PostGIS Rasterunterstützung. GDAL 1.8 oder höher ist bevorzugt, da eine Reihe von Problemen in 1.8 behoben wurden. Weitere Probleme mit PostGIS Raster wurden in der Version "trunk" behoben.

Sie können so wie mit jedem anderen Raster verfahren. Siehe MapServer Raster processing options für eine Auflistung der mannigfaltigen Bearbeitungsmöglichkeiten, die Sie mit Rasterlayer von MapServer haben.

PostGIS Rasterdaten sind insofern besonders interessant, da jede Kachel mehrere Standard-Datenbankattribute aufweisen kann und die Daten daher aufgeteilt werden können.

Unterhalb ein Beispiel, wie Sie einen PostGIS-Rasterlayer in MapServer anlegen können.

[Note]

Der Parameter, mode=2, wird für geteilte Raster benötigt und wurde in PostGIS 2.0.0

-- Einen Raster mit den Standardeinstellungen darstellen
LAYER
        NAME coolwktraster
        TYPE raster
        STATUS ON
        DATA "PG:host=localhost port=5432 dbname='somedb' user='someuser' password='whatever'
                schema='someschema' table='cooltable' mode='2'"
        PROCESSING "NODATA=0"
        PROCESSING "SCALE=AUTO"
        #... other standard raster processing functions here
        #... classes are optional but useful for 1 band data
        CLASS
                NAME "boring"
                EXPRESSION ([pixel] < 20)
                COLOR 250 250 250
        END
        CLASS
                NAME "mildly interesting"
                EXPRESSION ([pixel] > 20 AND [pixel] < 1000)
                COLOR 255 0 0
        END
        CLASS
                NAME "very interesting"
                EXPRESSION ([pixel] >= 1000)
                COLOR 0 255 0
        END
END
        
-- Einen Raster mit den Standardeinstellungen und einer WHERE-Klausel  darstellen
LAYER
        NAME soil_survey2009
        TYPE raster
        STATUS ON
        DATA "PG:host=localhost port=5432 dbname='somedb' user='someuser' password='whatever'
                schema='someschema' table='cooltable' where='survey_year=2009' mode='2'"
        PROCESSING "NODATA=0"
        #... other standard raster processing functions here
        #... classes are optional but useful for 1 band data
END
        

10.11.

Welche Funktionen kann Ich zurzeit mit meinen Rasterdaten nutzen?

Siehe Chapter 9, Referenz Raster. Es gibt noch mehr Funktionen, doch diese befinden sich noch in der Aufbauphase.

Siehe PostGIS Raster roadmap page für Details was in Zukunft geplant ist.

10.12.

Ich erhalte die Fehlermeldung "ERROR: function st_intersects(raster, unknown) is not unique or st_union(geometry,text) is not unique." Wie kann ich das beheben?

Der Fehler "function is not unique" tritt auf, wenn in einem Ihrer Argumente die Geometrie als Text und nicht als geometrischer Datentyp dargestellt wird. In diesem Fall wird die Textdarstellung von PostgreSQL als "unknown type" gekennzeichnet. Dadurch kann es als ST_Intersects(raster, geometry) oder als ST_Intersects(raster, raster) interpretiert werden, was zu einem uneindeutigen Fall führt, da beide Funktionen die Anfrage unterstützen könnten. Um dies zu vermeiden, müssen Sie die Textdarstellung der Geometrie in den geometrischen Datentyp umwandeln.

Wenn Ihr Code zum Beispiel folgendermaßen aussieht:

SELECT rast
 FROM my_raster
   WHERE ST_Intersects(rast, 'SRID=4326;POINT(-10 10)');

Wandeln Sie die Textdarstellung der Geometrie in einen geometrischen Datentyp um, indem Sie Ihren Code folgendermaßen ändern:

SELECT rast
 FROM my_raster
   WHERE ST_Intersects(rast, 'SRID=4326;POINT(-10 10)'::geometry);

10.13.

Wie unterscheidet sich PostGIS Raster von Oracle GeoRaster (SDO_GEORASTER) und SDO_RASTER-Typen?

Für eine ausführlichere Erörterung dieses Themas siehe Jorge Arévalo Oracle GeoRaster and PostGIS Raster: First impressions

Der wesentliche Vorteil von "one-georeference-by-raster" gegenüber "one-georeference-by-layer" ist:

* Coverages müssen nicht unbedingt rechteckig sein (was bei Rastercoverages, die sich über eingroßes Gebiet erstrecken, häufig der Fall ist. Schauen Sie sich dazu die Gestaltungsmöglichkeiten für Raster in der Dokumentation an)

* Raster können überlappen (dies ermöglicht die verlustfreie Konvertierung von Vektor nach Raster)

Diese Gestaltungsmöglichkeiten gibt es auch in Oracle, aber dort wird dadurch die Speicherung von mehreren SDO_GEORASTER Objekten impliziert, welche auf genausoviele SDO_RASTER Tabellen verweisen. Ein kompliziertes Coverage kann somit hunderte Tabellen in einer Oracle Datenbank bedingen. Mit PostGIS Raster können Sie den gleichen Raster in einer einzelnen Tabelle abspeichern.

Es scheint ein bisschen so, als ob PostGIS dazu zwingt nur vollständige rechteckige Vektorcoverages, ohne Aussparungen und Überlappungen (einen perfekten rechteckigen topologischen Layer), abzuspeichern. Dies mag bei manchen Anwendungen sehr praktikabel sein, die Praxis hat jedoch gezeigt, dass dies für die meisten Coverages weder realistisch noch erstrebenswert ist. Vektorstrukturen benötigen eine gewisse Flexibilität um auch unterbrochene und nicht rechteckige Coverages zu speichern. Wir glauben, dass auch Rasterstrukturen von diesem Vorteil profitieren sollten.

10.14.

raster2pgsql versagt beim Laden großer Dateien mit einer Fehlermeldung von "N bytes is too long for encoding conversion"?

"raster2pgsql" erzeugt die Importdatei ohne eine Verbindung zur Datenbank herzustellen. Wenn in Ihrer Datenbank für den Client eine andere Zeichenkodierung als für die Datenbank gesetzt ist, dann kann beim Laden großer Rasterdateien (von ungefähr 30 MB Dateigröße) die Fehlermeldung bytes is too long for encoding conversion auftreten.

Dies passiert üblicherweise, wenn die Datenbank z.B. in UTF8 vorliegt, aber die Zeichenkodierung für die Clients auf WIN1252 gesetzt ist, um Windows Applikationen zu unterstützen.

Um dieses Problem zu umgehen, können Sie während des Ladens sicherstellen, dass die Zeichenkodierung für den Client und für die Datenbank die gleiche ist. Sie können dies durch ein explizites Setzen der Zeichenkodierung in Ihrem Ladeskript erreichen. Zum Beispiel unter Windows:

set PGCLIENTENCODING=UTF8

Falls Sie sich auf Unix/Linux befinden

export PGCLIENTENCODING=UTF8

Mörderische Einzelheiten zu diesem Themadetails finden sich unter http://trac.osgeo.org/postgis/ticket/2209

10.15.

Ich erhalte die Fehlermeldung ERROR: RASTER_fromGDALRaster: Could not open bytea with GDAL. Check that the bytea is of a GDAL supported format. wenn ich ST_FromGDALRaster verwende, oder ERROR: rt_raster_to_gdal: Could not load the output GDAL driver wenn Ich ST_AsPNG oder andere Rastereingabefunktionen verwende.

Seit PostGIS 2.1.3 und 2.0.5 sind alle GDAL Treiber und out-db Raster aus Sicherheitsgründen standardmäßig deaktiviert. Die Release Notes sind unter PostGIS 2.0.6, 2.1.3 security release. Um bestimmte oder alle Treiber und out-db Unterstützung zu aktivieren, siehe Section 2.1, “Kurzfassung”.