GMSMarker在GMSPolyline的各个angular落跳跃

我正在制作一个导航应用程序,并跟踪用户已经绘制的GMSPolyline上的当前运动。 当用户直行时,效果很好。 现在,假设在GMSPolyline上有左/右转或者掉头,现在根据我的GPS位置,我可以在20米左右进行一次更新,然后在30米之后转弯。

我的GPS没有收集到正好在转折点的点。 在这种情况下,我的GMSMarker从点x跳到y,如果我应用animation,那么它会沿着对angular线移动,不会沿着GMSPolyline弧线或曲线移动。 请build议我如何从GMSPolyline中收集那些缺less的点或者显示一些GMS标记的animation,以便用户可以看到他实际上正在打开折线。

我附上了一个样本图像。 红线可以理解为GMSPolylines,蓝点是我用CLLocation Manager收到的GPS坐标。

在这里输入图像说明

// 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); } } 

我们之前做过,但不能发布代码,但希望你会得到一个devise水平的想法。

希望有所帮助。