使用flutter_map計算相應的高德地圖zoom值與地圖的center

ArlenFuCN發表於2018-12-28

為何要計算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;
}


複製程式碼

相關文章