為何要計算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;
}
複製程式碼