rt_raster_to_gdal: Tidak dapat memuat driver GDAL keluaran
Adapun kesalahan pertama dengan ST_AsTIFF , Anda harus mengaktifkan driver GDAL Anda, yang secara default tidak diaktifkan untuk PostGIS 2.1. Lihat manual tentang cara melakukan ini. Sebagai contoh, saya memiliki variabel lingkungan yang diatur di komputer Windows dengan:
POSTGIS_GDAL_ENABLED_DRIVERS=GTiff PNG JPEG GIF XYZ DTED USGSDEM AAIGrid
yang dapat dikonfirmasi dengan PostGIS dengan:
SELECT short_name, long_name
FROM ST_GDALDrivers();
PostGIS ke Numpy
Anda dapat mengekspor output ke file GeoTIFF memori virtual untuk GDAL untuk dibaca ke array Numpy. Untuk petunjuk tentang file virtual yang digunakan dalam GDAL, lihat posting blog ini .
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
Menunjukkan titik buffer yang dirasterisasi.
[[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]]
Perhatikan bahwa saya menggunakan format 'GTiff' dalam contoh, tetapi format lain mungkin lebih cocok. Misalnya, jika Anda memiliki raster besar yang perlu ditransfer melalui koneksi internet yang lambat, coba gunakan 'PNG' untuk mengompresnya.