使用flutter_map计算相应的高德地图zoom值与地图的center

为何要计算zoom级别

当我们在地图上设置很多坐标点的时候需要对地图进行初始化,让他显示在一个合理的范围并且能够包含所有点,保证点不被遗漏。 如果我们只是使用初始化定义下,很可能只能显示固定的地图大小,地图上点位标记显得不是很全面。

计算中心点

很多坐标在地图上的时候,实际中心点的位置,可以根据坐标最大最小值进行计算出来 伪码举例:

for(var latlng in latLngList){
    读取经纬度列表
    找到坐标中的最大最小经纬度
   MaxLat
   MaxLon
   MinLat
   MinLon
}
复制代码

中心点坐标为: (MaxLat - MinLat)/2 + MinLat (MaxLon - MinLon)/2 + MinLon

计算zoom

高德地图zoom与举例的对应关系(可能这个说法不严谨,但是这么理解下就好)

zoom距离
21000KM
31000KM
4500KM
5200KM
6100KM
750KM
830KM
920KM
1010KM
115KM
122KM
131KM
14500m
15200m
16100m
1750m
1815m
1910m

因此有了如下代码,根据距离计算返回高德地图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;
}


复制代码

转载于:https://juejin.im/post/5c259b7af265da6110371dad

已标记关键词 清除标记
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页