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。
我正在为 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:
中改变viewself.mapContainerView = mapView_;
更新路径后,您应该只对现有视图使用 setNeedsDisplay。