基于Geojson的点集的抽稀Js实现

由于要进行反距离插值,离散点太多肯定会影响插值的效率。

为了提升插值速度,就有了这个点的抽稀。

参考这位仁兄的思路。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;
    }
};

  

原文地址:https://www.cnblogs.com/hillgisman/p/6186050.html