GMSMarker подпрыгивает по углам на GMSPolyline

Я работаю над навигационным приложением и отслеживаю текущее движение пользователя на уже нарисованной GMSPolyline. Он работает хорошо, когда пользователь идет прямо. Теперь, если, предположим, что на GMSPolyline есть правый/левый поворот или u-поворот, теперь, согласно моему местоположению GPS, я получаю одно обновление около 20 метров, прежде чем совершать поворот, а другой через 30 метров.

Мой GPS не может собрать точки, которые будут существовать только в поворотной точке. В этом случае мой GMSMarker перескакивает из точки x в y, и если я применяю анимацию, то он перемещается по диагонали и не перемещается вдоль дуг или кривых GMSPolyline. Пожалуйста, предложите мне, как я могу собрать те недостающие точки из GMSPolyline или показать анимацию для маркера GMS, чтобы пользователь мог видеть, что он фактически включает полилинию.

Я прикрепляю одно образцовое изображение. Красные линии можно понимать как GMSPolylines, а синие точки - это координаты GPS, которые я получаю с помощью диспетчера CLLocation.

введите описание изображения здесь

Ответ 1

// 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 current location in arrLocationsOnPolyline,Lets call it as nFoundAtIndexTemp.
// FMI : loop through the arrLocationsOnPolyline and find the nearest point index to user current location,

// Hold a global nLastFoundAtIndex variable and make it 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);
    }
}

Мы сделали это раньше, но не можем отправлять код, но, надеюсь, вы получите идею уровня дизайна.

Надеюсь, что это поможет.