通过 psycopg2 访问表的栅格列

Posted

技术标签:

【中文标题】通过 psycopg2 访问表的栅格列【英文标题】:Accessing raster column of a table via psycopg2 【发布时间】:2017-01-21 18:38:24 【问题描述】:

我在 PostGIS 中有一个包含多个栅格的表,这些栅格具有相同的空间参考,但 tiff 来自不同的日期。现在我正在尝试访问“rast”列来检测行之间的变化。我的目标是从第二行的像素值中减去第一行的像素值,然后从第三行的像素值中减去,依此类推。

如何遍历行并从下一行中减去每一行的像素值?

[在此处输入图片描述][1]

#!/usr/bin/python
# -*- coding: utf-8 -*-

import psycopg2
import sys

conn = None

conn = psycopg2.connect(database="postgres", user="postgres",host="localhost", password="password")
cur = conn.cursor()

cur.execute('SELECT * from my_table')

while True:

   row = cur.fetchone()

   if row == None:
     break

   rast_col = row[1]

我通过以下命令导入了几个空间区域相同但日期不同的栅格:

C:\Program Files\PostgreSQL\9.6\bin>raster2pgsql -s 4326 -F -I "C:\User\Desktop\Data\*.tif" public.all_data|psql -U User -h localhost -p 5432

这是在postgresql中导入数据后创建的表[1]:https://i.stack.imgur.com/uBHX3.jpg

每一行代表一个“TIFF”格式的光栅图像。 “rast”列包含像素值。我的目标是计算相邻行之间的差异...与滞后窗口函数相同,但它不适用于栅格列类型...

我唯一解决的问题是计算两个光栅图像之间的差异。为此,我必须为每一行创建一个单独的表。你可以在下面看到它:

CREATE TABLE table1 AS SELECT * FROM my_tabke WHERE rid=1;
CREATE TABLE table2 AS SELECT * FROM my_table WHERE rid=2;

然后我对两个表都做了一个简单的 MapAlgebra 操作,如下所示:

SELECT ST_MapAlgebra(t1.rast,t2.rast, '([rast1]-[rast2])') AS rast INTO diffrence FROM table1 t1, table2 t2;

但这只是两个光栅之间的差异,对于 MapAlgebra 操作,我必须为每个光栅图像创建额外的表。但是我在一张表中有更多的 40 个光栅图像,我想检测我的表之间所有相邻行的变化。

【问题讨论】:

您可能正在寻找这样的东西:***.com/questions/41682882/… 吗? 是的,它可能是,但我无法解决它......有没有办法循环“rast”列中的像素值并计算每行之间的差异? @Ilja Eveilä 您的以下链接***.com/questions/24691462/… 是一个很好的提示,但就我而言,我正在使用“rast”列类型。所以这就是为什么我收到错误消息的原因...... 对我来说ST_MapAlgebra 听起来它可能会帮助您寻求两个栅格之间的差异。不能多说,因为尽管我对 PostGIS 有点熟悉,但我从来不用使用栅格。 顺便说一句,如果您包含表格定义以及“按...排序的栅格”等方式,它会帮助您获得很好的答案。 【参考方案1】:

lag() 窗口函数应该在光栅列上工作,就像在任何旧列上一样。它只是从窗口框架中当前偏移量之前的一行中选择值。

您当然不能只使用 Postgresql 运算符减去栅格 - 至少不重载。

为了计算由rid 排序的相邻栅格之间的差异,您应该将滞后栅格作为参数传递给ST_MapAlgebra

SELECT ST_MapAlgebra(rast, lag(rast) OVER (ORDER BY rid DESC),
                     '[rast1] - [rast2]')
FROM my_table;

由于lag()选择了分区中之前当前行的行,所以行按rid降序排列; 2 在 1 之前,以此类推。另外,因为 window frame 默认为 consists only of rows that come before the current row,这比使用 lead() 和选择当前行之后的行的 frame 子句更容易。

免责声明

我没有使用过栅格,您可能需要微调查询以满足您的特定需求。

【讨论】:

我尝试了你的例子,但我收到了以下错误消息 --> 错误:windows function lag requires over 子句。 抱歉,忘记将 over 子句放在它所属的位置(使用 lag() 调用)。

以上是关于通过 psycopg2 访问表的栅格列的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 psycopg2 从亚马逊红移读取列类型

psycopg2 连接问题,无法选择列,但连接正常

psycopg2连接问题,无法选择列,但连接正常

python 得到 postgres 查询结果 可以有列名

psycopg2.ProgrammingError:列 cons.consrc 不存在

SQLAlchemy、Psycopg2 和 Postgresql 复制