import os
import ee
import geemap
import geemap.colormaps as cm
Amplitude altitudinal
Importando pacotes e inicializando geemap
geemap.ee_initialize()
Cálculo da amplitude altitudinal
A amplitude altitudinal foi calculada como a diferença entre a altitude máxima e mínima dentro da vizinhaça da célula focal. Como essa métrica é correlacionada com a variedade de formas de relevo, nós calculamos o resíduos de uma regressão (Ordinary Least Squares) entre as duas váriaveis (Anderson et al. 2016). Assim, a amplitude altitudinal residual é independente da variedade de formas de relevo. Isso permite a identificação de locais que tenham maior variabilidade microclimática que aquela proporcionada pela variedade de formas de relevo, quando calcularmos o índice de diversidade da paisagem.
Base de dados
Utilizamos o Modelo Digital de Elevação (DEM) do Merit-DEM (Yamazaki et al. 2017), na escala de 90 metros. O Merit-DEM é um produto global que combina dados dos satélites do Shuttle Radar Topography Mission (SRTM) (Farr et al. 2007) e Advanced Land Observing Satellite (ALOS) (Tadono, T. et al. 2014), permitindo a replicabilidade da metodologia em outras regiões. Além disso, o Merit-DEM corrige viéses de Modelo Digitais de Elevação gerados por imagens de satétite como speckle noise, stripe noise, absolute bias e tree height bias (Yamazaki et al. 2017). A correção de tree height bias é especialmente importante para a Floresta Amazônica devido à sua densidade de árvores altas.
A variedade de formas de relevo foi calculada anteriormente (veja o capítulo Variedade de formas de relevo) e está disponível como um asset em https://code.earthengine.google.com/?asset=projects/ee-lucasljardim9/assets/landform_variety.
As análises foram rodadas no Google Earth Engine (Gorelick et al. 2017), devido à demanda computacional do projeto, usando o pacote geemap (Wu 2020) em Python (Python Software Foundation 2023) como interface pela facilidade na documentação e reprodutividade das análises. O JupyterNotebook para a reprodução das análises pode ser encontrado em https://github.com/Resiliencia-climatica-Brasil/diversity-resilience-python/blob/master/jupyternotebook/2_elevation_range.ipynb.
Códigos para o cálculo da amplitude altitudinal residual
Primeiro, importamos um vetor dos biomas do Brasil para extrairmos as coordenadas mínimas e máximas do Brasil.
# Importando mapa de biomas do IBGE para extrair as coordenadas mínimas e máximas do Brasil
= ee.FeatureCollection("projects/ee-lucasljardim9/assets/Biome")
regiao
def func_cmp(feature):
return feature.bounds()
# Extraindo as coordenadas mínimas e máximas do Brasil
= regiao.map(func_cmp).geometry().dissolve(**{'maxError': 1}).bounds() regiao_box
Importamos os rasters do modelo digital de elevação e da variedade de formas de relevo e definimos a resolução da análise como aquela do modelo digital de elevação.
# Importando o modelo digital de elevação
= ee.Image("MERIT/DEM/v1_0_3")
DEM
# Importando a variedade de landforms calculada anteriormente
# modifique o endereço para o do seu projeto
= ee.Image("projects/ee-lucasljardim9/assets/landform_variety")
landform_variety
#Escala dos rasters ~92 metros
= DEM.projection().nominalScale() escala
Extraímos do raster as células dentro da vizinhança (kernel circular com 5 células de raio, ~450 metros) da célula focal e salvamos como bandas de uma imagem. Assim, cada banda é um stack das células da vizinhança da célula focal, a primeira banda possui todas as primeiras células de cada célula focal, a segunda banda todas as segunda células, e assim por diante.
# Tamanho do raio do kernel para o calculo da amplitude altitudinal
= 5
radius_pixels
# Criando rasters da vizinhança de cada célula como bandas da imagem
= DEM.neighborhoodToBands(ee.Kernel.circle(ee.Number(radius_pixels))) neighbor
O raster neighbor criado acima possui as células da vizinhança como bandas. Assim, as primeiras células de cada banda são as células da vizinhança da primeira célula focal, organizadas como colunas (bandas). Ao calcularmos os valores máximos e mínimos para cada coluna de neighbor, estamos calculando os valores máximos e mínimos da vizinhança de cada célula focal.
# Calcule o máximo da vizinhança
= neighbor.reduce(ee.Reducer.max())
elevation_max
# Calcule o mínimo da vizinhança
= neighbor.reduce(ee.Reducer.min()) elevation_min
Subtraindo os valores máximos e mínimos de cada célula focal e calculando o seu valor absoluto, temos a amplitude altitudinal para cada célula focal. Nós salvamos a amplitude altitudinal e variedade de formas de relevo como um raster com duas bandas, sendo a primeira banda a variável preditora da regressão e a segunda banda a variável resposta.
# Calcule a amplitude da vizinhança
= elevation_max.subtract(elevation_min).abs()
elevation_range
# Crie uma imagem com as bandas de varidedade de formas de relevo e amplitude altitudinal
# A primeira imagem é o x da regressão e a segunda é o y
= (ee.Image.cat(landform_variety, elevation_range)
elevation 'landform_variety', 'elevation_range'])) .rename([
Dessa forma, aplicamos a regressão entre as variáveis.
# Rode uma regressão linear (OLS) entre varidade formas de relevo e amplitude altitudinal
= elevation.reduceRegion(**{
regression 'reducer': ee.Reducer.linearFit(),
'geometry': regiao_box,
'maxPixels': 1e13,
'scale': escala
})
Após a regressão, multiplicamos a variável preditora pelo coeficiente de regressão (slope) e adicionamos o valor do intercepto para predizermos os valores de amplitude altitudinal esperados pela regressão. Em seguida, subtraímos os valores de amplitude altitudinal pelos valores preditos pela regressão para calcularmos os resíduos do modelo.
# Calcule o valor predito, pela regressão, de amplitude altitudinal, sem intercepto
= elevation.select('landform_variety').multiply(ee.Number(regression.get('scale')))
pred
# Adicione o intercepto na predição
= pred.add(ee.Number(regression.get('offset')))
predict
# Calcule o residuo da regressão
= elevation.select('elevation_range').subtract(predict).rename(['residuals']) residuals
Por fim, exportamos o raster de amplitude altitudinal residual como um asset do Google Earth Engine.
# Exporte a amplitude altitudinal residual como asset
# modifique o assetId para o do seu projeto
= "projects/ee-lucasljardim9/assets/elevation_range_residual"
assetId
geemap.ee_export_image_to_asset(
residuals, ='elevation_range_residual',
description=assetId,
assetId=regiao_box,
region=escala,
scale=1e13
maxPixels )
O dado criado pode ser visualizado abaixo:
# Paleta de cores
= cm.get_palette('terrain', n_class=10)
palette
# Centralize o mapa
= geemap.Map(center=(-11.75, -51.52), zoom=4)
Map
# Importe o asset
= ee.Image("projects/ee-lucasljardim9/assets/elevation_range_residual")
elevation_range
# Plote o mapa
'palette':palette, 'min':0, 'max': 479})
Map.addLayer(elevation_range, {
Map