一种改进后的turf.idw算法

 

 

turf 是Advanced geospatial analysis geojson data in javascript.

官网:http://turfjs.org/

 

针对github 中的源码。

记得在以前使用arcgis 的反距离插值的时候有搜索半径和剪切范围定义。

于是就增加了这两个参数。

可在浏览器端使用的IDW算法就优化到相对适合使用了。

 

  /**
     * idwPolygon - 反距离插值生成格网面集
     *
     * @param {type} controlPoints   离散点
     * @param {type} valueField      计算属性值z
     * @param {type} b               反距离幂值
     * @param {type} cellWidth       单元格宽
     * @param {type} SearchR         搜索半径
     * @param {type} units           单位km
     * @param {type} boundaryPolygon 剪裁范围
     *
     * @return {type} Description
     */
    var idwPolygon = function(controlPoints, valueField, b, cellWidth, SearchR, units, boundaryPolygon) {
        var distance = turf.distance;
        var squareGrid = turf.squareGrid;
        var centroid = turf.centroid;
        var bbox = turf.bbox;
        var inside = turf.inside;
        var featureCollection = turf.featureCollection;
        // check if field containing data exists..
        var filtered = controlPoints.features.filter(function(feature) {
            return feature.properties &&
                feature.properties.hasOwnProperty(valueField);
        });
        if (filtered.length !== 0) {
            // create a sample square grid
            // compared to a point grid helps visualizing the output (like a raster..)
            var resultGrid = [];
            var bbbox = boundaryPolygon ? bbox(boundaryPolygon) : bbox(controlPoints);//剪切范围增加
            var samplingGrid = squareGrid(bbbox, cellWidth, units);
            var N = samplingGrid.features.length;
            for (var i = 0; i < N; i++) {
                var cpointi = centroid(samplingGrid.features[i]);
                if (!inside(cpointi, boundaryPolygon)) { //如果在面外,不参与计算
                    continue;
                }
                var zw = 0;
                var sw = 0;
                // calculate the distance from each control point to cell's centroid 
                for (var j = 0; j < controlPoints.features.length; j++) {
                    var d = distance(cpointi, controlPoints.features[j], units);
                    if (d > SearchR) {
                        continue;
                    }
                    if (d === 0) {
                        zw = controlPoints.features[j].properties[valueField];
                    }
                    var w = 1.0 / Math.pow(d, b);
                    sw += w;
                    zw += w * controlPoints.features[j].properties[valueField];
                }
                // write IDW value for each grid cell
                var zvalue = zw / sw; //如果都在影响半径外,那么可能为非数字,赋值为0
                samplingGrid.features[i].properties.z = zvalue ? zvalue : 0;

                resultGrid.push(samplingGrid.features[i]);
            }
            return featureCollection(resultGrid);
        } else {
            console.log('Specified Data Field is Missing');
        }
    };

  

效果图:

 

posted @ 2016-12-28 17:09  帕洛马山  阅读(541)  评论(0编辑  收藏  举报