闡述一下:大家都知道嘀嘀打車這款APP,車輛在地圖上跑 ,包括車輛的轉彎角度等..
今天我給大家分享的就是通過百度地圖怎么實現歷史軌跡運動的兩個經緯度計算角度和距離。
先看一下路線繪制原理圖:
ABCDEF 都是經緯度點。 通過OC的直線繪制把這些點連接到一起 就形成了路線。
至于怎么去繪制直線連接到 我這里就不去寫代碼。大家都知道。
進入主題吧:先來計算2個經緯度直接的距離。也就是A點到B點的距離。話多一句:M_PI是圓周率 我還P話一句 類型最好用double類型!為什么呢?我想大家都知道
'''
//根據角度計算弧度
-(double)radian:(double)d{
return d * M_PI/180.0;
}
'
//根據弧度計算角度
-(double)angle:(double)r{
return r * 180/M_PI;
}
//根據兩點經緯度計算兩點距離
-(double)getDistanceLat1:(double)lat1 whitLng1:(double)lng1 whitLat2:(double)lat2 whitLng2:(double)lng2{
double EARTH_RADIUS = 6378137;//地球半徑 人類規定(單位:m)
double radLat1 = [self red:lat1];
double radLat2 = [self red:lat2];
double radLng1 = [self red:lng1];
double radLng2 = [self red:lng2];
double a = radLat1 - radLat2;
double b = radLng1 - radLng2;
double s = 2 * asin(sqrt(pow(sin(a/2),2) + cos(radLat1)*cos(radLat2)*pow(sin(b/2),2)));//google maps里面實現的算法
s = s * EARTH_RADIUS;
return s;
}
'''
得到了A點B點的距離 我就可以定義一個時間,然后計算出速度出來。這里還有一個重點 百度地圖工具類API中也有計算距離的:
'''
BMKMapPoint point2 = BMKMapPointForCoordinate(CLLocationCoordinate2DMake([gpsLatitude2 floatValue],[gpsLongitude2 floatValue]));
BMKMapPoint point1 = BMKMapPointForCoordinate(CLLocationCoordinate2DMake([gpsLatitude floatValue],[gpsLongitude floatValue]));
CLLocationDistance distance = BMKMetersBetweenMapPoints(point1,point2);
'''
好了!距離就這么完了。
角度計算angle
這里我舉例C點和D點 的計算吧! 大家想想 當車子運動到了C點!車子的頭部是不是要動一下呢?把車子的頭部旋轉到D點方向。對吧。
那么我們怎么計算旋轉的角度呢?
上一個圖吧:
懂了嗎?在P話哈!車子從A點到B點到C點都是直線。當到了C點的時候車子的頭部還是直線上的一個方向的。來 大家空間也可以想象一下。當你開車的時候到了轉彎處 是不是要轉彎呀! 不轉彎就要呵呵了。
那么在圖形上大家看到了什么?是不是C點W點D點(或者正方向),這些點連接起來是不是就成 了三角形了呢?W-D做垂直輔助線。從而就看的出角度C1了。角度C1就是我們車子旋轉的角度了
旋轉函數:sportAnnotationView.imageViews.transform = CGAffineTransformMakeRotation( 這個值就是我們要計算的角度了);
上代碼:
'''
//計算方位角
-(double)getBearingWithLat1:(double)lat1 whitLng1:(double)lng1 whitLat2:(double)lat2 whitLng2:(double)lng2{
double d = 0;
double radLat1 = [self red:lat1];
double radLat2 = [self red:lat2];
double radLng1 = [self red:lng1];
double radLng2 = [self red:lng2];
d = sin(radLat1)*sin(radLat2)+cos(radLat1)*cos(radLat2)*cos(radLng2-radLng1);
d = sqrt(1-d*d);
d = cos(radLat2)*sin(radLng2-radLng1)/d;
d = [self angle:asin(d)];
return d;
}
'''
我們得到了角度:但是這個角度不能直接使用為什么?
這個要看你的車子切圖正方向是怎么樣子的
比如我的車子方向是:
這樣子就是車子頭部在底部。
那么我的值就是:-(2個經緯度計算的角度*圓周率/180) 是負數的。懂了嗎?初中數學老師坑你們沒有。
OK!了 你們在接入百度地圖中的歷史運行軌跡的Demo 即可!
總結下:我分享這個是因為百度地圖IOS SDK 中的DEMO 有一個歷史運行軌跡的案例。但是案例中的運行軌跡數據是JSON死的數據! 特別是angle 角度和距離這個2個參數也是給的演示死數據!
那么以上分享可以達到 服務器返回經緯度數據集合,就是可以自動算出角度和距離了!
主要是因為Android 的DEMO 是動態計算了的! 我在網上也發了帖子也沒有人回應我! 百度的技術支持 忙的一天都在排隊。一氣之下。我忍了!通過一個朋友點亮了我的激情! 我自己寫了!
謝謝大家! 如果在大家在做類似的項目的時候! 就可以有很明確的思路了!