3

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

在有大量关于 SO 示例的正常情况下,当我们需要设备方位/航向时,我们可以使用didUpdateHeading:(CLocation) newHeadingwithnewHeading.magneticHeadingtrueHeading获取这些值。两者trueHeadingmagneticHeading都是只读属性。但是,我需要为用户提供输入的真实方位角CLocation或其他内容,并返回与输入相对应的磁值。

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

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

我测试了 DC 区域的偏角,它正确地返回了 -10.7 度,并在下面显示了@rokjarc 的答案中的简单函数。有关美国偏角的参考,请参阅以下地图(图片来源 - NOAA): 在此处输入图像描述

稍后我将在德克萨斯州休斯顿地区的朋友的设备上部署它,该地区的磁偏角为 2 度以进一步确认。

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

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

4

4 回答 4

2

最有可能的是,当您获得实时位置更新时,当您从一个点移动到另一个点时,真正的航向来自 GPS 数据,而磁航向来自罗盘。当然,这只适用于用户当前的位置。

Core Location 框架没有 API 可以为您提供任意位置的磁变化。您上一段中描述的解决方案是您唯一可行的解​​决方案。

请记住,由于您已经提到的原因,不可能有内置模型 - 它会发生变化。

于 2013-11-15T04:12:44.257 回答
2

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

在这种情况下,您可以分配一个名为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用于用户输入的计算。

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

于 2013-11-15T05:13:03.037 回答
1

如果您阅读 Apple iphone 的许可说明,您会得到一份他们在 iphone 中使用的所有开源的列表。(Menu Common->Info->Copyright->License) 其中之一是由 NOAA 开发的地磁地球模型。您也可以下载源代码并实现它:Geomag:https ://www.ngdc.noaa.gov/WMM/

这样做的好处是您可以计算世界上任何坐标的磁变化,而不仅仅是当前坐标。对于大多数地方,每年方位角的相对变化是已​​知和指定的,就像在更好的地形图中一样。然后,您可以在知道地磁模型的日期后推断出当前时间。

然而,在大多数情况下,知道当前位置的磁变化就足够了。在这种情况下,可以从 CLLocation 读取它(如用户 rokjarc 所述)

于 2013-11-28T17:34:08.703 回答
1

我需要一个解决方案来根据世界磁模型在 Swift 中的指定位置找到磁偏角。

这是我的实现:https ://github.com/kanchudeep/Geomagnetism-Swift

这是一个简单的单一类,可以放入任何项目并使用。

于 2017-12-11T09:42:40.617 回答