前言: 本人研一,刚开始学python,初衷其实是想以arcgis软件上没有的插值方法进行空间插值,奈何人菜瘾大,只能先从基础的插值方法开始,这次的IDW插值算是一个开始吧,相关内容也会慢慢进行记录,希望自己能在这个方面一直做下去。
废话不多说我们直接开始。
首先,我们需要明确一下什么是IDW(反距离权重)插值算法。
给出以下定义:
以待估计点
为中心,确立一个范围,在这个范围内的所有已知点
,
都将以自身到待估计点的距离的反比作为权重,对待估计点
造成影响,这就是IDW(反距离权重)插值算法。
我们可以很清楚的看到,在进行IDW插值算法时,必要的参数只有待估计点
,点
,
,及其
值(样本值)。另外,我们给出一个幂参数
来控制已知点对内插值的影响。其中,幂参数是一个正实数,默认值为2。(一般0.5到3的值可获得最合理的结果)。
下面给出权重公式:
其中,
为某已知点到待估计点的距离,
为幂参数。
在这些条件下,我定义了以下代码:
# 求距离反比平方之和
def getDsum(x,y,list=[]):
dsum = 0
for points in pointlist:
point_x = points[0]
point_y = points[1]
d = math.sqrt((point_x - x) ** 2 + (point_y - y) ** 2)
dsum = (1 / d)**2 + dsum
return dsum
# 求解各已知点的权重
def getWeight(x,y,list=[]):
dsum = getDsum(x,y,list)
weight = []
for points in list:
dlist=[]
point_x = points[0]
point_y = points[1]
d = math.sqrt((point_x - x) ** 2 + (point_y - y) ** 2)
dlist.append(d)
wei = ((1/d)**2)/dsum
weight.append(wei)
return weight
# 求得待估计点
def IDW_self(x,y,weight,list = []):
i = 0
for points in list:
point_z = points[2]
z = point_z*weight[i]+z
i=i+1
Value = "点({0},{1})的插值为{2}".format(x,y,z)
return Value
接着给出以下参数(pointlist中的点参数对应的是点的xy坐标及样本值):
pointlist = [(1,2,20),(2,3,26),(3,4,23)]
weight = getWeight(x,y,pointlist)
pointvalue = IDW_self(x,y,weight,pointlist)
print pointvalue
结果如图:
点(0,0)的插值为21.8349514563
至此,对于单个待估计点的IDW插值已经完成,接下来要思考的,是如何实现遍历包含所有样本点在内的extent的所有点,并使用IDW插值算法得到所有待估计点的值;以及如何将这些点,在arcgis上建立栅格模型并进行显示。
关于IDW的相关参考:http://blog.sina.com.cn/s/blog_6316e2af0101l54m.html
当然还看了很多但是说实话并没什么用来着
写在最后:作为一名初学者,鄙人能力十分有限,算法肯定是不完善的,如果还有什么见解,也欢迎各位指正,希望大家能相互学习,相互进步。另外,由于在学习编程的同时还在学习《统计学习方法》,因此下一篇关于IDW插值方法的文章发布的时间可能是明天,可能是下周,也可能是一个月...也可能这几天会更一篇关于《统计学习方法》的内容,谢谢大家。
原创不易欢迎转载QAQ
前言: 研一,刚开始学python,初衷其实是想以arcgis软件上没有的插值方法进行空间插值,奈何人菜瘾大,只能先从基础的插值方法开始,这次的IDW插值算是一个开始吧,我会慢慢记录自己的成长...
雨插值器
根据从多边形周围的几个降雨站获得的数据,查找流域(基本上是任何多边形)的每日降雨量。 IDW 是插值法。 它允许改变 IDW 功率,因此,thiessen 方法可以通过使用高 IDW 功率(功率 = 50)来近似。 有一个获取数据的方法和一个大约 10 分钟的视频,展示了如何使用它。 视频:http: 参见 WIKI: : Howto:收集输入以使用 Rain Interpolator 的指南
在 CSV 文件中组织降雨数据。 在此示例中,计算弗吉尼亚州阿灵顿县的 IDW 降雨。 我从位于的国家气候数据中心 (NCDC) 获得了来自全县雨量计的数据。 如果你不知道从哪里开始 NCDC 至少对美国来说是一个好地方。 降雨数据必须按以下格式排列 StationName, Date (yyyymmdd), preci。 还需要带有标题的第一行。 示例:STATION_NAME,DA
利用GPU实现IDW(反距离加权插值)
IDW的实现比较简单,已知插值点位比较少的情况下,可以直接遍历所有插值点,来获取临近的几个点,进行插值运算。插值点较多时,需要可以使用kd-tree来加速临近点的查找。本次仅对小数据量情况进行讨论,将IDW算法在shader中实现,可以方便的使用webgl的裁剪面和强大的并行计算。具体计算流程如下:
插值点位提交到GPU
数据提交,我使用了uniform数组变量来存储,在渲染过程中,直接提交插值点位的数据,数据类型为vec3,webgl我使用了twgl第三方库(为了偷