Sombreamento de Relevo Topográfico com Matplotlib

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Este laboratório demonstra como usar o Matplotlib para criar gráficos de sombreamento topográfico (hillshading) usando diferentes modos de mistura (blend modes) e exagero vertical. O objetivo do sombreamento (hillshading) é, para fins visuais, criar um efeito 3D em mapas 2D. Neste laboratório, aprenderemos como alterar os modos de mistura (blend modes) e o exagero vertical para obter diferentes efeitos visuais.

Dicas para a VM

Após a inicialização da VM, clique no canto superior esquerdo para mudar para a aba Notebook e acessar o Jupyter Notebook para praticar.

Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido às limitações do Jupyter Notebook.

Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão, e resolveremos o problema prontamente para você.

Importar as Bibliotecas Necessárias

Começamos importando as bibliotecas necessárias, incluindo Matplotlib, NumPy e LightSource.

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.cbook import get_sample_data
from matplotlib.colors import LightSource

Carregar os Dados

Em seguida, carregamos os dados de elevação de amostra usando a função get_sample_data do Matplotlib. Em seguida, extraímos os dados de elevação e o tamanho da célula da grade.

dem = get_sample_data('jacksboro_fault_dem.npz')
z = dem['elevation']
dx, dy = dem['dx'], dem['dy']

Especificar o Tamanho da Célula

Se você precisar de uma exageração vertical topograficamente precisa, ou não quiser adivinhar qual deve ser o vert_exag, você precisará especificar o tamanho da célula da grade (ou seja, os parâmetros dx e dy). Caso contrário, qualquer valor de vert_exag que você especificar será relativo ao espaçamento da grade dos seus dados de entrada. Nesta etapa, calculamos os valores de dx e dy em metros.

dy = 111200 * dy
dx = 111200 * dx * np.cos(np.radians(dem['ymin']))

Especificar a Fonte de Luz e o Mapa de Cores

Especificamos o objeto LightSource definindo o azimute e a altitude da fonte de luz. Também definimos o mapa de cores a ser usado no gráfico.

ls = LightSource(azdeg=315, altdeg=45)
cmap = plt.cm.gist_earth

Criar o Gráfico

Criamos uma grade de gráfico 4x3 para mostrar os gráficos com sombreamento (hillshaded) com diferentes modos de mistura (blend modes) e exagero vertical. Primeiro, mostramos a imagem de intensidade do sombreamento na primeira linha e, em seguida, colocamos gráficos com sombreamento com diferentes modos de mistura no restante das linhas. Usamos um loop for para iterar pelos diferentes valores de exagero vertical e modos de mistura.

fig, axs = plt.subplots(nrows=4, ncols=3, figsize=(8, 9))
plt.setp(axs.flat, xticks=[], yticks=[])

for col, ve in zip(axs.T, [0.1, 1, 10]):
    col[0].imshow(ls.hillshade(z, vert_exag=ve, dx=dx, dy=dy), cmap='gray')
    for ax, mode in zip(col[1:], ['hsv', 'overlay', 'soft']):
        rgb = ls.shade(z, cmap=cmap, blend_mode=mode,
                       vert_exag=ve, dx=dx, dy=dy)
        ax.imshow(rgb)

Rotular o Gráfico

Rotulamos as linhas e colunas da grade do gráfico usando as funções set_title e set_ylabel. Também adicionamos um título para os grupos de exagero vertical e modo de mistura.

for ax, ve in zip(axs[0], [0.1, 1, 10]):
    ax.set_title(f'{ve}', size=18)
for ax, mode in zip(axs[:, 0], ['Hillshade', 'hsv', 'overlay', 'soft']):
    ax.set_ylabel(mode, size=18)

axs[0, 1].annotate('Vertical Exaggeration', (0.5, 1), xytext=(0, 30),
                   textcoords='offset points', xycoords='axes fraction',
                   ha='center', va='bottom', size=20)
axs[2, 0].annotate('Blend Mode', (0, 0.5), xytext=(-30, 0),
                   textcoords='offset points', xycoords='axes fraction',
                   ha='right', va='center', size=20, rotation=90)
fig.subplots_adjust(bottom=0.05, right=0.95)

Exibir o Gráfico

Finalmente, exibimos o gráfico usando a função show.

plt.show()

Resumo

Neste laboratório, aprendemos como criar gráficos de sombreamento de relevo topográfico usando Matplotlib. Usamos diferentes modos de mistura (blend modes) e exagero vertical para obter diferentes efeitos visuais. Também aprendemos como especificar o tamanho da célula da grade para um exagero vertical topograficamente preciso.