因?yàn)樽约罕旧韺?duì)JAVA不是很了解溯捆,所以高德的java api基本上是看不懂的,一開(kāi)始想直接用高德的web api 設(shè)立一個(gè)地理圍欄,然后進(jìn)行判斷毡鉴,但是最后請(qǐng)求的時(shí)候地理圍欄列表一直返回為空石挂。
錯(cuò)誤的返回值.png
地理圍欄確定已創(chuàng)建博助,就是最后判斷時(shí)返回的時(shí)候沒(méi)有值,一直找不到哪里有問(wèn)題痹愚。
如果會(huì)使用高德的地理圍欄富岳,則可以忽略以下部分蛔糯。
既然沒(méi)法直接得到,那就在本地算窖式。
計(jì)算兩個(gè)經(jīng)緯度直接的距離的方法:
private const double EARTH_RADIUS = 6378137;
/// <summary>
/// 計(jì)算兩點(diǎn)位置的距離蚁飒,返回兩點(diǎn)的距離,單位:米
/// 該公式為GOOGLE提供萝喘,誤差小于0.2米
/// </summary>
/// <param name="lng1">第一點(diǎn)經(jīng)度</param>
/// <param name="lat1">第一點(diǎn)緯度</param>
/// <param name="lng2">第二點(diǎn)經(jīng)度</param>
/// <param name="lat2">第二點(diǎn)緯度</param>
/// <returns></returns>
public static double GetDistance(double lng1, double lat1, double lng2, double lat2)
{
double radLat1 = Rad(lat1);
double radLng1 = Rad(lng1);
double radLat2 = Rad(lat2);
double radLng2 = Rad(lng2);
double a = radLat1 - radLat2;
double b = radLng1 - radLng2;
double result = 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))) * EARTH_RADIUS;
return result;
}
/// <summary>
/// 經(jīng)緯度轉(zhuǎn)化成弧度
/// </summary>
/// <param name="d"></param>
/// <returns></returns>
private static double Rad(double d)
{
return (double)d * Math.PI / 180d;
}
通過(guò)Unity接入高德地圖的方法可以實(shí)時(shí)獲得設(shè)備當(dāng)前位置飒箭,以經(jīng)緯度顯示。然后通過(guò)高德地圖web api的逆地理編碼進(jìn)行坐標(biāo)轉(zhuǎn)換蜒灰,即可得到當(dāng)前位置信息弦蹂。
在高德開(kāi)放平臺(tái)查詢目的地坐標(biāo),或者可以直接用地理編碼獲取目的地的經(jīng)緯度坐標(biāo)强窖。
然后調(diào)用計(jì)算兩個(gè)經(jīng)緯度直接的距離的方法計(jì)算出當(dāng)前位置距離目標(biāo)點(diǎn)位置的距離
//計(jì)算當(dāng)前經(jīng)緯度與目標(biāo)經(jīng)緯度的距離
double distance = PublicFunction.GetDistance(當(dāng)前經(jīng)度, 當(dāng)前緯度, 目標(biāo)點(diǎn)經(jīng)度, 目標(biāo)點(diǎn)緯度);
//判斷距離
if (distance <= THE_TARGET_RADIUS)
{
Debug.Log("進(jìn)入目標(biāo)范圍凸椿!");
}
else
{
Debug.Log("距離目標(biāo)范圍:" + distance + "米");
}