当前位置:   article > 正文

反距离加权法(Inverse Distance Weighted)插值_inverse_distance_to_grid

inverse_distance_to_grid

反距离加权法(Inverse Distance Weighted)插值是近期做大数据显示时使用的插值方法,很好用的插值方法。
反距离权重法主要依赖于反距离的幂值,幂参数可基于距输出点的距离来控制已知点对内插值的影响。幂参数是一个正实数,默认值为2。(一般0.5到3的值可获得最合理的结果)。
通过定义更高的幂值,可进一步强调最近点。因此,邻近数据将受到更大影响,表面会变得更加详细(更不平滑)。随着幂数的增大,内插值将逐渐接近最近采样点的值。指定较小的幂值将对距离较远的周围点产生更大的影响,从而导致平面更加平滑。
由于反距离权重公式与任何实际的物理过程都不关联,因此无法确定特定幂值是否过大。作为常规准则,认为值为30的幂是超大幂,因此不建议使用。此外还要牢记一点,如果距离或幂值较大,则可能生成错误结果。
在IDW插值之前,我们可以事先获取一个离散点子集,用于计算插值的权重;
原因1:离散点距离插值点越远,其对插值点的影响力越低,甚至完全没有影响力;
原因2:离散点越少可以加快运算速度;

3872133-d2a6d9dc2532e0a3.png
image.png

IDW步骤

IDW插值方法假定每个输入点都有着局部影响,这种影响随着距离的增加而减弱。
步骤:
①计算未知点到所有点的距离;
② 计算每个点的权重:权重是距离的倒数的函数。

3872133-deae15f73844c012.png
image.png

3872133-d648837f473991e0.png
image.png

感谢: 稻草人

javascript代码实现

图形渲染中,idw反距离权重插值算法是一个应用非常广泛的方法,但是js实现的比较少

  1. //idw算法
  2. //输入[[x:0,y:0,v:0],[x:0,y:0,v:0],[x:0,y:0,v:0]]
  3. function idwcomputer(datas,result){
  4. if(datas.lenght<3) return result;
  5. var m0=datas.length;
  6. var m1=result.length;
  7. //console.info(datas);
  8. //距离列表
  9. var r=[];
  10. for(var i=0;i<m1;i++){
  11. for(var j=0;j<m0;j++){
  12. var tmpDis = Math.sqrt(Math.pow(result[i].x - datas[j].x, 2) + Math.pow(result[i].y - datas[j].y, 2));
  13. r.push(tmpDis);
  14. }
  15. }
  16. //插值函数
  17. for (var i = 0; i < m1; i++)
  18. {
  19. //查找重复
  20. var ifFind = false;
  21. for (var j = m0 * i; j < m0 * i + m0; j++)
  22. {
  23. if (Math.abs(r[j]) < 0.0001)
  24. {
  25. result[i].v = datas[j - m0 * i].v;
  26. ifFind = true;
  27. break;
  28. }
  29. }
  30. if (ifFind) continue;
  31. var numerator = 0;
  32. var denominator = 0;
  33. for (var j = m0 * i; j < m0 * i + m0; j++)
  34. {
  35. numerator += datas[j - m0 * i].v / (r[j] * r[j]);
  36. denominator += 1 / (r[j] * r[j]);
  37. }
  38. result[i].v = numerator / denominator;
  39. }
  40. return result;
  41. }

调用方法如下:

var idwdatas=[],idwresult=[];
//填充计算点的位置

//下边的数据从后端返回
$.each(result.result,function(i,val){
idwdatas.push({"x":val.pointLongitude,"y":val.pointLatitude,"v":val.value});
});
//计算需要范围的结果的经纬度坐标

//需要插值的格点坐标。这个通过等分经纬度实现的,
idwresult=countgridlocal(grid);
//返回idw计算结果
idwresult=idwcomputer(idwdatas,idwresult);
console.info(idwresult);

注意,前端不适合使用大量的这个算法,我这个是格点用的插值。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/306030
推荐阅读
相关标签
  

闽ICP备14008679号