rt_raster_to_gdal: Impossibile caricare il driver GDAL di output
Per quanto riguarda il primo errore con ST_AsTIFF , è necessario abilitare i driver GDAL, che per impostazione predefinita non sono abilitati per PostGIS 2.1. Vedere il manuale sui modi per fare questo. Ad esempio, ho una variabile di ambiente impostata su un computer Windows con:
POSTGIS_GDAL_ENABLED_DRIVERS=GTiff PNG JPEG GIF XYZ DTED USGSDEM AAIGrid
che può essere confermato con PostGIS con:
SELECT short_name, long_name
FROM ST_GDALDrivers();
PostGIS a Numpy
È possibile esportare l'output in un file GeoTIFF di memoria virtuale affinché GDAL possa leggere in un array Numpy. Per suggerimenti sui file virtuali utilizzati in GDAL, vedere questo post del blog .
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
Mostra un punto bufferizzato rasterizzato.
[[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]]
Si noti che ho usato un formato "GTiff" nell'esempio, ma altri formati potrebbero essere più adatti. Ad esempio, se si dispone di un raster di grandi dimensioni che deve essere trasferito attraverso una connessione Internet lenta, provare a utilizzare "PNG" per comprimerlo.