rt_raster_to_gdal: Không thể tải trình điều khiển GDAL đầu ra
Đối với lỗi đầu tiên với ST_AsTIFF , bạn cần kích hoạt trình điều khiển GDAL, theo mặc định không được bật cho PostGIS 2.1. Xem hướng dẫn về cách để làm điều này. Chẳng hạn, tôi có một biến môi trường được thiết lập trên máy tính Windows với:
POSTGIS_GDAL_ENABLED_DRIVERS=GTiff PNG JPEG GIF XYZ DTED USGSDEM AAIGrid
có thể được xác nhận với PostGIS với:
SELECT short_name, long_name
FROM ST_GDALDrivers();
PostGIS để Numpy
Bạn có thể xuất đầu ra sang tệp GeoTIFF của bộ nhớ ảo để GDAL đọc thành mảng Numpy. Để biết gợi ý về các tệp ảo được sử dụng trong GDAL, hãy xem bài đăng trên blog này .
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
Hiển thị một điểm đệm rasterised.
[[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]]
Lưu ý rằng tôi đã sử dụng định dạng 'GTiff' trong ví dụ, nhưng các định dạng khác có thể phù hợp hơn. Ví dụ: nếu bạn có một raster lớn cần truyền qua kết nối internet chậm, hãy thử sử dụng 'PNG' để nén nó.