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