google - map ios swift
GMSMarker rebotando por las esquinas en GMSPolyline (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''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);
}
}
Lo hicimos antes, pero no puedo publicar el código, pero con suerte obtendrá una idea de nivel de diseño.
Espero que ayude.
Estoy trabajando en una aplicación de navegación y siguiendo el movimiento actual del usuario en una GMSPolyline ya dibujada. Funciona bien cuando el usuario va recto. Ahora bien, supongamos que hay un giro a la derecha / izquierda o un giro de 180 grados en GMSPolyline, ahora, según mi ubicación GPS, obtengo una actualización de unos 20 metros antes de dar un giro y otra después de 30 metros.
Mi GPS no recopila los puntos que existirán justo en el punto de inflexión. En este caso, mi GMSMarker salta del punto x al y, si aplico animación, se mueve en diagonal y no se mueve a lo largo de los arcos o curvas de GlinePolyline. Sugiéreme cómo puedo recopilar esos puntos faltantes de GMSPolyline o mostrar alguna animación para el marcador GMS para que el usuario pueda ver que realmente está activando la polilínea.
Adjunto una imagen de muestra. Las líneas rojas se pueden entender como GMLPolylines y los puntos azules son las coordenadas GPS que recibo con CLLocation Manager.