通过 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 访问表的栅格列的主要内容,如果未能解决你的问题,请参考以下文章