我想知道是否有一种方法可以使用 CLHeadingCLLocationDirection 在用户输入的值的真实方位角和磁方位角之间进行转换。

在具有大量 SO 示例的正常场景中,我们可以使用 didUpdateHeading:(CLocation) newHeadingnewHeading.magneticHeadingtrueHeading 来获取设备方位/航向时的这些值。 trueHeadingmagneticHeading 都是只读属性。
然而,我需要的是为用户提供输入到 CLocation 或其他东西的真实方位角,并返回与输入相对应的磁值。

一种方法是从 NOAA(或其他来源)获取更新的地球磁场模型,并编写代码以根据用户位置进行此计算。然而,这有许多缺点,并且由于模型一直在变化,因此需要不断更新应用程序代码中的模型数组。使用任何内置模型都会很棒......

更新(了解磁偏角的更多信息):

我测试了 DC 区域的偏角,它使用下面显示的 @rokjarc 答案中的简单函数正确返回了 -10.7 度。有关美国赤纬的引用,请参阅以下 map (图片来源 - NOAA):

稍后我将在德克萨斯州休斯顿的一个 friend 的设备上部署它,那里的磁偏角为 2 度,以进一步确认。

对于那些想知道,当您使用 Apple 的 MapKit 时, map 始终是定向的,因此真正的北方位于 map 的顶部——来源——
( http://developer.apple.com/library/ios/documentation/MapKit/Reference/MKMapView_Class/ )
根据上述信息,如果显示具有相对于我试图实现的位置的方位角或方位角的 POI,则应始终使用真实航向而不是磁性...

注意: 赤纬一直在变化(您可能听说过极移)。例如,如果您在 2016 年对此进行测试,则 DC 的偏角可能为 -5 或 -20 等,而不是当前的 -10。使用此方法计算磁偏角时,您不必担心磁偏角随时间的变化,因为指南针(我相信)会感应地球磁场并返回正确的 heading.magneticHeading

最佳答案

从您问题的最后一段来看,您似乎对将用户的 当前位置 上的任意磁航向转换为真实航向感兴趣。

在这种情况下,您可以分配一个名为 variation 的 ivar(或属性)并定期更新 didUpdateHeading:

//instantiated as ivars or properties:

NSDate *variationTimestamp;
double variation; //or CLLocationDirection
CLLocationManager *locationManager;

-(void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
{
    CLLocation *location = locationManager.location;

    //check if location is valid - it has to be for variation data to be valid too

    if ((newHeading.headingAccuracy > 0) && (location.horizontalAccuracy > 0))
    {
        variation = newHeading.trueHeading - newHeading.magneticHeading;
        variationTimestamp = newHeading.timestamp;
    }
}

由于 f(location) 的磁变化 - 对于同一位置上的所有磁航向都是相同的 - 您可以使用此 variation 进行用户输入的计算。

明显的缺点是您必须拥有新的位置/标题数据。注意:除了启用航向更新外,您还必须启用 位置更新

关于ios - 将用户输入的真实方位角转换为磁方位角,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19992527/

10-11 00:13