Eu tenho encontrado todos os tipos de problemas usando o ArcGIS ZonalStats e achei que o R poderia ser uma ótima maneira. Dizendo que sou bastante novo no R, mas tenho um histórico de codificação.
A situação é que eu tenho vários rasters e um shapefile de polígono com muitos recursos de tamanhos diferentes (embora todos os recursos sejam maiores que uma célula raster e os recursos do polígono estejam alinhados ao raster). Eu descobri como obter o valor médio para cada recurso de polígono usando a biblioteca raster com extração:
#load packages required
require(rgdal)
require(sp)
require(raster)
# ---Set the working directory-------
datdir <- "/test_data/"
#Read in grid of water depth
ras <- raster("test_data/raster/pl_sm_rp1000/w001001.adf")
#read in polygon shape file
proxNA <- shapefile("test_data/proxy/PL_proxy_WD_NA_test")
#calc mean depth per polygon feature
#unweighted - only assigns grid to district if centroid is in that district
proxNA$RP1000 <- extract(ras, proxNA, fun = mean, na.rm = TRUE, weights = FALSE)
#plot depth values
spplot(proxNA[,'RP1000'])
O problema que tenho é que também preciso de uma proporção baseada em área entre a área do polígono e todas as células não NA no mesmo polígono. Sei qual é o tamanho da célula da varredura e posso obter a área para cada polígono, mas o link ausente é a contagem de todas as células não NA em cada recurso. Consegui obter o número de células de todas as células no polígono proxNA@data$Cnumb1000 <- cellFromPolygon(ras, proxNA)
e tenho certeza de que existe uma maneira de obter o valor real da célula de varredura, que exige um loop para obter o número de todas as células não NA combinadas com uma contagem, etc. MAS, tenho certeza que existe uma maneira muito melhor e mais rápida de fazer isso! Se algum de vocês tiver uma idéia ou puder me apontar na direção certa, ficaria muito grato!
ras
segurando sinalizadores de NA usando um valor legítimo? Parece que você pode filtrar esse valor ou obter uma contagem desses valores após o fato.Respostas:
Os dados de exemplo de Jeffrey
Agora use extrato
Se você tiver muitos rasters, primeiro use a pilha para combiná-los (se eles tiverem a mesma extensão e resolução)
Para obter a área real do polígono, você não deve usar a abordagem de slot (i, 'área'). Para dados planares, você pode usar rgeos :: gArea (polys, byid = TRUE) Para dados esféricos (lon / lat), você pode usar geosphere :: areaPolygon
fonte
Não tenho certeza se você deseja a proporção com base no "valor real" das áreas de polígono (s) ou nas áreas das células que as interceptam. Aqui está um exemplo de código que usa todas as células que interceptam os polígonos (basicamente, proporção de células NA para células não NA). É um exemplo fictício e você precisará escrever sua própria função.
Você pode usar esse trecho de código para adicionar uma coluna de área aos dados do polígono, extraindo do slot de área. Isso pode ser usado se você deseja propor uma proporção usando a área de polígono "real".
A alternativa mais eficiente e consideravelmente mais rápida aos loops for "aplicar" como funções. Há vários disponíveis no R que são utilizados para diferentes classes de objetos ou estruturas de dados. Nesse caso, como extract retorna uma lista, usaremos lapply (lista aplicável). Essa é uma maneira de aplicar uma função básica ou personalizada a um objeto de lista. A classe de objeto armazenada na lista é um vetor, a função é bastante direta. Se você usar extração em um objeto de varredura de tijolo ou pilha, os objetos resultantes armazenados na lista seriam objetos data.frame.
fonte
Não tenho acesso aos seus arquivos, mas com base no que você descreveu, isso deve funcionar:
fonte