首页 > 解决方案 > 如何使用具有不同来源和/或形状的多个 mgrid 计算值

问题描述

我正在尝试查看是否可以使用 numpy ndarrays 在 python 中使用 GIS 栅格算法。我正在计算多个定义区域 (x, y) 的概率值 (z),并希望随后将概率相加。网格重叠但在 x、y 中的尺寸不同。结果应该显示在网格重叠的地方添加的概率,并在不重叠的地方保持各个网格的概率值。

我已经计算出网格,但无法将它们加在一起。这可以在 numpy 中完成还是我需要使用 rasterio/GDAL 工具?mgrids 是最好的方法吗?

我创建了一些简单的 mgrids 来说明这个问题。

ys, xs = np.mgrid[5:15:5j, 0:5:5j]
f = lambda x, y: x * y + 1
vf = np.vectorize(f)
r = vf(xs, ys)
c1 = np.array([xs, ys, r])

ys2, xs2 = np.mgrid[4:9:6j, 1:6:6j]
f2 = lambda x, y: x + y * 2
vf2 = np.vectorize(f2)
r2 = vf2(xs2, ys2)
c2 = np.array([xs2, ys2, r2])

绘制它们:

plt.contourf(c1[0], c1[1], c1[2], levels = 100)
plt.colorbar()
plt.show()

c1 情节

plt.contourf(c2[0], c2[1], c2[2], levels = 100)
plt.colorbar()
plt.show()

c2 情节

标签: pythonnumpy-ndarray

解决方案


您的两个网格不是严格的超集-子集关系。下面是它们的样子:

以 2d 绘制的两个网格

如您所见,虽然两个网格的重叠,但实际的网格点是不相交的,只有一个网格点。

你将如何积累这些数据点?您拥有的数组存储每个网格点的概率z_i = z(x_i, y_i)。该函数是离散的,仅在网格上定义。您不能添加两个数据集,除非它们的网格点彼此对应。这样做没有任何意义。

可以做的是插入来自任一网格的数据并将其添加另一个网格(或第三个公共网格)。这并不准确,只有在您的数据足够平滑的情况下才能工作。此外,您的网格只有部分重叠,因此您必须弄清楚如何处理有多个点的区域与没有的区域。contourf还将接受 2d 格子的数据(即好像从 生成的mgrid)。因此,您最初的问题的答案是“您不能直接这样做”。


推荐阅读