我想知道是否有一种方法可以使用 CLHeading
或 CLLocationDirection
在用户输入的值的真实方位角和磁方位角之间进行转换。
在具有大量 SO 示例的正常场景中,我们可以使用 didUpdateHeading:(CLocation) newHeading
和 newHeading.magneticHeading
或 trueHeading
来获取设备方位/航向时的这些值。 trueHeading
和 magneticHeading
都是只读属性。
然而,我需要的是为用户提供输入到 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/