Google Map SDK:随着设备在后台移动,在 google 地图中绘制正确的折线

Google Map SDK: Draw correct polyline in google map as Device Moves in Background

我正在为 iOS 使用 Google Map SDK。我正在驾驶模式下绘制折线。

但是当我停下来然后缩放 google 地图时,我的当前位置光标会自动移动并重新绘制之字形多段线,因为之前绘制的所有多段线都会重叠并且多段线会完全 changed.Same当我进入后台并开车时发生。

我能知道为什么会这样吗?以及如何在同一路径上同时在驾驶和步行模式下绘制平滑的多段线。

我的代码-

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
 pointString=[NSString     stringWithFormat:@"%f,%f",newLocation.coordinate.latitude,newLocation.coordinate.longitude];
CLLocationDistance kilometers = [newLocation distanceFromLocation:oldLocation] / 1000;
NSLog(@"Distance Travelled in Kilometer :%f",kilometers);

[self.points addObject:pointString];
GMSMutablePath *path = [GMSMutablePath path];
for (int i=0; i<self.points.count; i++)
{
    NSArray *latlongArray = [[self.points   objectAtIndex:i]componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@","]];

    [path addLatitude:[[latlongArray objectAtIndex:0] doubleValue] longitude:[[latlongArray objectAtIndex:1] doubleValue]];
}

if (self.points.count>2)
{
    GMSPolyline *polyline = [GMSPolyline polylineWithPath:path];
    polyline.strokeColor = [UIColor blueColor];
    polyline.strokeWidth = 5.f;
    polyline.map = mapView_;
    self.mapContainerView = mapView_;
}
}

如果 ,我保持在相同的位置,然后 Googme 地图 Cursor 位置自动移动并像这样绘制折线。

添加一个 NSLocationAlwaysUsageDescription 和一个 UIBackgroundModes -> "location" 到 Info.plist

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
    manager.allowsBackgroundLocationUpdates = YES;
}

在允许后台位置更新之前: enter image description here

允许后台位置更新后: enter image description here

此行程大部分已在后台绘制。

有两件事正在发生。首先,GPS 芯片在静止时并不总是 return 相同的位置。确定的 GPS 位置总是有一点波动。 iOS 努力检测您是否站着不动,然后提供相同的位置,但我认为在驾驶模式下这样做的范围较小。

其次,通过使用复杂的方式将样本存储为字符串,您需要进行 %f 转换,这会降低准确性。这会夸大位置之间的任何差异。如果您直接使用 CLLocation 对象,您可能会得到更好的结果(以及更简洁的代码):

[self.points addObject:newLocation];
GMSMutablePath *path = [GMSMutablePath path];

for (CLLocation *col in self.points)
{
    [path addLatitude:col.latitude longitude:col.longitude];
}

此外,请确保您在 CLLocationManager 上进行了正确的设置:

theLocationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
theLocationManager.distanceFilter = kCLDistanceFilterNone;
theLocationManager.activityType = CLActivityTypeOtherNavigation;
theLocationManager.allowsBackgroundLocationUpdates = YES

还有一件事。也很奇怪,你在didUpdateToLocation: method:

中改变view
self.mapContainerView = mapView_;

更新路径后,您应该只对现有视图使用 setNeedsDisplay。