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

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

使用RasterizeLayer后的用途是:



我想要的最终产品是什么:



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

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

#1 楼

我来看看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方法一个旋转。我将回发结果。

–道格
2011年12月2日于16:57

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

–道格
2012年3月13日在16:42

@Doug不用担心-乐于助人!

–om_henners
2012年3月13日在17:06

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

–米罗
2014年9月9日下午0:15

#2 楼

看看GDAL网格API。我不知道它是否在Python绑定中公开,但是如果没有,您可以通过子流程模块调用gdal_grid实用程序。

GDAL Grid API仅使用反距离权重,移动平均值和最近邻居,它没有实现样条曲线。另一种选择是使用Scipy。

#3 楼

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

https://github.com/rosskush/skspatial

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