2017-01-21 5 views
0

私は、同じ空間参照を持ついくつかのラスタを持つPostGISにテーブルを持っていますが、ティファは異なる日付から来ています。今私は行間の変化を検出するために "rast"列にアクセスしようとしています。私の目的は、2行目から1行目のピクセル値を減算し、次に3行目のピクセル値からピクセル値を減算することです。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 

これは表にはです

各行は、「TIFF」形式の1つのラスタイメージを表しています。データのインポート後にpostgresqlで作成されました。列「rast」にはピクセル値が含まれています。私の目的は、隣接する行の間の差異を計算することです...ラグウィンドウ関数のように同じですが、ラスタ列型では機能しません...

唯一のことは、2つの間のdiffrenceラスタ画像。そのためには、各行ごとに別のテーブルを作成する必要がありました。

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

をそして私はこのような両方のテーブルの上に簡単なMapAlgebra操作をした:Uは、以下のそれを見ることができます

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

が、これは2つのラスタの間だけdiffrenceあり、かつMapAlgebra操作用のIラスターイメージごとに余分なテーブルを作成する必要がありました。しかし、40個のラスターイメージが1つのテーブルにあり、テーブル間の隣接するすべての行の変化を検出したいと考えています。

+0

このようなものをお探しですか?http://stackoverflow.com/questions/41682882/find-diff-between-2-numbers-in-different-rows? –

+0

はい、私はそれを解決できませんでした...列 "rast"のピクセル値をループし、各行間のdiffrenceを計算する方法はありますか? – santa

+0

@IljaEveiläあなたの次のリンクhttp://stackoverflow.com/questions/24691462/postgresql-calculate-difference-betweenrowsは良いヒントでしたが、私の場合、私は "rast"型で作業しています。だからこそ、なぜ私はエラーメッセージを受け取るのですか... – santa

答えて

0

lag()ウィンドウ関数は、古い列と同様にラスター列でも機能します。現在のオフセットの前の行の値をウィンドウ枠内のある量だけ選択するだけです。

あなたはもちろん、PostgreSQL演算子を使ってラスタを減算することはできません。少なくとも、オーバーロードはしないでください。

lag()は、パーティションに前に現在行の行の行を選択するので、あなたがST_MapAlgebra

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

引数として遅れラスタを渡す必要ridによって順序付け隣接ラスタ間の差を計算するためにridで降順で並べ替えられます。 2が1などの前に来る場合もあります。ウィンドウ枠がデフォルトでconsists only of rows that come before the current rowであるため、lead()と現在の行に続く行を選択するframe節よりも簡単です。

免責事項

私は、ラスタを使用していませんでした、あなたは微調整にあなたの特定のニーズに合わせて、クエリを有することができます。

+0

私はあなたの例を試してみましたが、私は次のエラーメッセージが表示されます - >エラー:窓関数の遅れは余分な節を必要とします。 – santa

+0

申し訳ありませんが、どこに属しているかを忘れてしまいました( 'lag()'呼び出しで)。 –

+0

thaaaaanks it worked !!!!!!! Uは最高です: - ) – santa

関連する問題