[原創.數據可視化系列之十三]idw反距離權重插值算法的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;
 
}

調用方法以下:git

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

 

注意,前端不適合使用大量的這個算法,我這個是格點用的插值。spa

相關文章
相關標籤/搜索