IOS(oc)通過(guò)經(jīng)緯度計(jì)算angle和距離

作者網(wǎng)站:http://www.cqbanxi.com

闡述一下:大家都知道嘀打車這款A(yù)PP,車輛在地圖上跑 ,包括車輛的轉(zhuǎn)彎角度等..
今天我給大家分享的就是通過(guò)百度地圖怎么實(shí)現(xiàn)歷史軌跡運(yùn)動(dòng)的兩個(gè)經(jīng)緯度計(jì)算角度和距離。
先看一下路線繪制原理圖:
ABCDEF 都是經(jīng)緯度點(diǎn)。 通過(guò)OC的直線繪制把這些點(diǎn)連接到一起 就形成了路線。
至于怎么去繪制直線連接到 我這里就不去寫(xiě)代碼。大家都知道。

1263A85DBC13E89BF95E5F7C37DA927B.jpg

進(jìn)入主題吧:先來(lái)計(jì)算2個(gè)經(jīng)緯度直接的距離。也就是A點(diǎn)到B點(diǎn)的距離。話多一句:M_PI是圓周率 我還P話一句 類型最好用double類型!為什么呢?我想大家都知道

'''
//根據(jù)角度計(jì)算弧度
-(double)radian:(double)d{

return d * M_PI/180.0;

}
'
//根據(jù)弧度計(jì)算角度
-(double)angle:(double)r{

return r * 180/M_PI;

}
//根據(jù)兩點(diǎn)經(jīng)緯度計(jì)算兩點(diǎn)距離
-(double)getDistanceLat1:(double)lat1 whitLng1:(double)lng1 whitLat2:(double)lat2 whitLng2:(double)lng2{

double EARTH_RADIUS = 6378137;//地球半徑  人類規(guī)定(單位: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里面實(shí)現(xiàn)的算法
s = s * EARTH_RADIUS;

return s;

}
'''

得到了A點(diǎn)B點(diǎn)的距離 我就可以定義一個(gè)時(shí)間,然后計(jì)算出速度出來(lái)。這里還有一個(gè)重點(diǎn) 百度地圖工具類API中也有計(jì)算距離的:

'''

        BMKMapPoint point2 = BMKMapPointForCoordinate(CLLocationCoordinate2DMake([gpsLatitude2 floatValue],[gpsLongitude2 floatValue]));
    BMKMapPoint point1 = BMKMapPointForCoordinate(CLLocationCoordinate2DMake([gpsLatitude floatValue],[gpsLongitude floatValue]));
        CLLocationDistance distance = BMKMetersBetweenMapPoints(point1,point2);

'''

好了!距離就這么完了。

角度計(jì)算angle

這里我舉例C點(diǎn)和D點(diǎn) 的計(jì)算吧! 大家想想 當(dāng)車子運(yùn)動(dòng)到了C點(diǎn)!車子的頭部是不是要?jiǎng)右幌履??把車子的頭部旋轉(zhuǎn)到D點(diǎn)方向。對(duì)吧。
那么我們?cè)趺从?jì)算旋轉(zhuǎn)的角度呢?
上一個(gè)圖吧:

6A65DD2139FBE3C90D1D1257244C8BD3.jpg

懂了嗎?在P話哈!車子從A點(diǎn)到B點(diǎn)到C點(diǎn)都是直線。當(dāng)?shù)搅薈點(diǎn)的時(shí)候車子的頭部還是直線上的一個(gè)方向的。來(lái) 大家空間也可以想象一下。當(dāng)你開(kāi)車的時(shí)候到了轉(zhuǎn)彎處 是不是要轉(zhuǎn)彎呀! 不轉(zhuǎn)彎就要呵呵了。
那么在圖形上大家看到了什么?是不是C點(diǎn)W點(diǎn)D點(diǎn)(或者正方向),這些點(diǎn)連接起來(lái)是不是就成 了三角形了呢?W-D做垂直輔助線。從而就看的出角度C1了。角度C1就是我們車子旋轉(zhuǎn)的角度了
旋轉(zhuǎn)函數(shù):sportAnnotationView.imageViews.transform = CGAffineTransformMakeRotation( 這個(gè)值就是我們要計(jì)算的角度了);

上代碼:

'''

//計(jì)算方位角
-(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;

}
'''

我們得到了角度:但是這個(gè)角度不能直接使用為什么?
這個(gè)要看你的車子切圖正方向是怎么樣子的
比如我的車子方向是:


cx_gz1@2x.png

這樣子就是車子頭部在底部。
那么我的值就是:-(2個(gè)經(jīng)緯度計(jì)算的角度*圓周率/180) 是負(fù)數(shù)的。懂了嗎?初中數(shù)學(xué)老師坑你們沒(méi)有。

OK!了 你們?cè)诮尤氚俣鹊貓D中的歷史運(yùn)行軌跡的Demo 即可!

總結(jié)下:我分享這個(gè)是因?yàn)榘俣鹊貓DIOS SDK 中的DEMO 有一個(gè)歷史運(yùn)行軌跡的案例。但是案例中的運(yùn)行軌跡數(shù)據(jù)是JSON死的數(shù)據(jù)! 特別是angle 角度和距離這個(gè)2個(gè)參數(shù)也是給的演示死數(shù)據(jù)!

那么以上分享可以達(dá)到 服務(wù)器返回經(jīng)緯度數(shù)據(jù)集合,就是可以自動(dòng)算出角度和距離了!

主要是因?yàn)锳ndroid 的DEMO 是動(dòng)態(tài)計(jì)算了的! 我在網(wǎng)上也發(fā)了帖子也沒(méi)有人回應(yīng)我! 百度的技術(shù)支持 忙的一天都在排隊(duì)。一氣之下。我忍了!通過(guò)一個(gè)朋友點(diǎn)亮了我的激情! 我自己寫(xiě)了!
謝謝大家! 如果在大家在做類似的項(xiàng)目的時(shí)候! 就可以有很明確的思路了!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容