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.