我如何根据已知的斜率和纵横比值生成二维数组?
How could I generate a 2D array from a known slope and aspect value?
给定一个存储为 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)的值填充它。
由于 gradient
假定步长为 1,因此用 N
点和给定的 slope
和 offset
制作直线的一般公式是
slope * np.arange(N) + offset
你所说的坡度是梯度的大小,以角度给出。你所说的 Aspect 是 x- 和 y-directions 中部分斜率的比率,也以角度给出。您有以下 non-linear 方程组:
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)
你的惯例可能有一个标志,你应该能够通过查看情节轻松修复。
给定一个存储为 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)的值填充它。
由于 gradient
假定步长为 1,因此用 N
点和给定的 slope
和 offset
制作直线的一般公式是
slope * np.arange(N) + offset
你所说的坡度是梯度的大小,以角度给出。你所说的 Aspect 是 x- 和 y-directions 中部分斜率的比率,也以角度给出。您有以下 non-linear 方程组:
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)
你的惯例可能有一个标志,你应该能够通过查看情节轻松修复。