python - 如何使用具有不同来源和/或形状的多个 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()
plt.contourf(c2[0], c2[1], c2[2], levels = 100)
plt.colorbar()
plt.show()
解决方案
您的两个网格不是严格的超集-子集关系。下面是它们的样子:
如您所见,虽然两个网格的域重叠,但实际的网格点是不相交的,只有一个网格点。
你将如何积累这些数据点?您拥有的数组存储每个网格点的概率z_i = z(x_i, y_i)
。该函数是离散的,仅在网格上定义。您不能添加两个数据集,除非它们的网格点彼此对应。这样做没有任何意义。
您可以做的是插入来自任一网格的数据并将其添加到另一个网格(或第三个公共网格)。这并不准确,只有在您的数据足够平滑的情况下才能工作。此外,您的网格只有部分重叠,因此您必须弄清楚如何处理有多个点的区域与没有的区域。contourf
还将接受 2d 格子的数据(即好像从 生成的mgrid
)。因此,您最初的问题的答案是“您不能直接这样做”。
推荐阅读
- ios - swift 5中没有孩子时Coredata删除父记录
- spring - Mule 注册表 [Mule 4] 中未定义元素“springService”
- javascript - 有没有办法使从 d3.csv 函数加载的数据全局化?
- laravel - 无法使用 Goutte Laravel 包抓取此站点。元素存在于视图源中
- email - MJML 在 Outlook 中无法正确输出
- excel - 过滤表以返回值
- android - 不兼容的类型 androidx 观察者方法
- javascript - JavaScript 倒数计时器从零开始计数
- json - JSON 到 CSV - 深入 4 级
- svg - 当您更改指针事件时,Svg texpath 在 Firefox 中消失