如何計算iPhone地圖應用程序上兩個興趣點座標(興趣點)之間的角度度數?如何獲得兩個POI之間的角度?
回答
我猜你試着計算兩個興趣點(POI)的座標之間的度數。
計算一個great circle的弧線:
+(float) greatCircleFrom:(CLLocation*)first
to:(CLLocation*)second {
int radius = 6371; // 6371km is the radius of the earth
float dLat = second.coordinate.latitude-first.coordinate.latitude;
float dLon = second.coordinate.longitude-first.coordinate.longitude;
float a = pow(sin(dLat/2),2) + cos(first.coordinate.latitude)*cos(second.coordinate.latitude) * pow(sin(dLon/2),2);
float c = 2 * atan2(sqrt(a),sqrt(1-a));
float d = radius * c;
return d;
}
另一種選擇是假裝你是在直角座標系(速度較快,但並非沒有對長距離錯誤):
+(float)angleFromCoordinate:(CLLocationCoordinate2D)first
toCoordinate:(CLLocationCoordinate2D)second {
float deltaLongitude = second.longitude - first.longitude;
float deltaLatitude = second.latitude - first.latitude;
float angle = (M_PI * .5f) - atan(deltaLatitude/deltaLongitude);
if (deltaLongitude > 0) return angle;
else if (deltaLongitude < 0) return angle + M_PI;
else if (deltaLatitude < 0) return M_PI;
return 0.0f;
}
如果你想導致度數而不是弧度,您必須應用以下轉換:
#define RADIANS_TO_DEGREES(radians) ((radians) * 180.0/M_PI)
非常感謝Jano :) – 2011-05-27 14:14:48
輝煌的東西,謝謝! – 2013-04-29 09:13:02
GreatCircle不會將輸入轉換爲弧度 – gjpc 2015-07-16 16:21:29
您正在計算從一點到另一點的'方位'。有公式爲的一大堆,和許多其它地理數量像距離和跨軌跡誤差的,這個網頁上:
http://www.movable-type.co.uk/scripts/latlong.html
的公式的幾種格式,所以你可以很容易地轉換到任何您需要iPhone的語言。也有JavaScript計算器,所以你可以測試你的代碼獲得與他們相同的答案。
確實Jano的東西沒有在這裏工作,但您提到的網站確實幫了很大忙。但要小心:他們忘記提及在Javascript的軸承示例中lat/long必須是輻射格式。 – brainray 2014-02-11 11:05:35
如果其他解決方案不爲你工作嘗試:
- (int)getInitialBearingFrom:(CLLocation *)first
to:(CLLocation *)second
{
float lat1 = [self degreesToRad:first.coordinate.latitude];
float lat2 = [self degreesToRad:second.coordinate.latitude];
float lon1 = [self degreesToRad:first.coordinate.longitude];
float lon2 = [self degreesToRad:second.coordinate.longitude];
float dLon = lon2 - lon1;
float y = sin (dLon) * cos (lat2);
float x1 = cos (lat1) * sin (lat2);
float x2 = sin (lat1) * cos (lat2) * cos (dLon);
float x = x1 - x2;
float bearingRadRaw = atan2f (y, x);
float bearingDegRaw = bearingRadRaw * 180/M_PI;
int bearing = ((int) bearingDegRaw + 360) % 360; // +- 180 deg to 360 deg
return bearing;
}
對於最終軸承,簡單地採取從終點的初始軸承到開始點和反向它(使用θ=(θ+ 180 )%360)。
你需要這2名助手:
-(float)radToDegrees:(float)radians
{
return radians * 180/M_PI;
}
-(float)degreesToRad:(float)degrees
{
return degrees * M_PI /180;
}
是否將輸入轉換爲弧度 – gjpc 2015-07-16 16:23:03
- 1. 如何獲得兩個平面之間的正確角度?
- 2. 如何獲得兩個日期之間的時間跨度C
- 3. 獲得2分之間的角度
- 4. 獲取一個圓上的兩個向量之間的角度
- 5. 如何獲得2個其他角色之間的角色?
- 6. 如何獲得兩個特定時間段之間的時間
- 7. 如何根據緯度和經度獲得兩個地點之間的距離?
- 8. 如何計算兩個地理/ GPS座標之間的角度?
- 9. 如何計算兩個向量之間的角度?
- 10. 如何找到兩個向量之間的角度?
- 11. OpenCV - 如何檢測和測量兩個幀之間的角度?
- 12. 獲得兩個表之間的差異?
- 13. 圖的兩條邊之間的角度
- 14. 如何得出兩個經緯度點之間的線路?
- 15. 兩個2d向量之間的角度,兩種方法之間的差異?
- 16. 尋找兩點之間的角度
- 17. 如何獲得MALLET中兩個文檔之間的餘弦相似度?
- 18. 分裂兩個度數值之間的角度
- 19. 計算兩個緯度/經度點之間的夾角
- 20. Java:以度爲單位計算兩個點之間的角度
- 21. 如何獲得兩個範圍之間的隨機數?
- 22. 如何獲得兩個日期之間的所有產品?
- 23. 如何獲得兩個特定字符串之間的文本
- 24. 如何獲得兩個字母之間的字母序列
- 25. 我如何獲得兩個日期之間的日子?
- 26. 如何獲得兩個日期之間的星期差異
- 27. 如何獲得java中兩個zip文件之間的差異
- 28. 如何獲得兩個日期之間的差異?
- 29. 如何獲得兩個數據表之間的差異
- 30. 如何獲得兩個日期之間的日期?
什麼是POI,什麼是 「iPhone應用放」? – 2011-05-26 14:19:17
@Radek S:@Jano更新了原始問題 – 2011-05-26 14:59:38