原文:基于高德地图的描点操作,监听地图缩放,展示合理数量的marker

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lx583274568/article/details/54089707

1.根据两点经纬度算两点之间的距离函数

function Rad(d){
return d * Math.PI / 180.0;//经纬度转换成三角函数中度分表形式。
}
//计算距离,参数分别为第一点的纬度,经度;第二点的纬度,经度
function GetDistance(lat1,lng1,lat2,lng2){ var radLat1 = Rad(lat1);
var radLat2 = Rad(lat2);
var a = radLat1 - radLat2;
var b = Rad(lng1) - Rad(lng2);
var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) +
Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));
s = s *6378.137 ;// EARTH_RADIUS;
s = Math.round(s * 10000) / 10000; //输出为公里
//s=s.toFixed(4);
return s;
}

2.给地图绑定监听事件

map.on("zoomchange",function(){
for (var i = pathContentArr.length - 1; i >= 0; i--) {
pathContentArr[i].setMap(null);
}
for (var i = pathMarkerArr.length - 1; i >= 0; i--) {
pathMarkerArr[i].setMap(null);
}
pathMarkerArr=[];
pathContentArr=[];
drawMarkerByDistance(map.getZoom()) })

3.drawMarkerByDistance函数【会根据第i个点和第i+1个点之间的距离进行初步筛选,其中select函数对初步筛选出来的点进行了所有点两两之间距离的二次筛选】

function drawMarkerByDistance(zoom){
        var perDistance=0;   //当前累计公里数
        var zoom=zoom||6;
        switch (zoom){
            case 3:
                var targetDistance=800;  //km
                break;
            case 4:
                var targetDistance=400;  //km
                break;
            case 5:
                var targetDistance=200;  //km
                break;
            case 6:
                var targetDistance=120;  //km
                break;
            case 7:
                var targetDistance=60;  //km
                break;
            case 8:
                var targetDistance=30;  //km
                break;
            case 9:
                var targetDistance=15;  //km
                break;
            case 10:
                var targetDistance=7;  //km
                break;
            case 11:
                var targetDistance=4;  //km
                break;
            case 12:
                var targetDistance=1;  //km
                break;
            case 13:
                var targetDistance=0.5;  //km
                break;
            default:
                var targetDistance=0.25;  //km
        }
        var prepareToShowMarker=[];
        for (var i = 0; i < curShipPolyLineData.length; i++) {
            //第一个点和最后一个点默认展示出来,累计长度大于目标长度的画出来
            if (i==0||i==curShipPolyLineData.length-1 || (curShipPolyLineData[i].distance+perDistance)>targetDistance) {
                var marker={
                    lat:parseFloat(curShipPolyLineData[i].latitude),
                    lng:parseFloat(curShipPolyLineData[i].longitude),
                    course:curShipPolyLineData[i].course,
                    AddTime: curShipPolyLineData[i].AddTime,
                }
                prepareToShowMarker.push(marker);
            }
            if(i<curShipPolyLineData.length-1 && i>1){
                if ((curShipPolyLineData[i].distance+perDistance)>targetDistance) {
                    perDistance=0;
                }else{
                    perDistance+=curShipPolyLineData[i].distance;
                }
            }
        }
        
        var select=function(arr){
            var flag=true;
            for(var i=0;i<arr.length;i++){
                for(var j=i+1;j<arr.length;j++){
                    var curdistance=GetDistance(arr[i].lat,arr[i].lng,arr[j].lat,arr[j].lng);
                    //如果还有靠得很近的点
                    if (curdistance<targetDistance) {
                        flag=false;
                        //随机剔除掉一个i和j之间的一个点
                        Math.random()>0.5?arr.splice(i,1):arr.splice(j,1);
                        break;
                    }
                }
                if(flag==false){
                    break;
                }
            }
            //当数组中所有的点两两之间的距离都大于targetDistance的时候退出递归
            if (flag==false) {
                select(arr);
            }
        }
        select(prepareToShowMarker);
        for (var i = prepareToShowMarker.length - 1; i >= 0; i--) {
            var position=[prepareToShowMarker[i].lng,prepareToShowMarker[i].lat];
            var content = new AMap.Marker({
                content:prepareToShowMarker[i].AddTime,
                position: position,
                title: prepareToShowMarker[i].AddTime,
                offset:new AMap.Pixel(20,0),
                map: map
            });
            pathContentArr.push(content);
            var marker = new AMap.Marker({
                offset:new AMap.Pixel(0,0),
                icon:"new_images/arrow_r.png",
                angle:((prepareToShowMarker[i].course-90)%360),
                position: position,
                map: map
            });
            pathMarkerArr.push(marker);
        }         
    }

