如何将指南针指向目的地?

时间:2012-06-15 07:56:24

标签: iphone objective-c xcode gps cllocation

我正在创建一个应用程序,它将指向我绘制的GPS坐标方向的简单箭头。所以我说的是当前位置lat和long,所以lat1,lon1是当前位置......然后将它们与lat和long的静态坐标(称为lat2,lon2)进行比较。

我花了HOURS进行研究和测试,但我继续遇到同样的问题。这非常令人沮丧。当我开始向目的地开车时,使用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)

因此,每当我运行此代码时,它都会失败,并让我疯狂!

BTW - 我使用了以下网址作为参考

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 个答案:

答案 0 :(得分:1)

据我所知,根据Haversine公式的初始轴承公式为:

  

θ= atan2(sin(Δlong).cos(lat2),   cos(lat1).sin(lat2) - sin(lat1).cos(lat2).cos(Δlong))

这似乎正是你所使用的。根据{{​​1}}条目,您可能必须使用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); 出现在y之前。也许这就是错误 另外,请确保坐标增量(lat2-lat1等)位于弧度中。