我正在创建一个应用程序,它将指向我绘制的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
答案 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等)位于弧度中。