基于高德地图的描点操作,监听地图缩放,展示合理数量的marker
原文:基于高德地图的描点操作,监听地图缩放,展示合理数量的marker
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的更多相关文章
- Android Google Maps 监听地图缩放
接上篇.http://www.cnblogs.com/maomishen/p/3556297.html 由于公司项目要求,需要对google map监听地图的缩放(zoom)来进行一些操作. 但是在网 ...
- iOS 百度地图监听地图状态
百度地图提供了地图状态的对象BMKMapStatus ///此类表示地图状态信息 @interface BMKMapStatus : NSObject { float _fLevel; // 缩放比例 ...
- 基于Lua插件化的Pcap流量监听代理
1.前言 我们在实际工作中,遇到了一个这样的用例,在每天例行扫描活动中,发现有些应用系统不定期的被扫挂,因为我们不是服务的制造者,没有办法在不同的系统里打印日志,所以我们就想用一个工具来获取特定服务的 ...
- openlayers 3监听地图分辨率变化事件
map.getView().on('change:resolution',checkZoom);//checkZoom为调用的函数 function checkZoom() { // alert(&q ...
- PIE SDK地图范围设置和图层事件监听
1. 功能简介 地图范围设置的监听就是通过IMapControlEvents接口对地图的视图范围更新或者地图的分辨率发生变化进行监听,然后做出相应的操作. 图层事件的监听就是通过IActiveView ...
- NSOperation操作依赖和监听
1.操作依赖 NSOperation之间可以设置依赖来保证执行顺序 比如一定要让操作A执行完后,才能执行操作B,可以这么写 [operationB addDependency:operationA]; ...
- iOS开发NSOperation 三:操作依赖和监听以及线程间通信
一:操作依赖和监听 #import "ViewController.h" @interface ViewController () @end @implementation Vie ...
- Python 键盘鼠标监听
异想天开的想记录一下自己每天的键盘键位走向,于是就在网上搜索了一下相关的实现,然后就发现了一个第三方的库pyHook.封装的很好,我们只需要傻瓜式的调用里面的API就可以了. 下面是我在使用pyHoo ...
- 8、Curator的监听机制
原生的zookeeper的监听API所实现的方法存在一些缺点,对于开发者来说后续的开发会考虑的细节比较多. Curator所实现的方法希望摒弃原声API 的不足,是开发看起来更加的简单,一些重连等操作 ...
随机推荐
- minizlib
ZLIB开源库采用的是DEFLATE压缩算法,已经不支持加密功能,实际上功能还存在于代码中,采用MINIZIP可以支持对ZIP文件的加解密. ZLIB目前最新的是1.2.7,MINIZIP最新的版本是 ...
- 【BZOJ 3156】防御准备
[链接] 链接 [题意] 在这里输入题意 [题解] 把a倒过来 设f[i]表示在i放一个防御塔的最小花费; 我们如果从j转移过来 就表示j+1..i-1这一段放人偶. s[i] = 1 + 2 + . ...
- Go语言实战_自己定义OrderedMap
一. 自己定义OrderedMap 在Go语言中.字典类型的元素值的迭代顺序是不确定的.想要实现有固定顺序的Map就须要让自己定义的 OrderedMap 实现 sort.Interface 接口类型 ...
- GitHub的repository的相关操作
原文地址 https://www.jianshu.com/p/038e8ba10e45 1.准备工作 a.有自己的GitHub账号(https://github.com/)b.在自己本地有安装git软 ...
- 安装hadoop1.2.1集群环境 分类: A1_HADOOP 2014-08-29 15:49 1444人阅读 评论(0) 收藏
一.规划 (一)硬件资源 10.171.29.191 master 10.173.54.84 slave1 10.171.114.223 slave2 (二)基本资料 用户: jediael 目录 ...
- Zookeeper实战之嵌入式执行Zookeeper集群模式
非常多使用Zookeeper的情景是须要我们嵌入Zookeeper作为自己的分布式应用系统的一部分来提供分布式服务.此时我们须要通过程序的方式来启动Zookeeper.此时能够通过Zookeeper ...
- 海思hi3716c机顶盒接usb摄像头和usb无线耳机时,无线耳机有时没有声音
两个USB设备各自是: A:USB摄像头带录音功能,但不带放音功能. B:USB无线耳机是使用USB转2.4G的无线耳机. 详细现象: 1, A,B两者同一时候插上机顶盒,并开机进入android,此 ...
- 伸展树(splay tree)
伸展树的设计思路,鉴于数据访问的局部性(28原则)在实际应用中普遍存在,将按照"最常用者优先"的启发策略.尽管在最坏情况下其单次操作需要 O(n) 时间,但分摊而言仍然 O(log ...
- ios UI控件的简单整理
把该文件拷贝到.m文件中就能够方便的查找 /** 匿名类目:能够声明方法和变量,属性为private(不同意在外部调用,且不能被继承 */ /** 发送数据的托付方,接收数据的时代理发(即代理的反向传 ...
- python property属性
能够检查參数,一直没注意这个语言特性,忽略了非常多细节,感谢 vitrox class Person( object ): def __init__( self, name ): if not isi ...