Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 哪个iOS类/代码返回磁北?_Objective C_Ios_Magnetometer_Heading - Fatal编程技术网

Objective c 哪个iOS类/代码返回磁北?

Objective c 哪个iOS类/代码返回磁北?,objective-c,ios,magnetometer,heading,Objective C,Ios,Magnetometer,Heading,我想得到设备与磁北的偏差,以度为单位,并在我正在编写的一些代码中使用该值 我不想使用设备的定位服务,因此我不想得到真正的北方,而是磁北方(只使用设备的磁强计) 哪一类(或编码过程…)可以为我提供该值(仅依靠磁强计) CLLocationManager类及其属性依赖于启用/可用的位置服务 其中,作为核心运动框架的CMMagnetometerData类为我们提供了以下属性: @property(readonly, nonatomic) CMMagneticField magneticField A

我想得到设备与磁北的偏差,以度为单位,并在我正在编写的一些代码中使用该值

我不想使用设备的定位服务,因此我不想得到真正的北方,而是磁北方(只使用设备的磁强计)

哪一类(或编码过程…)可以为我提供该值(仅依靠磁强计)

CLLocationManager类及其属性依赖于启用/可用的位置服务

其中,作为核心运动框架的CMMagnetometerData类为我们提供了以下属性:

@property(readonly, nonatomic) CMMagneticField magneticField

A structure containing 3-axis magnetometer data

typedef struct {
   double x;
   double y;
   double z;
} CMMagneticField;
我如何从中获得学位?或者是否有其他方法(类别/属性/方法)可以单独从磁强计中获取度数

提前感谢您向任何人提供有关该问题的有用信息!:)

表示CMMagneticField数据为原始数据,这意味着它包括从设备本身及其周围引入的偏差。提供过滤后的相同磁场值

要确定磁北,你应该使用过滤后的值,并且设备应该与地球表面平齐

知道磁场的x和y值后,可以使用以下公式计算角度(从磁北的偏角,单位为度):


你需要融合传感器来模拟苹果的应用程序。他们使用陀螺仪加速计和磁强计,以及先进的数学,你可能会也可能没有学会产生这样干净的结果。祝你好运你可能无法模仿它们。

如果我想得到磁北极,不管我如何拿着设备,该怎么办?e、 g.无论我如何拿着iPhone 4S,iPhone 4S上的数字指南针都会返回磁北(位置服务已禁用)。我怎么能做到呢?你建议的公式是无效的目标CTo要获得磁北,无论你如何握住设备,我想你应该使用CMDeviceMotion的过滤磁值,而不是CMMagnetometerData的未过滤值。这种措辞似乎使您可以仅使用x和y变量计算磁偏角。这是不可能的。计算赤纬时需要经度、纬度、海拔和时间。如这段Android源代码所示,计算它。你读过这个问题了吗?请仔细核对作者的要求。
if (y>0): heading = 90.0 - [arcTan(x/y)]*180/π
if (y<0): heading = 270.0 - [arcTAN(x/y)]*180/π
if (y=0, x<0): heading = 180.0
if (y=0, x>0): heading = 0.0
 double heading = 0.0;
 double x = magnetometerData.magneticField.x;
 double y = magnetometerData.magneticField.y;
 double z = magnetometerData.magneticField.z;

 if (y > 0) heading = 90.0 - atan(x/y)*180.0/M_PI;
 if (y < 0) heading = 270.0 - atan(x/y)*180.0/M_PI;
 if (y == 0 && x < 0) heading = 180.0;
 if (y == 0 && x > 0) heading = 0.0;