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

时间:2016-10-20 09:24:22

标签: ios objective-c google-maps-sdk-ios google-polyline

我正在使用适用于iOS的Google Map SDK。我正在驾驶模式中绘制折线。

但是当我停下来,然后缩放谷歌地图时,我的当前位置光标会自动移动并重绘之字形折线,因为绘制的所有先前折线都会重叠并且折线完全改变。当我进入背景和驱动时会发生事情

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

我的代码 -

- (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地图光标位置自动移动并绘制这样的折线。

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:0)

添加 NSLocationAlwaysUsageDescription UIBackgroundModes - &gt; “位置”到Info.plist

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

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

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

这个行程的大部分都是在后台绘制的。

答案 1 :(得分:0)

有两件事正在发生。首先,当静止不动时,GPS芯片并不总是返回相同的位置。确定的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:方法中的视图也很奇怪:

self.mapContainerView = mapView_;

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