2012-06-15 75 views
3

我正在創建一個應用程序,該應用程序將指向我繪製出的GPS座標方向上的簡單箭頭。所以我說的是我現在的位置lat和long,所以lat1,lon1是當前位置...然後將它們與lat和long的靜態座標進行比較,稱爲lat2,lon2。如何在我的目的地指向指南針?

我花了小時研究和測試,但我一直在得到同樣的問題。這非常嚴重。只要我開始朝目的地方向行駛,當使用iPhone內置的GPS /指南針時,箭頭就會全部失控。它有時會顯示箭頭完全相反的一面,掛在右邊......幾乎沒有什麼是堅實的。

這裏是我運行

cpLocLat = 43.026629當前代碼;

cpLocLon = -78.867188;

這些是浮點值和我想要開車的座標。

float lat1 = self.locManager.location.coordinate.latitude; 
float lat2 = cpLocLat; 
float lon1 = self.locManager.location.coordinate.longitude; 
float lon2 = cpLocLon; 

float heading = atan2(sin(lon2 - lon1) * cos(lat2), cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(lon2 - lon1)); 

heading = RADIANS_TO_DEGREES(heading); 

if (heading < 0) { 
    heading = heading + 360; 
} 

我每次調用locationManager didUpdateToLocation delagate時都會使用這個函數。一旦我有這些信息,它在的LocationManager didUpdateHeading delagte用於下列要求:

CGAffineTransform where = CGAffineTransformMakeRotation(degreesToRadians((degrees - newHeading.magneticHeading))); 

[self.compassContainer2 setTransform:where]; 

這裏是degressToRadians宏觀

#define degreesToRadians(x) (M_PI * x/180.0) 

所以每當我運行這段代碼是epically失敗,是讓我瘋狂!

順便說一句 - 我已經使用以下網址參考

http://www.shawngrimes.me/2011/07/calculating-heading-with-corelocation/

Using Compass to point to actual coordinate location instead of just North

Point to location using compass

+1

你確定標題計算三角公式是正確的嗎? – 2012-06-15 08:03:46

+1

我已經嘗試了其他幾個公式,包括我發佈的鏈接..所有導致類似的效果。 –

+0

請確保你沒有打電話給無效位置(準確率爲負) – jrturton

回答

1

據我所知,下式用於根據所述半正矢公式是初始軸承:

θ= ATAN2(SIN(Δlong)名爲.cos(LAT2), COS(LAT1).sin(LAT2) - SIN(LAT1)名爲.cos(LAT2)名爲.cos(Δlong))

這似乎正是你所使用的。按照man項,您可能需要使用兩個參數的相反順序atan2

ATAN2(3)     BSD Library Functions Manual     ATAN2(3) 

NAME 
    atan2 -- arc tangent function of two variables 

SYNOPSIS 
    .... 
    float 
    atan2f(float y, float x); 

所以yx之前。也許這是錯誤。
此外,請確保座標增量(lat2-lat1等)在弧度

+0

我現在就給這個鏡頭。 –

+0

是的,這似乎完成了工作!只需要進行一些校準即可完成。謝謝。 –

+0

給我你的貝寶和病給你買咖啡:) –