将用户输入的真方位角转换为磁方位角

时间:2013-11-15 02:38:04

标签: ios compass-geolocation heading

我想知道是否有办法使用CLHeadingCLLocationDirection在USER输入值的真方位角和磁方位角之间进行转换。

在SO上有大量示例的正常情况下,我们可以使用didUpdateHeading:(CLocation) newHeadingnewHeading.magneticHeadingtrueHeading来获取这些值,当我们需要设备方位/标题时。 trueHeadingmagneticHeading都是只读属性。 然而,我需要提供一个用户输入真正的方位角CLocation或其他东西,并返回对应于输入的磁性值。

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

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

我测试了DC区域的偏角并且它正确地返回-10.7度,并且在下面的@rokjarc的答案中使用了简单的函数。有关美国赤纬的参考,请参阅以下地图(图像来源 - NOAA): enter image description here

稍后我将在德克萨斯州休斯顿的一个朋友的设备上部署这个设备,其中偏差为2度以进一步确认。

对于那些想知道,当你使用Apple的MapKit时,地图总是朝向,以便真正的北方位于地图的顶部 - 来源 - (http://developer.apple.com/library/ios/documentation/MapKit/Reference/MKMapView_Class/) 根据上述信息,如果相对于我想要实现的位置显示具有方位或方位角的POI,则应始终使用真实航向和非磁性......

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

4 个答案:

答案 0 :(得分:2)

最有可能的是,当您获得实时位置更新时,当您从指南针出来时,当您从一个点移动到另一个点时,真正的标题将来自GPS数据。这当然只能在用户的当前位置实时工作。

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

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

答案 1 :(得分:2)

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

在这种情况下,您可以指定名为variation的ivar(或属性),并在didUpdateHeading:中更新regulary。

//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进行用户输入的计算。

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

答案 2 :(得分:1)

如果您阅读了Apples iphone的许可证说明,您将获得他们在iphone中使用的所有开源列表。 (菜单通用 - >信息 - >版权 - >许可证) 其中之一是由NOAA开发的地磁地球模型。您也可以下载源代码并实现它: Geomag:https://www.ngdc.noaa.gov/WMM/

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

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

答案 3 :(得分:1)

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

以下是我的实施:https://github.com/kanchudeep/Geomagnetism-Swift

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