zoukankan      html  css  js  c++  java
  • 基于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;
        }
    };
    

      

  • 相关阅读:
    财富平台项目日记1:spring boot + mybatis 实现分页查询
    Spring boot 跨域
    Mysql索引
    Java中list多对多拆分
    Redis持久化
    Windows下安装Redis
    idea 常用快捷键
    数据库事务
    Linux开启防火墙端口号
    nginx相关
  • 原文地址:https://www.cnblogs.com/hillgisman/p/6186050.html
Copyright © 2011-2022 走看看