由于要进行反距离插值,离散点太多肯定会影响插值的效率。
为了提升插值速度,就有了这个点的抽稀。
参考这位仁兄的思路。http://blog.csdn.net/cdl2008sky/article/details/8281316
抽稀前:3087个点
simplifyMutiPoints.getProcessPoints(IsolinePoints.features,0.1,"z");
抽稀处理,
对密集的点抽稀,保持点的关键属性z值的均匀分布:剩余1682个。
可以看都左侧的大量相同权重的点被抽稀了。
最后附上代码:
/// <summary>抽稀处理,对密集的点抽稀,保持点的均匀分布。</summary> /// <param name="points" type="Array">待抽稀的数组 features Array</param> /// <param name="tolerance" type="Float">取样临界值</param> /// <param name="indicator" type="string">关键属性</param> var simplifyMutiPoints = { // dis: 1000, // degToMeter: Math.PI * 6378137 / 180.0, //6378137赤道半径,一度对应赤道上的一米 // buf: parseInt(this.dis * 1.0e7 / degToMeter), //1公里对应多少度 getProcessPoints: function(points, tolerance, indicator) { if (points.length < 3) return points; //小于3个点时不抽稀,因为1个或2个点无法进行抽稀 var IndexsToReduce = this.reduce(points, tolerance, indicator); //抽稀 //保存需要点下标的数组 var resultPoints = []; //返回的点数组 for (var i = 0; i < points.length; i++) { if (IndexsToReduce.indexOf(i) < 0) { resultPoints.push(points[i]); } } return resultPoints; }, reduce: function(points, tolerance, indicator) { //遍历抽稀,删除相同权重的点 // var IndexsToKeep = []; var IndexsToReduce = []; for (var i = 0; i < points.length; i++) { var k = i + 1; if (IndexsToReduce.indexOf(i) >= 0) { //如果是已删除的点,跳出 continue; } var p1 = points[i]; while (k < points.length) { var p2 = points[k]; var ToReduce = this.CheckPointEqualInBuffer(p1, p2, tolerance, indicator); if (ToReduce) { IndexsToReduce.push(k); } k++; } } return IndexsToReduce; }, //判断在抽稀中是否等值(依据缓冲范围以及关键属性) CheckPointEqualInBuffer: function(point1, point2, buffer /*缓冲相等*/ , indicator /*属性相等*/ ) { var x1=point1.geometry.coordinates[0], y1=point1.geometry.coordinates[1], x2=point2.geometry.coordinates[0], y2=point2.geometry.coordinates[1]; var inbuffer = (Math.abs(x1 - x2) <= buffer && Math.abs(y1 - y2) <= buffer); var iszEqual = true; if (indicator) { iszEqual = point1.properties[indicator] == point2.properties[indicator]; } return inbuffer && iszEqual; } };