Tenho um raster para o qual quero alterar os valores para pixel-value per hectar, onde a área vem do tamanho do pixel. Então, se um pixel tem 10 ha e seu valor atual é 100 abitrary-units, agora será 10 abitrary-units/ha.
Exemplo raster:
r <- rast(nrows=18, ncols=36)
v <- 1:ncell(r)
v[200:400] <- NA
values(r) <- v
Esta função deve pegar o raster e multiplicar por 1/ha.
px2ha <- function(raster) {
raster * 10000/prod(res(raster))
}
Que tal usar cellSize assim?
r2/cellSize(r2, unit = 'ha')
Não recebo a mesma resposta.
r2 = project(x = r, y = 'epsg:2950') # Put raster in meters
plot((r2))
plot(px2ha(r2))
plot(r2/cellSize(r2, unit = 'ha'))
O cellSize poderia ser usado para obter o valor de pixel por área (hectar)?
A coisa correta a fazer é usar
terra::cellSize
. Se seus dados raster estiverem em lon/lat, você deve usar isso.Observe o intervalo de valores. O tamanho da célula varia. Isso também é verdade após a projeção. Os números não são os mesmos porque um raster muda fundamentalmente com a projeção (e é por isso que você geralmente quer evitar essa etapa).
A menos que você use
transform=FALSE
Que é o mesmo que (observe que sua fórmula para isso estava errada)
Mas usar esse número não é correto porque ele pressupõe que não há distorção. Esse número deve estar correto em torno das coordenadas (0,0), mas quanto mais você se afasta de lá, mais distorção você obtém.
cellSize
corrige isso transformando as células de volta para lon/lat antes de calcular as áreas.Neste exemplo, a distorção é enorme, mas isso é um pouco irreal. Isso ocorre porque uma projeção para uma parte do Canadá é aplicada ao mundo inteiro. Presumivelmente, seus dados reais estão apenas em Quebec e/ou East Ontario e lá a distorção seria menor.
Livros e aulas mais antigos podem sugerir que você deve projetar dados lon/lat para um sistema de referência de coordenadas planas para calcular a área, mas isso reflete as limitações do software que foi usado. Não é uma boa abordagem, na verdade, o oposto deve ser feito.