Topografische Höhenschattierung mit Matplotlib

PythonPythonBeginner
Jetzt üben

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

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab wird gezeigt, wie man Matplotlib verwendet, um Relief-Hillshading-Darstellungen mit unterschiedlichen Mischmodi und vertikaler Vergrößerung zu erstellen. Das Ziel von Hillshading ist es, aus visuellen Gründen einen 3D-ähnlichen Effekt auf 2D-Karten zu erzeugen. In diesem Lab werden wir lernen, wie man die Mischmodi und die vertikale Vergrößerung ändert, um verschiedene visuelle Effekte zu erzielen.

Tipps für die VM

Nachdem der Start der VM abgeschlossen ist, klicken Sie in der linken oberen Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.

Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund der Einschränkungen von Jupyter Notebook nicht automatisiert werden.

Wenn Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback ab, und wir werden das Problem für Sie prompt beheben.

Importieren der erforderlichen Bibliotheken

Wir beginnen mit dem Importieren der erforderlichen Bibliotheken, einschließlich Matplotlib, NumPy und LightSource.

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

Laden der Daten

Als nächstes laden wir die Beispielhöhendaten mit der Funktion get_sample_data aus Matplotlib. Anschließend extrahieren wir die Höheninformationen und die Zellengröße des Gitters.

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

Festlegen der Zellengröße

Wenn Sie eine topografisch genaue vertikale Vergrößerung benötigen oder nicht raten möchten, was der Wert von vert_exag sein sollte, müssen Sie die Zellengröße des Gitters angeben (d.h. die Parameter dx und dy). Andernfalls wird jeder von Ihnen angegebene vert_exag-Wert relativ zum Gitterschrittweite Ihrer Eingabedaten sein. In diesem Schritt berechnen wir die dx- und dy-Werte in Metern.

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

Festlegen der Lichtquelle und der Farbskala

Wir legen das LightSource-Objekt fest, indem wir die Azimut- und Höhenwinkel der Lichtquelle festlegen. Wir legen auch die Farbskala fest, die im Diagramm verwendet werden soll.

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

Erstellen des Diagramms

Wir erstellen ein 4x3-Diagrammnetz, um die hügelnischen Darstellungen mit verschiedenen Mischmodi und vertikalen Vergrößerungen anzuzeigen. Wir zeigen in der ersten Zeile zunächst das hügelnische Intensitätsbild und platzieren dann in den verbleibenden Zeilen hügelnische Darstellungen mit verschiedenen Mischmodi. Wir verwenden eine for-Schleife, um durch die verschiedenen vertikalen Vergrößerungswerte und Mischmodi zu iterieren.

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)

Bezeichnen des Diagramms

Wir bezeichnen die Zeilen und Spalten des Diagrammnetzes mit den Funktionen set_title und set_ylabel. Wir fügen auch einen Titel für die Gruppen der vertikalen Vergrößerung und des Mischmodus hinzu.

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)

Anzeigen des Diagramms

Schließlich zeigen wir das Diagramm mit der show-Funktion an.

plt.show()

Zusammenfassung

In diesem Lab haben wir gelernt, wie man mit Matplotlib hügelnische Höhenschattierungen erstellt. Wir haben verschiedene Mischmodi und vertikale Vergrößerungen verwendet, um unterschiedliche visuelle Effekte zu erzielen. Wir haben auch gelernt, wie man die Zellengröße des Gitters für eine topografisch genaue vertikale Vergrößerung angeben kann.