问题描述
我正在开发一个导航应用程序并在已绘制的 GMSPolyline 上跟踪用户的当前移动.当用户直行时效果很好.现在,假设 GMSPolyline 上有右转/左转或掉头,现在根据我的 GPS 位置,我在转弯前 20 米左右得到一个更新,在 30 米后得到另一个更新.
I am working on a navigation app and tracking user's current movement on an already drawn GMSPolyline. It works good when the user is going straight. Now if, suppose there is right / left turn or a u-turn on the GMSPolyline, now as per my GPS location I get one update around 20 meters before taking a turn and another after 30 meters.
我的 GPS 无法收集刚好在转折点存在的点.在这种情况下,我的 GMSMarker 从点 x 跳转到 y,如果我应用动画,那么它会沿对角线移动,并且不会沿着 GMSPolyline 弧线或曲线移动.请建议我如何从 GMSPolyline 收集那些缺失的点或为 GMS 标记显示一些动画,以便用户可以看到他实际上正在打开折线.
My GPS fails to collect the points that will exist just at the turning point. In this case my GMSMarker jumps from point x to y and if I apply animation then it moves diagonally and does not move along the GMSPolyline arcs or curves.Please suggest me how can I collect those missing points from GMSPolyline or show some animation for GMS marker so that user can see he is actually turning on the polyline.
我附上一张示例图片.红线可以理解为 GMSPolylines,蓝点是我通过 CLLocation Manager 接收到的 GPS 坐标.
I am attaching one sample image. Red lines can be understood as GMSPolylines and blue dots are the GPS coordinates that I receive with CLLocation Manager.
推荐答案
// While drawing polyline on GMSMapView
GMSPath *path = [GMSPath pathFromEncodedPath:strEncodedPolyline]; // Decoding encoded polyline string for converting to locations.
// Capture all path points in to a global array,So that we can track how user is travelling later.
arrLocationsOnPolyline = [NSMutableArray new]; // Make it fresh before filling
for (int counter = 0; counter < path.count; ++counter)
{
CLLocationCoordinate2D coordinate = [path coordinateAtIndex:counter];
CLLocation *locTemp = [[CLLocation alloc] initWithLatitude:coordinate.latitude longitude:coordinate.longitude];
[arrLocationsOnPolyline addObject:locTemp];
}
// Here,After loop ending, we'll get all path points as locations in to arrLocationsOnPolyline
// Now in -locationManager:didUpdateLocations: delegate method,
// 1. Find the index of nearest path point to user's current location in arrLocationsOnPolyline,Lets call it as nFoundAtIndexTemp.
// FMI : loop through the arrLocationsOnPolyline and find the nearest point's index to user's current location,
// Hold a global nLastFoundAtIndex variable and make it's default value as -1(in -viewDidLoad or somewhere),
// 2. Check
if (nLastFoundAtIndex >= 0 && nFoundAtIndexTemp > (nLastFoundAtIndex + 10)) // (Means app didn't received location updates but user actually traveled through more than 10 points on poyline drawn)
{
// 3. Hurray,You got him,Now animate your blue current location marker from the location at last stored nearest path point index and current nearest path point index of arrLocationsOnPolyline
}
// 4. Update nLastFoundAtIndex with current state
nLastFoundAtIndex = nFoundAtIndexTemp;
// Code To Animate user location marker through the missed points
// Call this function with array of user missed points(Probably from -locationManager:didUpdateLocations:),Marker will be animated through the points.
#pragma mark - Animating through the missed coordinates
-(void)animateMarker:(GMSMarker *)markerUserLocation throughTheMissedLocations:(NSMutableArray <CLLocation *> *)arrMissedLocations
{
@try
{
CLLocation *locTemp = arrMissedLocations.firstObject;
if(locTemp)
{
[CATransaction begin];
NSTimeInterval nAnimationDuration = 0.1; // Update this value as per your needs.
[CATransaction setAnimationDuration:nAnimationDuration];
markerUserLocation.position = locTemp.coordinate;
if(arrMissedLocations.count >= 1)
{
@try
{
[CATransaction setCompletionBlock:^
{
@try
{
[arrMissedLocations removeObject:locTemp];
[self animateMarker:markerUserLocation throughTheMissedLocations:arrMissedLocations];
}
@catch (NSException *exception)
{
NSLog(@"exception at %s function %@",__PRETTY_FUNCTION__,exception.debugDescription);
}
}];
}
@catch (NSException *exception)
{
NSLog(@"exception at %s function %@",__PRETTY_FUNCTION__,exception.debugDescription);
}
}
[CATransaction commit];
}
}
@catch (NSException *exception)
{
NSLog(@"exception at %s function %@",__PRETTY_FUNCTION__,exception.debugDescription);
}
}
我们之前做过,但不能发布代码,但希望你能得到一个设计级别的想法.
We did this earlier,But can't post code, But hopefully you'll get a design level idea.
希望对您有所帮助.
这篇关于GMSMarker 在 GMSPolyline 的拐角处弹跳的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!