PostGISを使用してラスタとポリゴンを交差させる-アーティファクトエラー


15

PostGIS2.0を使用して、ラスター/ポリゴンの交差を行います。どの操作を使用する必要があるのか​​、これを実行する最も速い方法は何かを理解するのが困難です。私の問題は次のとおりです。

  • ポリゴンとラスターがあります
  • ポリゴン内にあるすべてのピクセルを見つけて、ピクセル値の合計を取得したい
  • (更新された問題):クエリを実行すると、元のラスターに存在しないいくつかのピクセルの大きな値を取得しています

ST_Intersects()またはを使用する必要があるかどうかがわかりませんST_Intersection()。また、ピクセルを合計するための最良のアプローチが何であるかわかりません。これが私が試した最初のアプローチです(#1):

SELECT 
    r.rast 
FROM
    raster as r, 
    polygon as p
WHERE
    ST_Intersects(r.rast, p.geom)

これはrast値のリストを返しますが、これをどうすればいいのかわかりません。を使用して要約統計を計算しようとしましたST_SummaryStats()が、これがポリゴン内にあるすべてのピクセルの加重和であるかどうかはわかりません。

SELECT  
        (result).count,
        (result).sum    
FROM (  
         SELECT 
            ST_SummaryStats(r.rast) As result
         FROM
            raster As r, 
            polygon As p
         WHERE
            ST_Intersects(r.rast, p.geom)    
    ) As tmp

私が試した他のアプローチ(#2)はST_Intersection()次を使用します:

 SELECT
        (gv).geom,         
        (gv).val
 FROM 
 (
    SELECT 
        ST_Intersection(r.rast, p.geom) AS gv
    FROM 
        raster as r, 
        polygon as p           
    WHERE 
        ST_Intersects(r.rast, p.geom)

      ) as foo;

これにより、さらに分析するジオメトリのリストが返されますが、これは効率が悪いと思われます。

どちらが最も速い操作順序なのかもわかりません。ポリゴンを常に選択するraster, polygonpolygon, raster、ポリゴンをラスターに変換する必要がありraster, rasterますか?

編集:R.K.のリンクからのいくつかの詳細でアプローチ#2を更新しました。

アプローチ#2を使用して、出力に次のエラーがあることに気付きました。これは、出力を理解できなかった理由の一部です。元のラスターの画像と、そのラスターを交差させるために使用されているポリゴンのアウトラインが上に重ねられています。

ここに画像の説明を入力してください

そして、これがPostGISを使用した交差の結果です。

ここに画像の説明を入力してください

結果の問題は、元のラスタにはない21474836の値が返されることです。なぜこれが起こっているのか分かりません。どこか小さい数字に関連していると思われます(ほぼ0で除算)が、間違った結果を返します。


ポイント2に関して、ポリゴンと交差するピクセルの値の合計を取得しますか?
RK

はい、私はST_SummaryStats()#1に使用しましたが、#2にそれを行う方法がわかりません。
djq

参照へのリンクを投稿しました。それがお役に立てば幸いです。
RK

2
マップの縮尺の最大値は、32ビットの符号付き整数の最大値です。あなたの場合、それが何を意味するのかわかりませんが、NA値と関係があるかもしれません。クエリの範囲には、適切に処理されないnull値が含まれる場合があります。en.wikipedia.org/wiki/2147483647#2147483647_in_computing
yellowcap

6
FWIW、21474836は、32ビット符号付き整数の最大値ではありません。ただし、2 ^ 31-1 = 2147483647 最大であり、21474836 = 2147483647/100(整数除算)であることに注意してください。これは、内部的にいくつかのNAが生成され(おそらく境界セルに沿って)、それらが2 ^ 31-1として表されることを示唆します。
whuber

回答:


6

PostGIS WKT Rasterを使用して、大きなラスターカバレッジ交差するベクターポリゴンに関するチュートリアルを見つけました。あなたが探している答えがあるかもしれません。

チュートリアルでは、2つのデータセットを使用しました。1つはポリゴンを生成するためにバッファリングされたポイントシェイプファイル、13のSRTM標高ラスターのシリーズです。間に多くのステップがありましたが、ラスターとベクターの交差に使用されるクエリは次のようになりました。

 CREATE TABLE caribou_srtm_inter AS
 SELECT id, 
        (gv).geom AS the_geom, 
        (gv).val
 FROM (SELECT id, 
              ST_Intersection(rast, the_geom) AS gv
       FROM srtm_tiled,
            cariboupoint_buffers_wgs
       WHERE ST_Intersects(rast, the_geom)
      ) foo;

次に、以下を使用して値を要約しました。

 CREATE TABLE result01 AS
 SELECT id, 
        sum(ST_Area(ST_Transform(the_geom, 32198)) * val) / 
        sum(ST_Area(ST_Transform(the_geom, 32198))) AS meanelev
 FROM caribou_srtm_inter
 GROUP BY id
 ORDER BY id;

私はこれを説明するのに十分なPostGISを本当に知りませんが、あなたが達成しようとしていたことのように聞こえます。このチュートリアルでは、中間ステップについて説明します。幸運を :)


@RKに感謝します。私はそのチュートリアルを読みました。私の計算はもっと基本的なものだと思いますが、まだこの基本的なステップを考えています!
djq

2

元の質問のポイント2に関して、postgis 2.0開発リリースのいくつかは、floatをintにキャストするGDALライブラリのバージョンを使用しました。ラスタに浮動小数点値が含まれており、1.9.0よりも低いバージョンのGDAL、またはGDALFPolygonize()を適切に呼び出さないPostGIS 2.0プレリリースのバージョンを使用している場合、このバグが発生している可能性があります。PostGISおよびGDALバグトラッカーのチケットが提出され、クローズされました。このバグは、元の質問の時点でアクティブでした。

パフォーマンスに関しては、を使用するST_Intersects(raster, geom)よりもを使用する方がはるかに高速であることがわかりますST_Intersects(geom, raster)。最初のバージョンは、ジオメトリをラスタライズし、ラスタ空間の交差を行います。2番目のバージョンは、ジオメトリをベクトル化し、ベクトル空間の交差を行います。これは、はるかに高価なプロセスになる可能性があります。


0

また、を使用ST_SummaryStatsして奇妙な問題を抱えていましたST_Clip。データをST_SummaryStats照会すると、ラスターの最小値は32で、最大300でしたが、ターゲットポリゴンのピクセル値に対して-32700が返されていました。

私は問題を次のようにハックすることになりました:

WITH first AS (
   SELECT id, (ST_Intersection(geom, rast)).val
   FROM raster_table
   INNER JOIN vector_table ON ST_Intersects(rast, geom)
)
SELECT id, COUNT(val), SUM(val), AVG(val), stddev(val), MIN(val), MAX(val)
FROM first
GROUP BY id
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.