Calculando o valor médio do polígono da varredura no PostGIS?

8

Comecei com um arquivo raster do NetCDF .gri e .grd do Reino Unido, fornecido por um colega. Eu o recortei no R para ser apenas Londres, exportado e convertido em um arquivo ASC e depois o importei para o PostGIS usando os seguintes comandos no R:

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")

E então na linha de comando do Ubuntu:

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

Agora tenho uma tabela raster no PostGIS. O SRID de 10001 é o seguinte a propósito, novamente, fornecido por um colega:

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');

No mesmo banco de dados, tenho um arquivo de polígono, SRID 27700, que cobre Londres. Gostaria de calcular o valor médio dentro de cada polígono, a partir da varredura.

Estou tentando algo assim, mas não está certo:

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

Como eu faria isso por favor?

Parece que o polígono e a varredura estão alinhados corretamente. Preciso convertê-los para o WGS84, eu acho.

Rasterização com polígonos, visualizada no QGIS

TheRealJimShady
fonte
Nota bastante uma duplicata, mas sua resposta é provavelmente aqui: stackoverflow.com/questions/24083732/...
GIS-Jonathan
Hummm. Obrigado GIS-Jonathan, mas estou lutando para traduzir isso no meu conjunto de dados / situação. Eu estou tentando algo assim, mas não é certo (pergunta editado acima para incluí-lo)
TheRealJimShady
Se você ainda não tem uma solução, pode valer a pena perguntar na lista PostGIS.
GIS-Jonathan
1
Acho que isso pode ser interessante para você: gis.stackexchange.com/questions/76522/… . Uma consulta exata mas lenta na pergunta e uma consulta rápida e menos exata na minha resposta. Mais informações também aqui: postgis.net/docs/RT_ST_SummaryStats.html (PostGIS Doc !!!). Literatura: Livro de receitas PostGIS. Paolo Corti et al. !!!
9285 Stefan

Respostas:

6

Graças ao comentário de Stefan ontem, acho que posso juntar algo de perguntas relacionadas e da documentação oficial e oferecer uma variedade de soluções.

Documentação PostGIS ( ST_SummaryStats)

Resuma pixels que cruzam edifícios de interesse

Este exemplo levou 574ms nas janelas PostGIS de 64 bits com todos os edifícios de Boston e telhas aéreas (blocos cada um com 150x150 pixels ~ 134.000 blocos), ~ 102.000 registros de construção

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

Evitando ST_Intersectiondesempenho

Observe que isso é menos exato, com pixels de interseção que cobrem menos de 50% de uma geometria de interseção sendo ignorados.

Stefan tem uma resposta aqui que evita o ST_Intersection.

Notas

  • Você também pode encontrar algumas dicas úteis nesta pergunta e no tutorial raster do PostGIS WKT .
  • Se a sua varredura for lado a lado, uma boa regra é usar blocos menores, tentando aumentá-los um pouco mais do que um recurso de vetor típico que você está cruzando.
alphabetasoup
fonte