基于高德地图的描点操作,监听地图缩放,展示合理数量的marker的更多相关文章

  1. Android Google Maps 监听地图缩放

    接上篇.http://www.cnblogs.com/maomishen/p/3556297.html 由于公司项目要求,需要对google map监听地图的缩放(zoom)来进行一些操作. 但是在网 ...

  2. iOS 百度地图监听地图状态

    百度地图提供了地图状态的对象BMKMapStatus ///此类表示地图状态信息 @interface BMKMapStatus : NSObject { float _fLevel; // 缩放比例 ...

  3. 基于Lua插件化的Pcap流量监听代理

    1.前言 我们在实际工作中,遇到了一个这样的用例,在每天例行扫描活动中,发现有些应用系统不定期的被扫挂,因为我们不是服务的制造者,没有办法在不同的系统里打印日志,所以我们就想用一个工具来获取特定服务的 ...

  4. openlayers 3监听地图分辨率变化事件

    map.getView().on('change:resolution',checkZoom);//checkZoom为调用的函数 function checkZoom() { // alert(&q ...

  5. PIE SDK地图范围设置和图层事件监听

    1. 功能简介 地图范围设置的监听就是通过IMapControlEvents接口对地图的视图范围更新或者地图的分辨率发生变化进行监听,然后做出相应的操作. 图层事件的监听就是通过IActiveView ...

  6. NSOperation操作依赖和监听

    1.操作依赖 NSOperation之间可以设置依赖来保证执行顺序 比如一定要让操作A执行完后,才能执行操作B,可以这么写 [operationB addDependency:operationA]; ...

  7. iOS开发NSOperation 三:操作依赖和监听以及线程间通信

    一:操作依赖和监听 #import "ViewController.h" @interface ViewController () @end @implementation Vie ...

  8. Python 键盘鼠标监听

    异想天开的想记录一下自己每天的键盘键位走向,于是就在网上搜索了一下相关的实现,然后就发现了一个第三方的库pyHook.封装的很好,我们只需要傻瓜式的调用里面的API就可以了. 下面是我在使用pyHoo ...

  9. 8、Curator的监听机制

    原生的zookeeper的监听API所实现的方法存在一些缺点,对于开发者来说后续的开发会考虑的细节比较多. Curator所实现的方法希望摒弃原声API 的不足,是开发看起来更加的简单,一些重连等操作 ...

随机推荐

  1. java实现微信支付宝等多个支付平台合一的二维码支付(maven+spring springmvc mybatis框架)

    首先申明,本人实现微信支付宝等支付平台合多为一的二维码支付,并且实现有效时间内支付有效,本人采用的框架是spring springmvc mybatis 框架,maven管理.其实如果支付,不需要my ...

  2. gerrit docker

    修改项目配置文件 git clone ssh://admin@localhost:29418/All-Projects && scp -p -P 29418 admin@localho ...

  3. 基于Maven,Spring+ActiveMQ实现,贴近实际

    本文只实现了Topic,queue改点配置就行了 一.pom依赖 Spring的太长了,具体可以看下面源码里面 <dependency> <groupId>org.apache ...

  4. pandas 学习(四)—— 数据处理(清洗)、缺失值的处理

    创建 DataFrame: df = pd.DataFrame(np.random.randint(0, 10, (2, 4)), columns=list('ABCD')) 0. 为 data fr ...

  5. ArcGIS Engine 编辑介绍

    转自原文 ArcGIS Engine 编辑介绍 IWorkspaceEdit接口是ArcGIS Engine 实现空间数据编辑的重要接口,它让程序启动或者停止一个编辑流程,在这个编辑流程内,可以对数据 ...

  6. Request对象和Response对象详解

    Request 1.获取请求的基本信息 1>获取请求的url和uri 2>获取url后面的请求参数部分的字符串 3>获取请求方式 4>获取主机名,IP地址 5>获取 Co ...

  7. [ES6] Use ES6 Proxies

    A JavaScript Proxy allows you to intercept operations performed on objects, arrays, or functions lik ...

  8. nodejs版本号更新问题:express不是内部或外部命令

    版本号更新后,我们使用熟悉的npm install -g express命令安装,可是,成功安装之后竟然提示express不是内部或外部命令. nodejs小问题:[1]express不是内部或外部命 ...

  9. 数据结构与算法——常用数据结构及其Java实现

    前言 仿佛一下子,2017年就快过去一半了,研一马上就要成为过去式了,我打算抓住研一的尾巴,好好梳理一下数据结构与算法,毕竟这些基础知识是很重要的嘛.所以准备在这里搞一个系列的文章,以期透彻. 本系列 ...

  10. erlang分布式入门(一)-ping pong

    erlang分布式入门(一)-ping pong 测试环境和http://willvvv.iteye.com/blog/1523918 一样,192.168.0.182(centos-182)和192 ...