通过 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()
和选择行的框架子句更容易跟随潮流。
免责声明
我没有使用过栅格,您可能需要微调查询以满足您的特定需求。
我在 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()
和选择行的框架子句更容易跟随潮流。
免责声明
我没有使用过栅格,您可能需要微调查询以满足您的特定需求。