iPhone/iPad中的指南针真实航向

iPhone/iPad中的指南针真实航向,iphone,ios,ipad,compass-geolocation,Iphone,Ios,Ipad,Compass Geolocation,我在iPhone/iPad compass开发方面遇到了一些问题 从CLHeading中获取的trueHeading总是给我'-1'值,我被困在这里。这是我的密码: self.locationManager = [[[CLLocationManager alloc] init] autorelease]; self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; self.locationManager.delegate =

我在iPhone/iPad compass开发方面遇到了一些问题

从CLHeading中获取的trueHeading总是给我'-1'值,我被困在这里。这是我的密码:

self.locationManager = [[[CLLocationManager alloc] init] autorelease];
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.delegate = self;
self.locationManager.headingFilter = 0.5; //1 degrees
[self.locationManager startUpdatingHeading];
我还发现了一件事,那就是当我在地图应用程序或指南针应用程序上使用了位置信息时,trueHeading值突然显示正确。我想知道原因是什么,知道吗?这在iPhone4和iPad上都会发生

每当我在设置中关闭位置服务并重新启用它时,也会发生这种情况,它将无法读取正确的trueHeading值,我想知道是因为我创建的应用程序无法启用位置服务吗

无论如何,先谢谢你

---我的解决方案---

请参见下文。

尝试使用此

    CLLocationManager *locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate=self;
    locationManager.desiredAccuracy=kCLLocationAccuracyBestForNavigation;
    // Start heading updates. 
    if (locationManager.headingAvailable && locationManager.locationServicesEnabled) 
    {
        locationManager.headingFilter = kCLHeadingFilterNone; 
        [locationManager startUpdatingHeading];
    }
完成此操作后,CLLocationManager将委托方法调用

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {

    // Use the true heading if it is valid. 
    [lblAccuracy setText:[NSString stringWithFormat:@"%.1fmi",newHeading.headingAccuracy]]; 
}
但这种编码在模拟器以外的设备上工作


快乐编码..

为了避免标题不断返回-1.000000,不仅要运行startUpdatingHeading,还要一起运行startUpdatingLocation,这很有帮助

我自己在使用位置管理器时遇到了一些问题,并发现在测试时将iPhone从电脑上拔下对我有帮助。不知何故,校准警报只有在拔下iPhone后才会弹出。

---我的解决方案---


我所做的是,将
[self.locationManager startUpdatingLocation]
添加到
[self.locationManager startUpdatingHeading]之前或之后(当位置服务关闭并从设置中重新启用时)。我不确定这是否是一个好的解决方案,但这就是我所做的工作,如果您有更好的解决方案,请与我们分享。

我也有同样的问题。我将startUpdatingHeading移到一个按钮操作中,然后将它移回CLLocationManager的分配位置——在那里它一直工作得很好——然后它开始只返回-1

我重新启动了我的iPad,它又开始工作了。希望它保持这种状态


编辑:不,不是这样的。我也必须使用startUpdatingLocation。这会不会磨损电池呢?我将desiredAccuracy设置为KCllocation Accuracy Threekm,因为我没有使用位置数据。

真正的读数需要知道使用指南针的位置的磁场变化。从前面的讨论中,似乎从磁方向校正真实方向的功能需要您的位置来获得变化值。如果您不喜欢在代码中使用位置GPS信息,我建议您读取磁性读数并自行更正该值。您需要首先获得所需位置的变化,然后应用以下公式:T=M±V,其中T是真实方向,M是指南针磁读数,V是变化。东用“+”,西用“-”。我发现允许网站为任何需要的位置提供变化(磁偏角):.

当位置服务关闭时,
didUpdateHeading委托方法
只返回磁头。你可以根据需要使用它。根据苹果公司的文件

要开始传递标题相关事件,请向 location manager对象并调用其startUpdatingHeading方法。 如果还启用了位置更新,则位置管理器将返回 真航向和磁航向值。如果位置更新 如果未启用,则位置管理器仅返回磁性 标题值


现在正在解决这个问题。当我使用SpriteKit时,我可以从Core Motion获得更新。它是指能够连续调用函数,比如每帧调用一次(1/60秒)或每隔几帧调用一次。在不使用SpriteKit的情况下,文档中说在闭包中调用更新,我假设这些更新将在它们自己的线程中,由您来发布


有一种算法可以将磁强计读数转换为相对于正北的实际度数。想象一幅图,它看起来像交流电的时域函数,你会发现插值数据是应用麦克斯韦方程组的一个简单问题

你是在有指南针的设备上(如iPhone 4)进行此操作的吗?如果你检查[CLLocationManager headingAvailable],它会返回什么?仍然不能,我怀疑我当前使用的应用程序无法从设备本身读取位置服务,因为每当我关闭并重新启用位置服务时,trueHeading的读数将变为-1,但如果我使用其他应用程序(地图、指南针),它将能够正确显示trueHeading“headingAvailable”已弃用:iOS 4.0中第一个弃用的“locationServicesEnabled”已弃用:iOS 4.0中第一个弃用的好,这基本上是@kitda工作室所说的……霍尼韦尔的论文详细介绍了如何使用磁强计计算磁北。它只是顺便提到,要获得真正的北方,你必须加上当地的赤纬。这是一个粗略的草图,显示了北美地区的局部磁偏角,但没有算法或精细的详细数值。你是说两者都调用吗?