为何要计算zoom级别
当我们在地图上设置很多坐标点的时候需要对地图进行初始化,让他显示在一个合理的范围并且能够包含所有点,保证点不被遗漏。 如果我们只是使用初始化定义下,很可能只能显示固定的地图大小,地图上点位标记显得不是很全面。
计算中心点
很多坐标在地图上的时候,实际中心点的位置,可以根据坐标最大最小值进行计算出来 伪码举例:
for(var latlng in latLngList){
读取经纬度列表
找到坐标中的最大最小经纬度
MaxLat
MaxLon
MinLat
MinLon
}
中心点坐标为: (MaxLat - MinLat)/2 + MinLat (MaxLon - MinLon)/2 + MinLon
计算zoom
高德地图zoom与举例的对应关系(可能这个说法不严谨,但是这么理解下就好)
zoom | 距离 |
---|---|
2 | 1000KM |
3 | 1000KM |
4 | 500KM |
5 | 200KM |
6 | 100KM |
7 | 50KM |
8 | 30KM |
9 | 20KM |
10 | 10KM |
11 | 5KM |
12 | 2KM |
13 | 1KM |
14 | 500m |
15 | 200m |
16 | 100m |
17 | 50m |
18 | 15m |
19 | 10m |
因此有了如下代码,根据距离计算返回高德地图zoom,distance以KM为单位
if(distance > 1000){
return 3;
}else if (distance>= 500 && distance <1000){
return 4;
}else if (distance>= 200 && distance <5000){ return 5;
}else if (distance>= 100 && distance <200){ print("6"); return 6;
}else if (distance>= 50 && distance <100){ return 7;
}else if (distance>= 30 && distance <50){ return 8;
}else if (distance>= 20 && distance <30){ return 9;
}else if (distance>= 10 && distance <20){ return 10;
}else if (distance>= 5 && distance <10){ return 11;
}else if (distance>= 2 && distance <5){ return 12;
}else if (distance>= 1 && distance <2){ return 13;
}else if (distance>= 0.5 && distance <1){ return 14;
}else if (distance>= 0.2 && distance <0.5){ return 15;
}else if (distance>= 0.1 && distance <0.2){ return 16;
}else if (distance>= 0.05 && distance <0.1){ return 17;
}else if (distance>= 0.025 && distance <0.05){ return 18;
}else if (distance>= 0.01 && distance <0.025){ return 19;
}
根据坐标计算两点之间的距离
具体的公式需要去查阅资料,这里给出具体解算代码 大体思路就是根据经纬度,球体半径计算距离:
//! 获取坐标极值之间的距离double getDistanse(double lat1,double lat2, double lon1,double
lon2){ //! 根据坐标,地球半径算出两个坐标之间的距离
double radLat1 = lat1 * PI /180;
double radLat2 = lat2 * PI /180;
double radLon1 = lon1 * PI /180;
double radLon2 = lon2 * PI /180;
double a = radLat1 - radLat2;
double b = radLon1 - radLon2;
double 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; s = round(s * 10000)/10000;
return s;
}