在 iPhone 的 GPS 上获取错误的位置
Posted
技术标签:
【中文标题】在 iPhone 的 GPS 上获取错误的位置【英文标题】:Getting wrong location on GPS in iPhone 【发布时间】:2014-07-12 18:47:55 【问题描述】:在 ios 中使用核心位置框架尝试了不同的方法,但没有通过 GPS 获得准确的位置。即使是苹果地图和谷歌地图也没有指向正确的位置。查看我正在使用的代码 sn-p:
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);
【问题讨论】:
如果 Apple Maps 和 Google Maps 都显示错误的位置,那么我猜您的应用程序也会如此。但是,如果您想要超级精确,则不应使用 kCLLocationAccuracyNearestTenMeters。使用 kCLLocationAccuracyBest 或 kCLLocationAccuracyBestForNavigation,但它们会消耗更多电池。一般来说,GPS 足够准确,但不是很准确。 请在设备上测试 我也面临这个问题。我也尝试过使用 kCLLocationAccuracyBestForNavigation 但没有成功。我已经在多台设备上进行了测试,有时它会得到准确的结果,但大多不准确。 查看我在本帖其他地方的回复。在过去的几天里,我刚刚遇到了这个问题。不是你。是设备。 嗨@Brave Heart 你解决了这个问题吗?我面临同样的问题。但我无法修复它。如果你解决了这个问题,你能帮我吗?提前谢谢。 【参考方案1】:正如 krzy 所说,如果 Apple Maps 提供相同类型的结果,那么您正在处理手机上 GPS 的限制。 (这不是很好。)
您可以做几件事来获得更好的结果:
当您第一次向位置管理器询问位置更新时,您获得的第一个更新通常是 GPS 上次激活时的“陈旧”读数。它可以是数小时、数天或数周。检查时间戳并丢弃超过几秒的读数。
接下来,检查所获得读数的水平精度。 “准确性”最好命名为“斜率”或“混乱圈”。您的实际位置可以在具有该半径的圆圈中的任何位置。高“准确度”读数意味着读数不是很准确。您可能希望丢弃精度读数 > 100 米的读数。
【讨论】:
不是,不是。你为什么不试着弄清楚我描述的是什么?这是非常简单的事情。 为简单的建议提供代码可能会适得其反,因为读者只是复制和粘贴代码,而不是学习 API 足以自己编写代码。 是的,用户有时只是复制和粘贴代码,而不是尝试学习 API。【参考方案2】:如果你的“curLocation”是 CLLocation 的一个实例,你应该这样初始化它
curLocation = [[CLLocation alloc] initWithLatitude:yourLatitude longitude:yourLongitude];
而不是 CGPointMake
【讨论】:
【参考方案3】:我只是在 iOS 8 和 iPhone 6 下遇到了这个问题,但在 iOS 7 和 iOS 6 下的其他设备上,报告位置没有问题。
它最终不是我的代码,buuut……
Apple 地图突然认为我的设备在 200 英里外的纽约市。一直以来,我都认为问题出在 iOS 8 上,但由于某种原因,定位服务和/或隐私设置或底层硬件将设备置于纽约市。
我们在设备上重置了定位服务和隐私,几分钟后,CoreLocation 开始正确返回设备的正确 GPS 坐标并定期更新。
啊哈!! 在应用程序的方案中,我已将核心位置设置为模拟位置,并选择 NYC 作为在模拟器和设备上运行应用程序的方案。当仅在设备上运行一次且仍在后台时,这会将所有使用定位服务和地理围栏区域监控的应用程序的位置设置为纽约市。
【讨论】:
【参考方案4】:首先,您使用的方法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;
【讨论】:
【参考方案5】:试试这个:
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[locationManager startUpdatingLocation]
【讨论】:
以上是关于在 iPhone 的 GPS 上获取错误的位置的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iPhone 图片库中获取图像的嵌入式 GPS 和地理位置数据