一种改进后的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'); } };
效果图: