Как сделать запрос к сохраненным данным PostGIS Raster из IPython Notebook
Тестовые данные
- 1 TIF-файл (159 КБ)
Цель тройная:
- Загрузить растр в PostGIS используя
raster2pgsql
и визуализировать в QGIS - В моем IPython Notebook подключитесь к PostGIS и загрузите растр в массив NumPy
- В моем IPyhton Notebook используйте Pandas для загрузки временных рядов одного пикселя растров с разным шагом по времени, хранящихся в PostGIS
Процесс пока что мне удалось получить одно растровое изображение в PostGIS Raster, используя raster2pgsql
введите команду и визуализируйте ее в QGIS с помощью менеджера БД:
raster2pgsql -s 4326 -d -I -C -M -R -l 4 D:\Downloads\raster//modis.tif -F -t 100x100 public.ndvi | psql -U postgres -d rastertest -h localhost -p 5432
Но как получить доступ / запросить этот растр из IPython Notebook?
Я нашел эту презентацию, которая посвящена SQLALchemy и GeoAlchemy2. И там, где упоминается, что он поддерживает PostGIS Raster, а также. Вроде бы очень интересно! Но, используя документацию, я не вижу, как я могу применить это к растровым данным.
Я думаю, что могу установить соединение с моей базой данных PostGIS, используя следующий код, где postgres=user
, password=admin
а также database=rastertest
:
from sqlalchemy import create_engine
engine = create_engine('postgresql://postgres:admin@localhost/rastertest', echo=True)
Но тогда.. любой совет очень ценится.
1 ответ
Вы должны использовать модуль psycopg для подключения к postgres db из python. Некоторые примеры кода:
import psycopg2
def connect_db():
try:
conn = psycopg2.connect("dbname='rastertest' user='admin' host='localhost' password='password'")
conn.set_session(autocommit=True) #if you want your updates to take effect without being in a transaction and requiring a commit, for a beginner, I would set this to True
return conn
except:
print "I am unable to connect to the database"
return None
def get_raster(raster_id,conn):
query= "SELECT ST_AsText(geom) from raster_table where id={}".format(raster_id)
conn.cursor().execute(query)
res = cur.fetchall()
return res[0][0]
Возможно, вы можете использовать текстовое представление растра. В качестве альтернативы, посмотрите здесь http://postgis.net/docs/RT_reference.html чтобы увидеть, возвращает ли какая-либо из функций то, что вы хотите для вашего массива numpy, и соответственно замените запрос в get_raster. (Возможно это http://postgis.net/docs/RT_ST_DumpValues.html)