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;
        }
    };
    

      

  • 相关阅读:
    jQuery插件开发的模式和结构
    jQuery插件开发详细教程
    一个JavaScript Function Outliner插件 第三个版本 让你的JavaScript代码也支持折叠
    web开发过程中经常用到的一些公共方法及操作
    C#操作注册表
    EventBus使用详解(一)——初步使用EventBus
    android xml布局文件中tools:layout的作用
    调用android系统相机拍照并保存
    Android组件间通信库EventBus学习
    网络通信框架Volley使用详细说明
  • 原文地址:https://www.cnblogs.com/hillgisman/p/6186050.html
Copyright © 2011-2022 走看看