Amplitude altitudinal

Importando pacotes e inicializando geemap

import os
import ee
import geemap
import geemap.colormaps as cm
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
regiao = ee.FeatureCollection("projects/ee-lucasljardim9/assets/Biome")

def func_cmp(feature):
    return feature.bounds() 

# Extraindo as coordenadas mínimas e máximas do Brasil
regiao_box = regiao.map(func_cmp).geometry().dissolve(**{'maxError': 1}).bounds()

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
DEM = ee.Image("MERIT/DEM/v1_0_3")

# Importando a variedade de landforms calculada anteriormente
# modifique o endereço para o do seu projeto
landform_variety = ee.Image("projects/ee-lucasljardim9/assets/landform_variety")

#Escala dos rasters ~92 metros
escala = DEM.projection().nominalScale()

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
radius_pixels = 5

# Criando rasters da vizinhança de cada célula como bandas da imagem
neighbor = DEM.neighborhoodToBands(ee.Kernel.circle(ee.Number(radius_pixels)))

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
elevation_max = neighbor.reduce(ee.Reducer.max())

# Calcule o mínimo da vizinhança
elevation_min = neighbor.reduce(ee.Reducer.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_range = elevation_max.subtract(elevation_min).abs()

# 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

elevation = (ee.Image.cat(landform_variety, elevation_range)
            .rename(['landform_variety', 'elevation_range']))

Dessa forma, aplicamos a regressão entre as variáveis.

# Rode uma regressão linear (OLS) entre varidade formas de relevo e amplitude altitudinal
regression = elevation.reduceRegion(**{
     '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 
pred = elevation.select('landform_variety').multiply(ee.Number(regression.get('scale')))

# Adicione o intercepto na predição
predict = pred.add(ee.Number(regression.get('offset')))

# Calcule o residuo da regressão
residuals = elevation.select('elevation_range').subtract(predict).rename(['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
assetId = "projects/ee-lucasljardim9/assets/elevation_range_residual"

geemap.ee_export_image_to_asset(
    residuals, 
    description='elevation_range_residual', 
    assetId=assetId, 
    region=regiao_box, 
    scale=escala, 
    maxPixels=1e13
)

O dado criado pode ser visualizado abaixo:

# Paleta de cores

palette = cm.get_palette('terrain', n_class=10)

# Centralize o mapa

Map = geemap.Map(center=(-11.75, -51.52), zoom=4)

# Importe o asset

elevation_range = ee.Image("projects/ee-lucasljardim9/assets/elevation_range_residual")

# Plote o mapa

Map.addLayer(elevation_range, {'palette':palette, 'min':0, 'max': 479}) 


Map

Referências

Anderson, M. G., Barnett, Analie, M. Clark, A. O. Sheldon, e Prince, John. 2016. Resilient Sites for Terrestrial Conservation in Eastern North America. Página 186. The Nature Conservancy, Eastern Conservation Science.
Farr, T. G., P. A. Rosen, E. Caro, R. Crippen, R. Duren, S. Hensley, M. Kobrick, M. Paller, E. Rodriguez, L. Roth, D. Seal, S. Shaffer, J. Shimada, J. Umland, M. Werner, M. Oskin, D. Burbank, e D. Alsdorf. 2007. The Shuttle Radar Topography Mission. Reviews of Geophysics 45.
Gorelick, N., M. Hancher, M. Dixon, S. Ilyushchenko, D. Thau, e R. Moore. 2017. Google Earth Engine: Planetary-scale geospatial analysis for everyone. Remote Sensing of Environment.
Python Software Foundation. 2023. Python Language Reference.
Tadono, T., Ishida, H., Oda, F., Naito, S., Minakawa, K., e Iwamoto, H. 2014. Precise Global DEM Generation by ALOS PRISM. Precise Global DEM Generation by ALOS PRISM. ISPRS Annals of the Photogrammetry, Remote Sensing and Spatial Information Sciences II:71–76.
Wu, Q. 2020. geemap: A Python package for interactive mapping with Google Earth Engine. Journal of Open Source Software 5(), ,:2305.
Yamazaki, D., D. Ikeshima, R. Tawatari, T. Yamaguchi, F. O’Loughlin, J. C. Neal, C. C. Sampson, S. Kanae, e P. D. Bates. 2017. A high-accuracy map of global terrain elevations: Accurate Global Terrain Elevation map. Geophysical Research Letters 44:5844–5853.