从栅格中提取形状内的点
我有一个包含接近一百万个点的光栅文件(基本上是二维数组)。我试图从栅格中提取一个圆(以及圆内的所有点)。使用 ArcGIS 的速度非常慢。任何人都可以推荐任何既易于学习又强大且足够快的图像处理库来完成这样的事情吗?
谢谢!
I have a raster file (basically 2D array) with close to a million points. I am trying to extract a circle from the raster (and all the points that lie within the circle). Using ArcGIS is exceedingly slow for this. Can anyone suggest any image processing library that is both easy to learn and powerful and quick enough for something like this?
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
有效提取点子集取决于您使用的确切格式。假设您将栅格存储为整数的 numpy 数组,您可以像这样提取点:
points_in_circle
将创建一个返回所有点的生成器。请注意,我使用了yield
而不是return
。该函数实际上并不返回点值,而是描述如何找到所有点值。它在圆内点的值上创建一个顺序迭代器。有关yield
工作原理的更多详细信息,请参阅 Python 文档 。我利用了这样一个事实:对于圆,我们只能显式地循环内部点。对于更复杂的形状,您可以循环遍历形状范围内的点,然后检查某个点是否属于该形状。诀窍是不要检查每个点,而只检查其中的一小部分。
现在是如何使用
points_in_circle
的示例:在包含 1000 万个整数的栅格上,速度非常快。
如果您需要更具体的答案,请描述文件格式或将示例放在某处。
Extracting a subset of points efficiently depends on the exact format you are using. Assuming you store your raster as a numpy array of integers, you can extract points like this:
points_in_circle
will create a generator returning all points. Please note that I usedyield
instead ofreturn
. This function does not actually return point values, but describes how to find all of them. It creates a sequential iterator over values of points within circle. See Python documentation for more details howyield
works.I used the fact that for circle we can explicitly loop only over inner points. For more complex shapes you may loop over the points of the extent of a shape, and then check if a point belongs to it. The trick is not to check every point, only a narrow subset of them.
Now an example of how to use
points_in_circle
:On a raster of 10 million integers it is pretty quick.
Please describe file format or put a sample somewhere if you need more specific answer.
Numpy 允许您执行此操作,并且速度非常快:
Numpy allows you to do this, and is extremely fast:
您需要一个可以读取栅格的库。我不知道如何在Python中做到这一点,但如果你想用Java编程,你可以看看geotools(特别是一些新的栅格库集成)。如果您擅长 CI,建议使用 GDAL 之类的东西。
如果您想查看桌面工具,您可以考虑使用 python 扩展 QGIS 来执行上述操作。
如果我没记错的话,PostGIS 的栅格扩展可能支持基于矢量的裁剪栅格。这意味着您需要为数据库中的要素创建圆圈,然后导入栅格,但随后您可能可以使用 SQL 来提取您的值。
如果您实际上只是一个网格中带有数字的文本文件,那么我会采用上面的建议。
You need a library that can read your raster. I am not sure how to do that in Python but you could look at geotools (especially with some of the new raster library integration) if you want to program in Java. If you are good with C I would reccomend using something like GDAL.
If you want to look at a desktop tool you could look at extending QGIS with python to do the operation above.
If I remember correctly, the Raster extension to PostGIS may support clipping rasters based upon vectors. This means you would need to create your circles to features in the DB and then import your raster but then you might be able to use SQL to extract your values.
If you are really just a text file with numbers in a grid then I would go with the suggestions above.