*快速*从 rastio rasterize() ndarray 中提取像素值行

问题描述 投票:0回答:1

enter image description hereadded问题:给定 geopandas 文件中的一堆建筑物和行列表,计算不与任何建筑物相交的行数/总行数。我目前正在研究使用 rasterio rasterize() 来实现此目的。

在图像中,有 2 个工业区以红色和绿色显示,而可能阻挡视线的建筑物以蓝色显示。我们正在从红色区域周边的每一米到绿色区域周围的每一米绘制线条,并检查每条线是否具有视线(即该线不与建筑物相交)。每个城市被调查的“产业对”都超过10万个。

问题:是否有一种方法(如 rasterio.transform.rowcol()),如果给定 xs 列表和 ys(或行、列)列表,将返回构成栅格行的所有像素的值?

我从 geopandas 文件中选择了要素(建筑物),并使用 rasterio.features.rasterize() 创建了栅格。

  • 我可以使用 rasterio.transform.rowcol() 将沿线点的 (x,y) 坐标转换为 (row,col) 索引。
  • 然后我可以使用 [row][col] 从栅格 ndarray 中一次读取一个像素值。 [我认为这将是数十亿点的缓慢部分。]

我需要对数百万行执行此操作,因此我正在寻找一种快速方法来执行此操作。

注意:我见过这些类似的问题

使用形状文件掩码从多光谱 (B1-B6) 光栅图像中提取像素值 看起来每次调用都会返回一个原始栅格大小的 ndarray 。我尝试了类似的方法,但是对这些大型数组(3 GB 或更大)使用 np.any() 速度很慢。 (我只需要沿线的像素值。)

如何从给定线的栅格中提取值剖面? 从这个答案来看,似乎没有一个(快速)光栅方法可以在一次调用中获取沿线的像素值,而不必进行 1 个函数调用来读取每个像素值。这是正确的吗?

更新:

也许一个(熟的)具体例子会有所帮助。 当我使用 rastio.rasterize() 时,它返回一个 ndarray。假设它看起来像这样

>>> a
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
       [40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
       [50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
       [60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
       [70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
       [80, 81, 82, 83, 84, 85, 86, 87, 88, 89],
       [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]])

然后,如果我使用raterio rowcol()将xy点转换为rolcol位置,我会得到这样的东西

>>> rows
array([7, 8])
>>> cols
array([1, 2])

注意:行和列可能包含数千个值。

我希望有一种奇特的 numpy 切片/索引方法可以避免我编写这样的循环

v = numpy.empty([len(rows)], dtype='uint8')
>>> for i, r in enumerate(rows) :
...     v[i] = a[rows[i], cols[i]]
>>> v
array([71, 82], dtype=uint8)
numpy numpy-ndarray geopandas shapely rasterio
1个回答
0
投票

我希望有一种奇特的 numpy 切片/索引方法可以避免我编写这样的循环

您可以使用坐标数组对数组进行索引:

>>> a[rows, cols]
array([71, 82])

对于大量迭代,这通常比 Python 级循环快 100 倍。

© www.soinside.com 2019 - 2024. All rights reserved.