PostGISラスター合計(マップ代数)


14

特定の日の旅行時間の等時線を表すポリゴンのテーブルがあります。各原点には、5つのアイソクロネジオメトリがあります(別々の行に格納されます)。各原点について、5つのアイソクロナス(バイナリNULLまたは1)をラスタライズし、それらを1つのラスタレイヤーに結合します。このラスターレイヤーには単純なマップ代数sum / 5が必要です。そのため、各原点は、最終的に[NULL、0.2、0.4、0.6、0.8、1]の値を持つ単一のラスターレイヤーに関連付けられます。構成レイヤーはオーバーラップします。それは確率曲面です。

私のデータはすべてPostgres 9.3(PostGISを使用)に保存されます。私の問題は、PostGISラスタの使用方法を学びたいが、非常に急な学習曲線を持っているように思え、すべての例が単一のラスタレイヤに対処できることです。例では、このレイヤーはポリゴンオーバーレイの一部として使用され、各ポリゴンのラスターの値を平均化しています。以下を組み合わせた複製可能な例は見つかりませんでした。a)ベクトル->ラスターb)マップ代数。およびc)最初の段落ごとのGROUP BY属性。

このタスクを実行するために必要な場合、GDALまたはGRASSを使用しても問題ありませんが、これはPostGISが処理できるもののようです。入力データがすでにPostGISジオメトリである場合、そうするのが便利です。そして、私は本当に PostGISラスターに同意したいと思っています。

サンプルデータ構造:

areaid    time        date          isogeom (polygon)
1000      07:15:00    2014-05-05    xxx
1000      07:15:00    2014-05-06    xxy
...
1006      07:15:00    2014-05-05    zzz

ラスタライズし、areaidでグループ化し、マップ代数演算を実行して次のことを行います。

areaid    isorast (raster)
1000      aaa
1006      bbb

私はこれをPostGISに含めることに成功していません。私のアプローチは、ベクターをラスターに変換し、ラスターを配列にダンプし、psycopg2を介してnumpy配列との組み合わせを実行してから、GeoTIFFに書き込む(PostGISに戻す)ことです。理想的ではありませんが、実行可能です。


1
いい質問です。ポストギスのラスター感覚を学ぶために本当に必要なことを共有し、あなたが望むものが可能だと確信しています。残念ながら今日は忙しくて外出できません。
ジョンパウエル14

1
このBostonGISブログには、地図代数に関するかなり筋金入りの記事があります。このブログの著者は、Postgisの多くのラスター機能を備えた優れた本であるPostgis in Actionの著者でもあります。申し訳ありませんが、より直接的な例は思いつきませんでした。
ジョンパウエル14

回答:


3

独自の集計関数を作成する必要があります。

CREATE OR REPLACE function sum_raster_state(raster, raster)
returns raster
language sql
as $f$

SELECT
CASE $1
WHEN NULL THEN
      $2
ELSE
    ST_MapAlgebra(
        $1, 
        $2, 
        '([rast1] + [rast2])', 
        NULL, 
        'UNION', 
        '[rast2]', 
        '[rast1]', 
        NULL)
END;
$f$;

CREATE OR REPLACE FUNCTION sum_raster_final(raster)
returns raster
language sql
as $f$
SELECT 
   $1
$f$;

create aggregate sum_raster(raster) (
    SFUNC = sum_raster_state,
    STYPE = raster,
    FINALFUNC = sum_raster_final
);

その後、このように呼び出すことができます

SELECT areaid, sum_raster(st_asraster(isogeom, ...)) FROM isochrone GROUP BY areaid

これにより、同じエリアIDを持つすべてのラスタの合計が得られます。それでも、各エリアIDの観測値の数でラスタ値を分割する必要があります。(集計関数には含めませんでした。ここで行うことも、後でMapAlegbraを使用して行うこともできます)

入力ラスターがすべて揃っていることを確認してください。そうしないと機能しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.