2017-01-21 89 views
0

我在PostGIS中有一個表格,其中有幾個柵格,它們具有相同的空間參考,但tiff來自不同的日期。現在我試圖訪問列「rast」來檢測行之間的變化。我的目標是從第二行減去第一行的像素值,然後從第三行的像素值減去像素值,依此類推。通過psycopg2訪問表格的柵格列

如何遍歷行並從下一行中減去每行的像素值?

[此處輸入圖像的描述] [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」包含像素值。我的目的是計算相鄰行之間的差異...像滯後窗函數一樣,但它不適用於柵格列類型...

唯一的,我修正的是計算兩個之間的差異光柵圖像。爲此,我必須爲每一行創建一個單獨的表格。 U可以在下面看到它:

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個光柵圖像,我想檢測我的表格之間所有相鄰行的變化。

+0

可能你正在尋找這樣的東西:http://stackoverflow.com/questions/41682882/find-diff-between-2-numbers-in-different-rows? –

+0

是的,它可能是,但我無法解決它...是否有一種方法來循環列「像素」列中的像素值,並計算每行之間的差異? – santa

+0

@IjajaEveilä您的以下鏈接http://stackoverflow.com/questions/24691462/postgresql-calculate-difference-between-rows是一個很好的提示,但在我的情況下,我正在使用「rast」列類型。所以這就是爲什麼我得到一個錯誤信息的原因... – santa

回答

0

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之前等。另外,因爲窗口框架默認consists only of rows that come before the current row,這比使用lead()和一個框架子句更容易選擇當前的行。

免責聲明

我沒有用柵格和您可能需要微調,以滿足您的特定需求的查詢。

+0

我試過你的例子,但我得到以下錯誤消息 - >錯誤:窗口功能滯後需要over子句。 – santa

+0

對不起,忘了把over子句放在它所屬的地方(用'lag()'調用)。 –

+0

thaaaaanks它的工作!!!!!!! U是最好的: - ) – santa