給定一個存盤為 Numpy 陣列的虛擬高度圖(或數字高程模型),如下所示:
import numpy as np
import matplotlib.pyplot as plt
line = np.flip(np.arange(0, 10))
dem = np.tile(line, (10, 1))
我可以像這樣計算它的斜率和方面:
x, y = np.gradient(dem)
slope = np.degrees(np.arctan(np.sqrt(x**2 y**2)))
aspect = np.degrees(np.arctan2(x, -y))
并將其可視化:
fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")
y, x = np.mgrid[:10, :10]
ax.scatter(x, y, dem)
ax.set_title(f"Slope={np.mean(slope)}, Aspect={np.mean(aspect)}")

但我怎么會走另一條路呢?
我想生成一個固定大小的空白 2D Numpy 陣列,然后用遵循已知斜率和方面的值填充它(從任意高程開始,例如 0)。
uj5u.com熱心網友回復:
由于gradient假設步長為 1,所以用N點和給定的slope和制作一條線的一般公式offset是
slope * np.arange(N) offset
你所說的斜率是梯度的大小,以角度給出。您所說的 Aspect 是 x 和 y 方向上的部分斜率的比率,也以角度給出。您有以下非線性方程組:
np.tan(np.radians(slope))**2 = sx**2 sy**2
np.tan(np.radians(aspect)) = -sx / sy
幸運的是,您可以使用替換很容易地解決這個問題:
p = np.tan(np.radians(slope))**2
q = np.tan(np.radians(aspect))
sy = np.sqrt(p / (q**2 1))
sx = -q * sy
現在你需要做的就是取兩條帶斜率和的線的外sx和sy:
dem = offset sx * np.arange(NX)[::-1, None] sy * np.arange(NY)
這是一個例子:
輸入:
aspect = -30
slope = 45
offset = 1
NX = 12
NY = 15
坡度:
p = np.tan(np.radians(slope))**2
q = np.tan(np.radians(aspect))
sy = np.sqrt(p / (q**2 1)) # np.sqrt(3) / 2
sx = -q * sy # 0.5
結果:
dem = offset sx * np.arange(NX)[::-1, None] sy * np.arange(NY)
fig, ax = plt.subplots(subplot_kw={'projection': '3d'})
ax = fig.add_subplot(111, projection="3d")
ax.scatter(*np.mgrid[:NX, :NY], dem)

您的約定可能有一個標志,您應該可以通過查看情節輕松解決。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/457253.html
