我有一个光栅文件(基本上是2D数组),接近一百万个点.我试图从栅格中提取圆圈(以及圆圈内的所有点).使用ArcGIS非常慢.任何人都可以建议任何易于学习和强大的图像处理库,以及这样的东西足够快?
谢谢!
解决方法:
有效地提取点子集取决于您使用的确切格式.假设您将栅格存储为numpy整数数组,您可以像这样提取点:
from numpy import *
def points_in_circle(circle, arr):
"A generator to return all points whose indices are within given circle."
i0,j0,r = circle
def intceil(x):
return int(ceil(x))
for i in xrange(intceil(i0-r),intceil(i0+r)):
ri = sqrt(r**2-(i-i0)**2)
for j in xrange(intceil(j0-ri),intceil(j0+ri)):
yield arr[i][j]
points_in_circle将创建一个返回所有点的生成器.请注意,我使用yield而不是return.此函数实际上不返回点值,但描述了如何查找所有这些值.它在圆内的点值上创建顺序迭代器.有关产量如何工作的详细信息,请参见Python documentation.
我使用的事实是,对于圆圈,我们只能在内部点上显式循环.对于更复杂的形状,您可以循环遍历形状范围的点,然后检查点是否属于它.诀窍不是检查每个点,只检查它们的一小部分.
现在举例说明如何使用points_in_circle:
# raster dimensions, 10 million points
N, M = 3200, 3200
# circle center and its radius in index space
i0, j0, r = 70, 20, 12.3
raster = fromfunction(lambda i,j: 100+10*i+j, (N, M), dtype=int)
print "raster is ready"
print raster
pts_iterator = points_in_circle((i0,j0,r), raster) # very quick, do not extract points yet
pts = array(list(pts_iterator)) # actually extract all points
print pts.size, "points extracted, sum = ", sum(pts)
在一千万个整数的光栅上它很快.
如果您需要更具体的答案,请描述文件格式或将样本放在某处.