在iPhone上GPS定位错误

3

在iOS中尝试使用核心定位框架以获取精确的GPS位置,但是一直无法获得准确的位置信息。即使使用苹果地图和谷歌地图也无法指向正确的位置。以下是我正在使用的代码片段:

MyLocation类头文件

#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>

@interface MyLocation : NSObject<CLLocationManagerDelegate> {
CLLocationManager *locationManager;
}

MyLocation类m文件

  #import "MyLocation.h"
    #import <CoreTelephony/CTCarrier.h>
    #import <CoreTelephony/CTTelephonyNetworkInfo.h>

    @implementation MyLocation

    @synthesize curLocation;

    -(id)init{

    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
    locationManager.distanceFilter = 0;

    //locationManager.distanceFilter = kCLDistanceFilterNone;
    //locationManager.desiredAccuracy = kCLLocationAccuracyBest;

    [self updateLocation];

    curLocation = CGPointZero;
    return self;

    }

    -(void)updateLocation{

    [locationManager startUpdatingLocation];

    }

    - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {




    curLocation  = CGPointMake( newLocation.coordinate.latitude, newLocation.coordinate.longitude);

    }

如果苹果地图和谷歌地图都显示错误的位置,我猜你的应用程序也会有同样的问题。但是,如果你想要更精确的话,就不应该使用kCLLocationAccuracyNearestTenMeters。请使用kCLLocationAccuracyBest或kCLLocationAccuracyBestForNavigation,但这将消耗更多的电池。一般来说,GPS足够准确,但不是非常准确。 - krzyspmac
请在设备上进行测试 - Gajendra Rawat
我也遇到了这个问题。我尝试过使用kCLLocationAccuracyBestForNavigation,但没有成功。我在多台设备上进行了测试,有时可以得到准确的结果,但大多数情况下不准确。 - ShujatAli
请在本帖的其他地方查看我的回复。我在过去几天里遇到了这个问题。这不是你的问题,而是设备的问题。 - Alex Zavatone
嗨@Brave Heart,你解决了这个问题吗?我也遇到了同样的问题,但是我无法解决它。如果你已经解决了这个问题,能否帮助我一下?提前感谢你。 - Karthik Mandava
5个回答

3
如krzy所说,如果苹果地图给出相同类型的结果,那么你正在处理手机GPS的限制。(它并不太好。)
以下是可以采取的一些措施来获得更好的结果:
当您首次请求位置管理器进行位置更新时,您会得到通常来自上一次GPS活动的“陈旧”读数。它可能是几个小时、几天或几周前的读数。检查时间戳并丢弃超过几秒钟的读数。
接下来,检查您收到的读数的水平精度。“精度”最好被命名为“偏差”或“混乱圆”。您的实际位置可能在该半径的圆形内的任何位置。较高的“精度”读数意味着该读数不太准确。您可能希望丢弃具有大于100米的精度读数。

不是的,为什么不试着弄清楚我所描述的内容呢?这很简单。 - Duncan C
提供直接的代码建议可能会适得其反,因为读者只是复制和粘贴代码,而没有充分学习API以便自己编写代码。 - Duncan C
是的,有时候用户只是复制粘贴代码,而不是尝试学习API。 - Brave Heart

2
如果您的“curLocation”是CLLocation的实例,则应以此方式初始化
curLocation =  [[CLLocation alloc] initWithLatitude:yourLatitude longitude:yourLongitude];

而不是使用CGPointMake


2

首先,您正在使用的方法didUpdateToLocation:fromLocation:自iOS6以来已被弃用。相反,您应该使用下面显示的didUpdateLocations:方法。

其次,您不需要按照您所做的方式创建新的位置或坐标对象。

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
    CLLocation *newLocation = locations.lastObject;
    CLLocationCoordinate2D coordinate = newLocation.coordinate;
}

这个函数返回:
一个包含位置数据的CLLocation对象数组。该数组始终包含至少一个表示当前位置的对象。如果更新被延迟或者在交付之前有多个位置到达,则数组可能包含额外的条目。数组中的对象按照它们发生的顺序组织。因此,最新的位置更新位于数组末尾。(Apple文档)
关于精度,除了持续更新位置并希望未来更新的horizontalAccuracy属性改善之外,您没有太多可以做的来提高精度。设置最佳精度和无距离过滤器可能会有所帮助。
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.distanceFilter = kCLDistanceFilterNone;

2

我刚在iOS 8和iPhone 6上遇到了这个问题,但在其他设备上,如iOS 7和iOS 6,没有问题报告位置。

最终结果并不是我的代码有问题,而是......

苹果地图突然认为我的设备在纽约市200英里外。一直以来,我以为问题出在iOS 8上,但由于某种原因,位置服务和/或隐私设置或底层硬件将设备放在了纽约市。

我们重置了设备上的位置服务和隐私设置,在几分钟内,CoreLocation开始正确返回设备的GPS坐标并定期更新它。

原来如此! 在应用程序方案中,我已将核心位置设置为模拟位置,并选择了纽约市,用于在模拟器和设备上运行应用程序的方案。当在设备上运行一次并仍处于后台时,所有使用位置服务和地理围栏区域监视的应用程序都将其位置设置为纽约市。


1
尝试这个:

locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[locationManager startUpdatingLocation]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接