我正在使用适用于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地图光标位置自动移动并绘制这样的折线。
答案 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。