rt_raster_to_gdal: Der GDAL-Ausgangstreiber konnte nicht geladen werden
Wie für den ersten Fehler mit ST_AsTIFF müssen Sie Ihre GDAL-Treiber aktivieren, die standardmäßig nicht für PostGIS 2.1 aktiviert sind. Informationen dazu finden Sie im Handbuch . Zum Beispiel habe ich eine Umgebungsvariable auf einem Windows-Computer eingerichtet mit:
POSTGIS_GDAL_ENABLED_DRIVERS=GTiff PNG JPEG GIF XYZ DTED USGSDEM AAIGrid
was mit PostGIS bestätigt werden kann mit:
SELECT short_name, long_name
FROM ST_GDALDrivers();
PostGIS nach Numpy
Sie können die Ausgabe in eine GeoTIFF-Datei des virtuellen Speichers exportieren, damit GDAL sie in ein Numpy-Array einliest. Hinweise zu in GDAL verwendeten virtuellen Dateien finden Sie in diesem Blogbeitrag .
import os
import psycopg2
from osgeo import gdal
# Adjust this to connect to a PostGIS database
conn = psycopg2.connect(...)
curs = conn.cursor()
# Make a dummy table with raster data
curs.execute("""\
SELECT ST_AsRaster(ST_Buffer(ST_Point(1, 5), 10), 10, 10, '8BUI', 1) AS rast
INTO TEMP mytable;
""")
# Use a virtual memory file, which is named like this
vsipath = '/vsimem/from_postgis'
# Download raster data into Python as GeoTIFF, and make a virtual file for GDAL
curs.execute("SELECT ST_AsGDALRaster(rast, 'GTiff') FROM mytable;")
gdal.FileFromMemBuffer(vsipath, bytes(curs.fetchone()[0]))
# Read first band of raster with GDAL
ds = gdal.Open(vsipath)
band = ds.GetRasterBand(1)
arr = band.ReadAsArray()
# Close and clean up virtual memory file
ds = band = None
gdal.Unlink(vsipath)
print(arr) # this is a 2D numpy array
Zeigt einen gerasterten gepufferten Punkt an.
[[0 0 0 1 1 1 1 0 0 0]
[0 1 1 1 1 1 1 1 1 0]
[0 1 1 1 1 1 1 1 1 0]
[1 1 1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1 1 1]
[0 1 1 1 1 1 1 1 1 0]
[0 1 1 1 1 1 1 1 1 0]
[0 0 0 1 1 1 1 0 0 0]]
Beachten Sie, dass ich in diesem Beispiel ein GTiff-Format verwendet habe, andere Formate jedoch möglicherweise besser geeignet sind. Wenn Sie beispielsweise ein großes Raster haben, das über eine langsame Internetverbindung übertragen werden muss, versuchen Sie, es mit 'PNG' zu komprimieren.
Ich denke die Frage war, ob man aus postgis Rastertabellen OHNE gdal Treiber lesen kann. Wie alles in Python können Sie!
Stellen Sie sicher, dass Sie Ihr Raster-Ergebnis als WKBinary auswählen:
wähle St_AsBinary (rast) ...
Verwenden Sie das folgende Skript, um WKBinary in ein Python-Image-Format zu entschlüsseln. Ich bevorzuge opencv, weil es eine beliebige Anzahl von Bildbändern verarbeitet, aber man kann PIL / low verwenden, wenn 1 oder 3 Bänder üblicher sind.
Im Moment beschäftige ich mich nur mit Byte-Bildern, aber es ist relativ trivial, sie auf andere Datentypen zu erweitern.
Hoffe das ist nützlich.
quelle