iPhone / iPad中的指南针真实标题

时间:2011-09-12 05:19:22

标签: iphone ios ipad compass-geolocation

我在iPhone / iPad指南针开发方面遇到了一些问题。

从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值,我想知道因为我创建的应用程序无法启用位置服务?

无论如何,提前谢谢

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

见下文。

8 个答案:

答案 0 :(得分:7)

要避免标题保持返回-1.000000,不要只是运行startUpdatingHeading而是一起运行startUpdatingLocation,这会有所帮助。

答案 1 :(得分:4)

尝试使用此...

    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]]; 
}

但是这种编码适用于不在模拟器中的设备......

快乐编码..

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

我自己的位置管理员遇到了一些麻烦,发现对我来说,测试时有助于将iPhone从电脑上拔下来。不知何故,只有在拔下iPhone后才会弹出校准警报。

答案 4 :(得分:0)

我有同样的问题。我将startUpdatingHeading移动到一个按钮操作,然后将其移回到分配CLLocationManager的位置 - 它一直正常工作 - 它开始只返回-1。

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

编辑:不,它不会那样。我也必须使用startUpdatingLocation。这会不会耗尽电池吗?我将desiredAccuracy设置为kCLLocationAccuracyThreeKilometers,因为我还没有使用位置数据。

答案 5 :(得分:0)

真实读数需要知道您使用指南针的地方的磁性变化。从前面的讨论来看,似乎是从磁方向校正真实方向的函数需要您的位置来获得变化值。如果您不想在代码中使用位置GPS信息,我建议您阅读磁读数并自行更正值。您需要首先获得所需位置的变化,然后应用以下公式:T = M±V,其中T是真实方向,M是罗盘磁读数,V是变化。使用“+”表示东方,“ - ”表示西方。我发现允许的网站为任何需要的位置提供变化(磁偏角):http://www.geomag.nrcan.gc.ca/calc/mdcal-eng.php

答案 6 :(得分:0)

当位置服务关闭时,didUpdateHeading delegate method仅返回磁性航向。您可以根据自己的需要使用它。根据Apple文档..

  

要开始传送与标题相关的事件,请指定一个委托   位置管理器对象并调用其startUpdatingHeading方法。   如果还启用了位置更新,则位置管理器将返回   真实航向和磁航向值。如果位置更新   未启用,位置管理器仅返回磁性   标题值。

答案 7 :(得分:0)

立即解决此问题。当我使用SpriteKit时,我可以从Core Motion获得更新。它是关于能够像一帧(1/60秒)或每几帧一样连续调用一个函数。在不使用SpriteKit的情况下,文档说要在闭包中调用更新,我假设它将在他们自己的线程上并由你来释放。

有一种算法可将磁力计读数转换为相对于真北的实际度数。想象一下看起来像交流电的时域函数的图表,你会发现插值数据是应用麦克斯韦方程式的一个简单问题。 Here's an example on honeywell