http://i4.tietuku.com/84ea2afa5841517a.png
整个区域有40x40网格网络,我想提取紫色区域内的数据。换句话说,我想掩盖管理之外的数据 边界到np.nan。
我标记网格编号并将特定的数组数据选择为np.nan。
http://i4.tietuku.com/523df4783bea00e2.png
value[0,:] = np.nan
value[1,:] = np.nan
.
.
.
.
有人能告诉我一个更容易实现目标的方法吗?
找到答案here,它可以将栅格数据绘制成shapefile,但数据本身并没有改变。
我已经用一些答案启发了解决这个问题
对此目标感兴趣的人,请查看我提出的这两个帖子:
1. Testing point with in/out of a vector shapefile
2. How to use set clipped path for Basemap polygon
关键步骤是测试shapefile内/外的点,我已经将其转换为shapely.polygon。
答案 0 :(得分:3)
步骤1.栅格化shapefile
创建一个函数,可以确定坐标(x, y)
处的点是否在该区域中。有关如何将shapefile栅格化为与目标掩码具有相同尺寸的数组的详细信息,请参阅here
def point_is_in_mask(mask, point):
# this is just pseudocode
return mask.contains(point)
步骤2.创建面具
mask = np.zeros((height, width))
value = np.zeros((height, width))
for y in range(height):
for x in range(width):
if not point_is_in_mask(mask, (x, y)):
value[y][x] = np.nan
答案 1 :(得分:3)
最好使用matplotlib
:
def outline_to_mask(line, x, y):
"""Create mask from outline contour
Parameters
----------
line: array-like (N, 2)
x, y: 1-D grid coordinates (input for meshgrid)
Returns
-------
mask : 2-D boolean array (True inside)
"""
import matplotlib.path as mplp
mpath = mplp.Path(line)
X, Y = np.meshgrid(x, y)
points = np.array((X.flatten(), Y.flatten())).T
mask = mpath.contains_points(points).reshape(X.shape)
return mask
或者,您可以使用上面答案中建议的shapely
包含方法。您可以通过递归地细分空间来加速计算,如此要点所示(但matplotlib解决方案在我的测试中快了1.5倍):
https://gist.github.com/perrette/a78f99b76aed54b6babf3597e0b331f8