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)

所以每当我运行这段代码时,它都会严重失败,让我发疯!

顺便说一句 - 我已使用以下 URL 作为参考

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

使用指南针指向实际坐标位置,而不仅仅是北

使用指南针指向位置

4

1 回答 1

1

据我所知,根据 Haversine 公式计算初始方位的公式是:

θ = 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);

所以y来之前x。也许这就是错误。
此外,请确保坐标增量(lat2-lat1 等)以弧度表示

于 2012-06-15T08:50:29.160 回答