【问题标题】:Convert user entered true azimuth to magnetic azimuth将用户输入的真实方位角转换为磁方位角
【发布时间】:2013-11-28 08:11:36
【问题描述】:

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

在具有大量 SO 示例的正常情况下,我们可以使用 didUpdateHeading:(CLocation) newHeadingnewHeading.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

【问题讨论】:

    标签: ios compass-geolocation heading


    【解决方案1】:

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

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

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

    【讨论】:

    • 请记住,第一段谈到使用“用户输入的位置”,而不是当前位置。
    • 它说“用户输入的值”——我假设它是磁航向的值。如果 OP 想对任意(输入)位置进行计算,那么这种方法当然没有任何用处。
    • @rokjarc 感谢您的回答,但正如 rmaddy 所说,我要求用户输入值,例如 TRUE 航向的键入值,我想将其转换为磁航向。跨度>
    • 所以您希望用户输入位置(坐标)和航向?
    • @rokjarc 但我想我可以使用您输入的内容来得出偏角...。然后将该偏角应用于用户输入的 TRUE 航向/方位角并执行 + /- 在它上面获取磁航向/方位角...让我今晚试试,然后我会标记这是否是一个答案...再次感谢!
    【解决方案2】:

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

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

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

    【讨论】:

    • 我也许可以使用上面 rokjarc 答案中计算的变化来添加它或从用户输入的 TRUE 值中减去它以将其转换为磁性......你不觉得吗?
    【解决方案3】:

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

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

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

    【讨论】:

    • 感谢您提供额外信息。苹果提供的网址似乎已经过时了。我最终使用了 rokjarc 的建议,尽管有一个库/代码来确定世界上任何位置的偏差会很好。我以后可能会重新讨论这个话题......
    【解决方案4】:

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

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

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

    【讨论】:

    • 你的代码对我很有用,谢谢!我还需要计算磁偏角,因为我的应用是垂直站立使用的,而 CLLocationManager.headingOrientation 的面朝上选项似乎无效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多