PostGISでラスターからポリゴンの平均値を計算していますか?


8

まず、同僚から提供された英国のNetCDF .griおよび.grdラスターファイルから始めました。私はそれをRでロンドンだけになるようにクリップし、エクスポートしてASCファイルに変換してから、Rで次のコマンドを使用してPostGISにインポートしました。

library(raster)
uk_raster <- raster("AnnMean2011.grd")
london_area <- extent(-720000.0,-630000.0,-50000.0,25000)
london_raster  <- crop(uk_raster, london_area)
writeRaster(london_raster, filename="AnnMean2011.asc", format="ascii")

そして、Ubuntuコマンドラインで:

raster2pgsql -I -C -s 10001 -t 20x20 AnnMean2011.asc annualmean | psql -d james_traffic

PostGISにラスターテーブルができました。ちなみに、10001のSRIDは次のとおりです。

INSERT INTO spatial_ref_sys(srid, auth_name, auth_srid, proj4text)
VALUES (10001,'CMAQ_Urban',10001,'+proj=lcc +a=6370000 +b=6370000 +lat_1=35 +lat_2=65 +lat_0=52 +lon_0=10 +x_0=000000 +y_0=00000');

同じデータベースに、ロンドンをカバーするポリゴンファイルSRID 27700があります。ラスターから各ポリゴン内の平均値を計算したいと思います。

私はこのようなことを試みていますが、それは正しくありません:

select polygons.postcode, avg(st_value(joined_data.rast))
    from (
       select (ST_Intersection(raster.rast, 1, polygons.geom)).*
    from raster, polygons 
       where ST_Intersects(raster.rast, 1, polygons.geom)
  ) joined_data
group by polygons.postcode

どうすればいいですか?

ポリゴンとラスターが正しく位置合わせされているようです。両方をWGS84に変換する必要があると思います。

ポリゴンを含むラスター、QGISで表示


かなり重複しますが、あなたの答えは、おそらくここにある:stackoverflow.com/questions/24083732/...
GIS-ジョナサン

うーん。GIS-Jonathanに感謝しますが、それをデータセット/状況に変換するのに苦労しています。私はこのようなことを試みていますが、それは正しくありません(上記の質問を含めて、それを含めるために)
TheRealJimShady '28

それでも解決策がない場合は、PostGISリストで質問することをお勧めします。
GIS-ジョナサン

1
これはあなたにとって興味深いものになると思います:gis.stackexchange.com/questions/76522/…。質問では1つの正確だが遅いクエリと、私の回答では速くて正確ではないクエリ。さらに詳しい情報はこちら:postgis.net/docs/RT_ST_SummaryStats.html(PostGIS Doc !!!)。文献:PostGISクックブック。パオロ・コルティら!!!
Stefan

回答:


6

昨日のステファンのコメントのおかげで、関連する質問と公式ドキュメントから何かをまとめて、さまざまな解決策を提供できると思います。

PostGISドキュメント(ST_SummaryStats

対象の建物と交差するピクセルを要約する

この例では、PostGIS Windows 64ビットで574ミリ秒かかり、ボストンのすべての建物と空中タイル(タイルはそれぞれ150x150ピクセル〜134,000タイル)、最大102,000の建物レコードがありました

WITH 
-- our features of interest
   feat AS (SELECT gid As building_id, geom_26986 As geom FROM buildings AS b 
    WHERE gid IN(100, 103,150)
   ),
-- clip band 2 of raster tiles to boundaries of builds
-- then get stats for these clipped regions
   b_stats AS
    (SELECT  building_id, (stats).*
FROM (SELECT building_id, ST_SummaryStats(ST_Clip(rast,2,geom)) As stats
    FROM aerials.boston
        INNER JOIN feat
    ON ST_Intersects(feat.geom,rast) 
 ) As foo
 )
-- finally summarize stats
SELECT building_id, SUM(count) As num_pixels
  , MIN(min) As min_pval
  , MAX(max) As max_pval
  , SUM(mean*count)/SUM(count) As avg_pval
    FROM b_stats
 WHERE count > 0
    GROUP BY building_id
    ORDER BY building_id;

 building_id | num_pixels | min_pval | max_pval |     avg_pval
-------------+------------+----------+----------+------------------
         100 |       1090 |        1 |      255 | 61.0697247706422
         103 |        655 |        7 |      182 | 70.5038167938931
         150 |        895 |        2 |      252 | 185.642458100559

ST_Intersectionパフォーマンスを回避する

これはあまり正確ではなく、交差するジオメトリの50%未満をカバーする交差するピクセルは無視されることに注意してください。

ステファンここで答えを避けていST_Intersectionます。

ノート

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