PostGISでのラスター統計計算のパフォーマンス


9

PostgreSQL / PostGISを使用して、ベクターレイヤーの各ポリゴンのラスター統計(最小、最大、平均)を計算しようとしています。

このGIS.SEの回答は、ポリゴンとラスター間の交差を計算し、次に加重平均を計算することにより、これを行う方法を説明していますhttps : //gis.stackexchange.com/a/19858/12420

私は次のクエリを使用しています(demはラスター、topo_area_su_regionはベクターでtoid、一意のIDです:

SELECT toid, Min((gv).val) As MinElevation, Max((gv).val) As MaxElevation, Sum(ST_Area((gv).geom) * (gv).val) / Sum(ST_Area((gv).geom)) as MeanElevation FROM (SELECT toid, ST_Intersection(rast, geom) AS gv FROM topo_area_su_region,dem WHERE ST_Intersects(rast, geom)) foo GROUP BY toid ORDER BY toid;

これは機能しますが、遅すぎます。私のベクターレイヤーには2489kのフィーチャがあり、各フィーチャの処理には約90msかかります- レイヤー全体の処理には数日かかります。(ST_Areaへの呼び出しを回避する)最小値と最大値のみを計算する場合、計算速度は大幅に向上しないようです。

Python(GDAL、NumPy、PIL)を使用して同様の計算を行うと、(ST_Intersectionを使用して)ラスターをベクトル化する代わりに、ベクトルをラスター化する場合に、データの処理にかかる時間を大幅に削減できます。ここのコードを参照してください:https//gist.github.com/snorfalorpagus/7320167

私は本当に加重平均を必要としません-「それに触れるなら、それは入っている」アプローチで十分です-そしてこれが物事を遅くしているものであると合理的に確信しています。

質問:PostGISをこのように動作させる方法はありますか?つまり、正確な交差ではなく、ポリゴンが接触するラスターからすべてのセルの値を返します。

私はPostgreSQL / PostGISに非常に慣れていないので、私が正しく行っていないことが他にあるかもしれません。私はPostgreSQL 9.3.1とPostGIS 2.1をWindows 7(2.9GHz i7、8GB RAM)で実行しており、ここで提案されているようにデータベース構成を微調整しました:http : //postgis.net/workshops/postgis-intro/tuning.html

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


1
回答を編集しました。私の答えの交点はあまり正確ではないと言うのを忘れました。
Stefan

回答:


11

そうです、使用ST_Intersectionするとクエリが著しく遅くなります。

使用ST_Intersectionする代わりにST_Clip、ポリゴン(フィールド)でラスターをクリップ()し、結果をポリゴン(ST_DumpAsPolygons)としてダンプすることをお勧めします。したがって、すべてのラスターセルは、個別の値を持つ小さなポリゴンの長方形に変換されます。

ダンプから最小、最大、または平均を受け取るために、同じステートメントを使用できます。

このクエリは、トリックを実行する必要があります。

SELECT 
    toid,
    Min((gv).val) As MinElevation,
    Max((gv).val) As MaxElevation,
    Sum(ST_Area((gv).geom) * (gv).val) / Sum(ST_Area((gv).geom)) as MeanElevation
FROM (
    SELECT 
        toid,
        ST_DumpAsPolygons(ST_Clip(rast, 1, geom, true)) AS gv
    FROM topo_area_su_region,dem 
        WHERE ST_Intersects(rast, geom)) AS foo 
            GROUP BY toid 
            ORDER BY toid;

ステートメントST_Clipでは、ラスター、ラスターバンド(= 1)、ポリゴン、およびトリミングをTRUEにするかFALSEにするかを定義します。

さらにavg((gv).val)、平均値を計算するために使用できます。

編集

あなたのアプローチの結果はより正確ですが、遅いものです。組み合わせの結果ST_ClipST_DumpAsPolygonsそれらのサイズの50%未満(または51%)と交差しているラスタセルを無視しています。

CORINE Land Use交差点からのこれら2つのスクリーンショットは、違いを示しています。最初の絵ST_Intersection、と二番目ST_ClipST_DumpAsPolygons

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

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

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