我正在开发一个导航应用程序,并在已绘制的GMSPolyline上跟踪用户的当前运动。用户直奔时效果很好。现在,如果假设在GMSPolyline上向右/向左转或掉头,现在根据我的GPS位置,我会在20米左右进行一次更新,然后再转向30米。
我的GPS无法收集即将出现在转折点的点。在这种情况下,我的GMSMarker从点x跳到y,如果我应用动画,则它会沿对角线移动,并且不会沿着GMSPolyline弧或曲线移动。
请建议我如何从GMSPolyline收集那些丢失的点或显示GMS标记的一些动画,以便用户可以看到他实际上正在打开折线。
我附上一张样本图片。红线可以理解为GMS折线和蓝点是我通过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);
}
}
我们之前做过,但是无法发布代码,但是希望您能得到一个设计级的想法。
希望能有所帮助。