python – 从栅格中提取形状内的点

我有一个光栅文件(基本上是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)

在一千万个整数的光栅上它很快.

如果您需要更具体的答案,请描述文件格式或将样本放在某处.

上一篇:php – 检查文件是否包含栅格或矢量元素? (pdf,eps,ai)


下一篇:云安全公司Lacework D 轮融资13亿美元