3

此屏幕截图未移动设备 我有一个应用程序,用户在慢跑或骑自行车时跟踪他/她的路线,所以我需要完美的位置,所以用户的路线将是完美的。

但是,我有一个问题,

locManager = [[CLLocationManager alloc] init];
[locManager setDesiredAccuracy:kCLLocationAccuracyBestForNavigation];
[locManager setDelegate:self];
[locManager startUpdatingLocation];

在 viewDidLoad 中。当我只是不稍微移动设备并且在地图上非常奇怪的路线绘制时,使用此 didUpdateToLocation 方法多次调用。

我只是不明白为什么会发生这种情况,如果我做错了什么或遗漏了什么。

谢谢.......

4

8 回答 8

15

我使用 locationManager.distanceFilter = 500; (或左右)//计量以防止发生多次调用。请记住在您开始更新您的位置之前拨打此电话

于 2014-02-12T09:00:28.443 回答
2

当您第一次启动定位服务时,无论您是否在移动,通常都会看到多个位置更新。如果您在horizontalAccuracy这些位置进入时检查它们,您会发现当它“升温”时,它将显示一系列位置,其精度越来越高(即horizontalAccuracy值越来越小),直到它达到静止状态。

您可以忽略这些初始位置,直到horizontalAccuracy低于某个值。或者,更好的是,在启动期间,如果 (a) 新位置与旧位置之间的距离小于旧位置的horizontalAccuracy距离,并且 (b) 如果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因此,如果第二个位置的准确度低于最后一个位置并且它们之间的距离小于最近位置的准确度,则可以从最后一个位置删除第二个位置。

- (void)addPathToMapView:(MKMapView *)mapView
{
    NSInteger count = [self.locations count];

    // let's see if we should remove the penultimate location

    if (count > 2)
    {
        CLLocation *lastLocation = [self.locations lastObject];
        CLLocation *previousLocation = self.locations[count - 2];

        // if the very last location is more accurate than the previous one
        // and if distance between the two of them is less than the accuracy,
        // then remove that `previousLocation` (and update our count, appropriately)

        if (lastLocation.horizontalAccuracy < previousLocation.horizontalAccuracy &&
            [lastLocation distanceFromLocation:previousLocation] < lastLocation.horizontalAccuracy)
        {
            [self.locations removeObjectAtIndex:(count - 2)];
            count--;
        }
    }

    // now let's build our array of coordinates for our MKPolyline

    CLLocationCoordinate2D coordinates[count];
    NSInteger numberOfCoordinates = 0;

    for (CLLocation *location in self.locations)
    {
        coordinates[numberOfCoordinates++] = location.coordinate;
    }

    // if there is a path to add to our map, do so

    MKPolyline *polyLine = nil;

    if (numberOfCoordinates > 1)
    {
        polyLine = [MKPolyline polylineWithCoordinates:coordinates count:numberOfCoordinates];
        [mapView addOverlay:polyLine];
    }

    // if there was a previous path drawn, remove it

    if (self.pathOverlay)
        [mapView removeOverlay:self.pathOverlay];

    // save the current path

    self.pathOverlay = polyLine;
}

最重要的是,只需摆脱比您拥有的下一个位置更不准确的位置。如果你愿意,你可以在修剪过程中变得更加积极,但是那里有权衡,但希望这能说明这个想法。

于 2013-05-06T12:26:32.887 回答
2

您可以设置位置管理器的距离过滤器希望这可以帮助你

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

 [locationManager startUpdatingLocation];
于 2013-05-06T13:35:25.933 回答
1
startUpdatingLocation 

即使位置不变,也会不断更新用户的位置。您只需要根据您的需要构建您的应用程序以处理这些持续更新。

尝试阅读 Apple 关于此主题的文档。一开始很困惑,但无论如何都要尝试。

http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html#//apple_ref/doc/uid/TP40009497-CH2-SW1

于 2013-05-06T12:23:15.253 回答
0

添加这个,

[locManager stopUpdatingLocation];

进入您的updateUserLocation委托方法。

查看以下代码片段:

-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    [_locationManager stopUpdatingLocation];        
}
于 2014-08-06T17:10:41.273 回答
0

我认为这就是你所需要的。startMonitoringForRegion:desiredAccuracy

例如,请参阅以下github链接。

于 2013-05-06T12:20:05.883 回答
0

试试 Apple 提供的这个 Bread Crumb 示例代码。

http://developer.apple.com/library/ios/#samplecode/Breadcrumb/Introduction/Intro.html

于 2013-05-06T12:46:35.273 回答
0

locationManager.startUpdatingLocation() 连续获取位置,didUpdateLocations 方法调用多次,只需在调用 locationManager.startUpdatingLocation() 之前设置 locationManager.distanceFilter 的值。

当我设置 200 工作正常时

    locationManager.distanceFilter = 200
    locationManager.startUpdatingLocation()
于 2017-05-19T11:21:29.970 回答