我有一个应用程序,用户在慢跑或骑自行车时跟踪他/她的路线,所以我需要完美的位置,所以用户的路线将是完美的。
但是,我有一个问题,
locManager = [[CLLocationManager alloc] init];
[locManager setDesiredAccuracy:kCLLocationAccuracyBestForNavigation];
[locManager setDelegate:self];
[locManager startUpdatingLocation];
在viewDidLoad中。使用这个多次调用的didUpdateToLocation方法,当我只是移动设备一点点并在地图上非常奇怪的路线绘制。
我无法理解为什么会发生这种情况,如果我做错了什么或遗失了什么。
感谢.......
答案 0 :(得分:15)
我使用locationManager.distanceFilter = 500; (左右)//米 防止多次通话发生。只需记住在开始更新位置之前调用此信息
答案 1 :(得分:2)
当您第一次启动位置服务时,无论您是否移动,通常都会看到多个位置更新。如果您检查位置的horizontalAccuracy
,您会看到它在“变暖”时会显示一系列具有越来越高精度的位置(即越来越小horizontalAccuracy
值)直到它达到静止状态。
在horizontalAccuracy
低于某个值之前,您可以忽略这些初始位置。或者,更好的是,在启动期间,如果(a)新位置与旧位置之间的距离小于旧位置的horizontalAccuracy
,则可忽略之前的位置;(b){{1新位置的位置小于先前位置的位置。
例如,假设您正在维护一组horizontalAccuracy
个对象,以及对最后绘制路径的引用:
CLLocation
此外,我们假设您的位置更新例程只是添加到位置数组,然后指示应重绘路径:
@property (nonatomic, strong) NSMutableArray *locations;
@property (nonatomic, weak) id<MKOverlay> pathOverlay;
然后- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
NSLog(@"%s", __FUNCTION__);
CLLocation* location = [locations lastObject];
[self.locations addObject:location];
[self addPathToMapView:self.mapView];
}
可以从最后一个位置删除第二个,如果它不如最后一个位置,并且它们之间的距离小于最近位置的准确度。
addPathToMapView
最重要的是,摆脱不如下一个位置准确的位置。如果你愿意的话,你可以在修剪过程中变得更加积极,但是那里有权衡,但希望这说明了这个想法。
答案 2 :(得分:2)
您可以设置位置管理器的distancefilter,希望这可以帮助您
locationManager=[[CLLocationManager alloc] init];
locationManager.delegate=self;
locationManager.desiredAccuracy=kCLLocationAccuracyNearestTenMeters;
locationManager.distanceFilter=10.0;
[locationManager startUpdatingLocation];
答案 3 :(得分:1)
startUpdatingLocation
即使位置没有变化,也会不断更新用户的位置。您只需根据需要构建应用程序以处理这些持续更新。
尝试阅读有关此主题的Apple文档。起初很混乱,但无论如何都要尝试。
答案 4 :(得分:0)
我认为这就是你所需要的。startMonitoringForRegion:desiredAccuracy
示例请参阅以下github链接。
答案 5 :(得分:0)
试试Apple提供的面包屑示例代码..
http://developer.apple.com/library/ios/#samplecode/Breadcrumb/Introduction/Intro.html
答案 6 :(得分:0)
添加此内容,
[locManager stopUpdatingLocation];
进入updateUserLocation
委托方法。
查看以下代码段:
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
[_locationManager stopUpdatingLocation];
}
答案 7 :(得分:0)
locationManager.startUpdatingLocation()连续获取位置并且didUpdateLocations方法多次调用, 只需在调用locationManager.startUpdatingLocation()之前设置locationManager.distanceFilter值的值。
因为我设置200工作正常
locationManager.distanceFilter = 200
locationManager.startUpdatingLocation()