Obtener información de ruta

Sigue esta guía para configurar tu app de modo que recupere los tiempos, las distancias y los tramos de la ruta actual.

Descripción general

Para obtener información sobre la ruta actual, obtén la propiedad adecuada de la instancia de navigator:

Consulta el código

Cómo obtener la hora de llegada al próximo destino

Para obtener la hora del próximo destino, llama a timeToNextDestination(). Se muestra un valor NSTimeInterval. En el siguiente ejemplo, se muestra cómo registrar la hora del próximo destino:

Swift

if let navigator = mapView.navigator {
  let time = navigator.timeToNextDestination
  let minutes = floor(time/60)
  let seconds = round(time - minutes * 60)
  NSLog("Time to next destination: %.0f:%.0f", minutes, seconds)
}

Objective-C

NSTimeInterval time = _mapView.navigator.timeToNextDestination;
int minutes = floor(time/60);
int seconds = round(time - minutes * 60);
NSLog(@"%@", [NSString stringWithFormat:@"Time to next destination: %i:%i.", minutes, seconds]);

Cómo obtener la distancia hasta el próximo destino

Para obtener la distancia hasta el siguiente destino, llama a distanceToNextDestination(). Esto muestra un valor CLLocationDistance. Las unidades se especifican en metros.

Swift

if let navigator = mapView.navigator {
  let distance = navigator.distanceToNextDestination
  let miles = distance * 0.00062137
  NSLog("Distance to next destination: %.2f miles.", miles)
}

Objective-C

CLLocationDistance distance = _mapView.navigator.distanceToNextDestination;
double miles = distance * 0.00062137;
NSLog(@"%@", [NSString stringWithFormat:@"Distance to next destination: %.2f.", miles]);

Cómo obtener información sobre las condiciones de tráfico en el próximo destino

Para obtener un valor que indique el flujo de tráfico al siguiente destino, llama a delayCategoryToNextDestination. Este parámetro muestra GMSNavigationDelayCategory. En el siguiente ejemplo, se muestra cómo evaluar el resultado y registrar un mensaje de tráfico:

Swift

if let navigator = mapView.navigator {
  // insert sample for evaluating traffic value
  let delay = navigator.delayCategoryToNextDestination
  let traffic = "unavailable"
  switch delay {
    case .noData:
      traffic = "unavailable"
    case .heavy:
      traffic = "heavy"
    case .medium:
      traffic = "moderate"
    case .light:
      traffic = "light"
    default:
      traffic = "unavailable"
  }
  print("Traffic is \(traffic).")
}

Objective-C

GMSNavigationDelayCategory delay = mapView.navigator.delayCategoryToNextDestination;
NSString *traffic = @"";

switch (delayCategory) {
    case GMSNavigationDelayCategoryNoData:
      traffic = @"No Data";
      break;
    case GMSNavigationDelayCategoryHeavy:
      traffic = @"Heavy";
      break;
    case GMSNavigationDelayCategoryMedium:
      traffic = @"Medium";
      break;
    case GMSNavigationDelayCategoryLight:
      traffic = @"Light";
      break;
    default:
      NSLog(@"Invalid delay category: %zd", delayCategory);
 }

NSLog(@"%@", [NSString stringWithFormat:@"Traffic is %@.", traffic]);

Cómo obtener información sobre el tramo actual

Para obtener información sobre el tramo de ruta actual, llama a currentRouteLeg. Esto muestra una instancia de GMSRouteLeg, de la que puedes obtener lo siguiente:

  • Es el destino de la etapa.
  • Es la coordenada final de la etapa.
  • Es la ruta que contiene las coordenadas que conforman el tramo de la ruta.

En el siguiente ejemplo, se muestra cómo registrar el título y las coordenadas de latitud y longitud para el siguiente tramo de la ruta:

Swift

if let navigator = mapView.navigator {
  let currentLeg = navigator.currentRouteLeg
  let nextDestination = currentLeg?.destinationWaypoint?.title
  let lat = currentLeg?.destinationCoordinate.latitude.description
  let lng = currentLeg?.destinationCoordinate.longitude.description
  NSLog(nextDestination! + ", " + lat! + "/" + lng!)
}

Objective-C

GMSRouteLeg *currentSegment = _mapView.navigator.currentRouteLeg;
NSString *nextDestination = currentSegment.destinationWaypoint.title;
CLLocationDegrees lat = currentSegment.destinationCoordinate.latitude;
CLLocationDegrees lng = currentSegment.destinationCoordinate.longitude;
NSLog(@"%@", [NSString stringWithFormat:@"%@, %f/%f", nextDestination, lat, lng]);

Cómo obtener la ruta que se recorrió más recientemente

Para obtener la ruta recorrida más reciente, llama a traveledPath. Esto muestra una instancia de GMSPath que se simplificó para quitar los puntos redundantes (por ejemplo, convertir puntos colineales consecutivos en un solo tramo de línea). Esta ruta está vacía hasta que se inicia la guía. En el siguiente ejemplo, se muestra cómo obtener la ruta recorrida más recientemente:

Swift

if let navigator = mapView.navigator {
  let latestPath = navigator.traveledPath
  if latestPath.count() > 0 {
    let begin: CLLocationCoordinate2D = latestPath.coordinate(at: 0)
    let current: CLLocationCoordinate2D = latestPath.coordinate(at: latestPath.count() - 1)
    print("Path from (\(begin.latitude),\(begin.longitude)) to (\(current.latitude),\(current.longitude))")
  }
}

Objective-C

GMSPath *latestPath = mapView.navigator.traveledPath;
if (latestPath.count > 0) {
  CLLocationCoordinate2D begin = [latestPath coordinateAtIndex:0];
  CLLocationCoordinate2D current = [latestPath coordinateAtIndex:latestPath.count - 1];
  NSLog(@"Path from %f/%f to %f/%f",
        begin.latitude,
        begin.longitude,
        current.latitude,
        current.longitude);
}