使用GDAL在Python中平滑/插值栅格?


20

我正在用Python开发,并使用OSGEO的GDAL来处理栅格和shapefile并与之交互。

我想获取一个具有点特征的shapefile并将其插入到表面栅格中。现在,我使用的是'RasterizeLayer'方法,该方法将点要素中的值刻录到栅格中(使用所有nodata值进行设置),但将所有未触及的像素保留为'nodata'值。因此,我剩下的是棋盘式栅格。

使用RasterizeLayer之后,我得到了什么:

[使用gdal.rasterizelayer的光栅]

我想要的最终产品是:

在此处输入图片说明

我相信我要寻找的功能在arcgisscripting导入中称为'Spline_sa()'。

GDAL是否具有类似的功能,或者有其他方法来获得所需的输出?

Answers:


18

我看一下NumPy和Scipy-SciPy Cookbook中有一个很好的示例,它使用scipy.interpolate.griddata函数进行插值。显然,这要求您将数据存储在numpy数组中;

  • 使用GDAL python绑定,您可以gdal.Dataset.ReadAsArray()将栅格中的数据读入Python 。
  • 使用OGR,您可以遍历要素图层并从shapefile中提取点数据(或者更好的是,使用GEOMETRY=AS_XYZ[请参见OGR CSV文件格式]将shapefile写入CSV,然后将csv读取到Python中)。

获得网格化输出后,可以使用GDAL将生成的numpy数组写入栅格。

最后,如果您对Scipy插值库没有任何运气,也可以随时尝试scipy.ndimage


谢谢您的帮助!我给Scipy.interpolate.griddata方法一个旋转。我将回发我的结果。
Doug

1
很抱歉花了这么长时间回到这篇文章。上面的答案基本上就是我为解决问题所做的事情。我使用了Scipy插值库来填充这些nodata空间,然后将其写回到光栅带。感谢您的帮助!
Doug 2012年

@Doug不用担心-很高兴康复!
om_henners 2012年

1
这个解决方案有多快?它可以用于仅每100x100已知值的10k x 10k网格吗?我尝试了gdal_fillnodata,它比任何插值法都快得令人难以置信,但对于稀疏点来说效果不佳。目前,我正在使用Saga的三角剖分技术,但对于中型阵列,它非常慢,而对于大型阵列,则失败。
米罗2014年

12

看一下GDAL网格API。我不知道如果在Python绑定暴露,但如果没有,你打电话叫gdal_grid通过公用模块。

GDAL网格API仅使用反距离权重,移动平均和最近邻,而不实现样条线。另一种选择是使用Scipy


1

该线程有些陈旧,但我编写了一个简单的模块,该模块使用了来自sklearn的称为skspatial的KNN算法。

https://github.com/rosskush/skspatial

您可以使用geopandas导入shapefile并选择一列,它将对可以导出到栅格的曲面进行插值。这是非常基本的方法,可能不是最好的方法,但是它至少使所有内容保持纯python。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.