我想知道是否有办法使用CLHeading
或CLLocationDirection
在USER输入值的真方位角和磁方位角之间进行转换。
在SO上有大量示例的正常情况下,我们可以使用didUpdateHeading:(CLocation) newHeading
与newHeading.magneticHeading
或trueHeading
来获取这些值,当我们需要设备方位/标题时。 trueHeading
和magneticHeading
都是只读属性。
然而,我需要提供一个用户输入真正的方位角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
答案 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
它是一个简单的单个类,可以放入任何项目中使用。