Как сделать запрос к сохраненным данным PostGIS Raster из IPython Notebook

Тестовые данные

Цель тройная:

  1. Загрузить растр в PostGIS используя raster2pgsql и визуализировать в QGIS
  2. В моем IPython Notebook подключитесь к PostGIS и загрузите растр в массив NumPy
  3. В моем 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)

Другие вопросы по тегам