Топографические тенни холмов с использованием Matplotlib

Beginner

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

Введение

В этом практическом занятии показано, как использовать Matplotlib для создания топографических карт с теневым освещением с использованием различных режимов смешивания и вертикального увеличения. Цель создания карт с теневым освещением - создать трехмерное впечатление на двухмерных картах для визуализации. В этом практическом занятии мы научимся настраивать режимы смешивания и вертикальное увеличение, чтобы добиться различных визуальных эффектов.

Советы по использованию ВМ

После запуска виртуальной машины щелкните в левом верхнем углу, чтобы переключиться на вкладку Notebook и приступить к практике в Jupyter Notebook.

Иногда может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы столкнетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Импортируем необходимые библиотеки

Начнем с импорта необходимых библиотек, включая Matplotlib, NumPy и LightSource.

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

Загружаем данные

Далее мы загружаем примерные данные о высоте с использованием функции get_sample_data из Matplotlib. Затем извлекаем данные о высоте и размер ячейки сетки.

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

Указываем размер ячейки

Если вам нужна топографически точная вертикальная эксцентриситет, или вы не хотите гадать, какое значение vert_exag должно быть, вам нужно указать размер ячейки сетки (то есть параметры dx и dy). В противном случае любое значение vert_exag, которое вы укажете, будет относительным к интервалу сетки ваших входных данных. В этом шаге мы вычисляем значения dx и dy в метрах.

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

Указываем источник света и цветовую карту

Мы задаем объект LightSource, устанавливая азимут и высоту источника света. Также задаем цветовую карту, которая будет использоваться в графике.

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

Создаем график

Мы создаем сетку графиков размером 4x3, чтобы показать карты с тенями холмов с разными режимами смешивания и вертикальной эксцентриситетом. Сначала показываем изображение интенсивности теней холмов в первой строке, а затем в остальных строках размещаем карты с тенями холмов с разными режимами смешивания. Мы используем цикл for для перебора различных значений вертикальной эксцентриситета и режимов смешивания.

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)

Пишем подписи к графику

Мы подписываем строки и столбцы сетки графиков с использованием функций set_title и set_ylabel. Также добавляем заголовок для групп вертикальной эксцентриситета и режима смешивания.

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)

Отображаем график

Наконец, мы отображаем график с использованием функции show.

plt.show()

Резюме

В этом практическом занятии мы научились создавать карты с тенями холмов топографических объектов с использованием Matplotlib. Мы использовали различные режимы смешивания и вертикальную эксцентриситет, чтобы добиться различных визуальных эффектов. Мы также узнали, как указать размер ячейки сетки для вертикальной эксцентриситета с учетом топографии.