通过 psycopg2 访问 table 的栅格列

Accessing raster column of a table via psycopg2

我在 PostGIS 中有一个 table,其中包含多个栅格,它们具有相同的空间参考,但 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.6\bin>raster2pgsql -s 4326 -F -I "C:\User\Desktop\Data\*.tif" public.all_data|psql -U User -h localhost -p 5432

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

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

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

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

然后我在两个 table 上做了一个简单的 MapAlgebra 运算,如下所示:

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

但这只是两个栅格之间的差异,对于 MapAlgebra 操作,我必须为每个栅格图像创建额外的 tables。但是我在一个 table 中有更多的 40 个光栅图像,我想检测 table.

之间所有相邻行的变化

lag() window 函数应该像在任何旧列上一样在栅格列上工作。它只是从 window 帧中当前偏移量之前的一行中选择值。

您当然不能只使用 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 框架 consists only of rows that come before the current row,这比使用 lead() 和选择行的框架子句更容易跟随潮流。

免责声明

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