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

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

 

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



https://i-blog.csdnimg.cn/blog_migrate/8fd76906f92bf66ed41bf8cd2aeee3b4.webp?x-image-process=image/format,png

 

IDW步骤

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

https://i-blog.csdnimg.cn/blog_migrate/9bb650ba2a23953427edb5bc6a827af9.webp?x-image-process=image/format,png

https://i-blog.csdnimg.cn/blog_migrate/e6def0f33f999344e9a3a859384617b7.webp?x-image-process=image/format,png

 

javascript代码实现

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

//idw算法
//输入[[x:0,y:0,v:0],[x:0,y:0,v:0],[x:0,y:0,v:0]]
function idwcomputer(datas,result){
   if(datas.lenght<3) return result;
   var m0=datas.length;
   var m1=result.length;
   
   //console.info(datas);
   
   //距离列表
   var r=[];
   
   for(var i=0;i<m1;i++){
       for(var j=0;j<m0;j++){
             var tmpDis = Math.sqrt(Math.pow(result[i].x - datas[j].x, 2) + Math.pow(result[i].y - datas[j].y, 2));
             r.push(tmpDis);
       }
   }
   
   //插值函数

   for (var i = 0; i < m1; i++)
   {
       //查找重复
       var ifFind = false;
       for (var j = m0 * i; j < m0 * i + m0; j++)
       {
           if (Math.abs(r[j]) < 0.0001)
           {
               result[i].v = datas[j - m0 * i].v;
               ifFind = true;
               break;
           }
       }

       if (ifFind) continue;

       var numerator = 0;
       var denominator = 0;

       for (var j = m0 * i; j < m0 * i + m0; j++)
       {
           numerator += datas[j - m0 * i].v / (r[j] * r[j]);
           denominator += 1 / (r[j] * r[j]);
       }
     
       result[i].v = numerator / denominator;
   }
   return result;

}

 

 

调用方法如下:

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);

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



原文链接:https://www.jianshu.com/p/b38c5e464d16

 

  • 9
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当然,我可以为您提供一个例代码来实现距离加权插值算法。以下是一个使用Python编写的简单示例: ```python import numpy as np def inverse_distance_weighted_interpolation(points, values, unknown_point, power=2): distances = np.linalg.norm(points - unknown_point, axis=1) weights = 1 / distances**power weighted_values = values * weights interpolated_value = np.sum(weighted_values) / np.sum(weights) return interpolated_value # 示例数据 points = np.array([[1, 1], [2, 3], [4, 6], [6, 2]]) values = np.array([3, 5, 8, 2]) unknown_point = np.array([3, 4]) interpolated_value = inverse_distance_weighted_interpolation(points, values, unknown_point) print(f"Interpolated value at {unknown_point}: {interpolated_value}") ``` 在这个示例代码中,我们定义了一个名为`inverse_distance_weighted_interpolation`的函数来执行距离加权插值。该函数接受以下参数: - `points`:已知位置的数据点的坐标,以 Numpy 数组形式表示。 - `values`:已知位置的数据点的值,以 Numpy 数组形式表示。 - `unknown_point`:要进行插值的未知位置点的坐标,以 Numpy 数组形式表示。 - `power`(可选):距离的权重指数,默认为2。 函数首先计算未知位置点与已知位置点之间的距离(使用`np.linalg.norm`计算欧氏距离),然后将距离的倒数作为权重。接下来,将已知位置点的值与对应的权重相乘,并求和得到加权值。最后,将加权值除以权重的总和,得到未知位置点的插值结果。 在示例数据中,我们使用了四个已知位置点的二维坐标和对应的值。然后,我们选择一个未知位置点进行插值,并打印出插值结果。 请注意,这只是一个简单的示例代码,用于说明距离加权插值的基本原理。在实际应用中,您可能需要根据具体情况进行适当的修改和优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值