Share via


Mostrar rutas e indicaciones en un mapa

Nota:

MapControl y servicios de mapas requieren una clave de autenticación de mapas denominada MapServiceToken. Para obtener más información sobre cómo obtener y establecer una clave de autenticación de mapas, consulta Solicitar una clave de autenticación de mapas.

Solicita rutas e indicaciones y muéstralas en tu aplicación.

Nota:

Para obtener más información sobre el uso de mapas en la aplicación, descargue el ejemplo de mapa de Plataforma universal de Windows (UWP). Si la asignación no es una característica principal de la aplicación, considere la posibilidad de iniciar la aplicación Mapas de Windows en su lugar. Puedes usar los esquemas URI bingmaps:, ms-drive-to: y ms-walk-to: para iniciar la aplicación Mapas de Windows para mostrar mapas específicos e indicaciones paso a paso. Para obtener más información, consulta Iniciar la aplicación Mapas de Windows.

 

Introducción a los resultados de MapRouteFinder

Así es como están relacionadas las clases de rutas e indicaciones:

Obtenga una ruta y indicaciones para conducir o caminar llamando a los métodos de la clase MapRouteFinder . Por ejemplo, GetDrivingRouteAsync o GetWalkingRouteAsync.

Cuando solicitas una ruta, puedes especificar lo siguiente:

  • Puedes proporcionar un punto inicial y un punto final o puedes proporcionar una serie de puntos de trayecto para calcular la ruta.

    Los puntos de paso de parada agregan piernas de ruta adicionales, cada una con su propio itinerario. Para especificar puntos de paso de parada , use cualquiera de las sobrecargas GetDrivingRouteFromWaypointsAsync .

    A través de waypoint, se definen las ubicaciones intermedias entre los puntos de paso de parada . No agregan piernas de ruta. Son simplemente puntos de referencia que una ruta debe pasar. Para especificar mediante puntos de referencia, use cualquiera de las sobrecargas GetDrivingRouteFromEnhancedWaypointsAsync .

  • Puede especificar optimizaciones (por ejemplo: minimizar la distancia).

  • Puede especificar restricciones (por ejemplo: evitar autopistas).

Mostrar indicaciones

El objeto MapRouteFinderResult contiene un objeto MapRoute al que puedes tener acceso mediante su propiedad Route.

El objeto MapRoute calculado tiene propiedades que proporcionan el tiempo necesario para recorrer la ruta, la longitud de la ruta y la colección de objetos MapRouteLeg que contienen los tramos de la ruta. Cada objeto MapRouteLeg contiene una colección de objetos MapRouteManeuver. El objeto MapRouteManeuver contiene indicaciones a las que puedes tener acceso mediante su propiedad InstructionText.

Importante

Debe especificar una clave de autenticación de mapas para poder usar los servicios de mapa. Para obtener más información, consulta Solicitar una clave de autenticación de mapas.

 

using System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.Services.Maps;
using Windows.Devices.Geolocation;
...
private async void button_Click(object sender, RoutedEventArgs e)
{
   // Start at Microsoft in Redmond, Washington.
   BasicGeoposition startLocation = new BasicGeoposition() {Latitude=47.643,Longitude=-122.131};

   // End at the city of Seattle, Washington.
   BasicGeoposition endLocation = new BasicGeoposition() {Latitude = 47.604,Longitude= -122.329};

   // Get the route between the points.
   MapRouteFinderResult routeResult =
         await MapRouteFinder.GetDrivingRouteAsync(
         new Geopoint(startLocation),
         new Geopoint(endLocation),
         MapRouteOptimization.Time,
         MapRouteRestrictions.None);

   if (routeResult.Status == MapRouteFinderStatus.Success)
   {
      System.Text.StringBuilder routeInfo = new System.Text.StringBuilder();

      // Display summary info about the route.
      routeInfo.Append("Total estimated time (minutes) = ");
      routeInfo.Append(routeResult.Route.EstimatedDuration.TotalMinutes.ToString());
      routeInfo.Append("\nTotal length (kilometers) = ");
      routeInfo.Append((routeResult.Route.LengthInMeters / 1000).ToString());

      // Display the directions.
      routeInfo.Append("\n\nDIRECTIONS\n");

      foreach (MapRouteLeg leg in routeResult.Route.Legs)
      {
         foreach (MapRouteManeuver maneuver in leg.Maneuvers)
         {
            routeInfo.AppendLine(maneuver.InstructionText);
         }
      }

      // Load the text box.
      tbOutputText.Text = routeInfo.ToString();
   }
   else
   {
      tbOutputText.Text =
            "A problem occurred: " + routeResult.Status.ToString();
   }
}

En este ejemplo se muestran los siguientes resultados en el cuadro de texto tbOutputText.

Total estimated time (minutes) = 18.4833333333333
Total length (kilometers) = 21.847

DIRECTIONS
Head north on 157th Ave NE.
Turn left onto 159th Ave NE.
Turn left onto NE 40th St.
Turn left onto WA-520 W.
Enter the freeway WA-520 from the right.
Keep left onto I-5 S/Portland.
Keep right and leave the freeway at exit 165A towards James St..
Turn right onto James St.
You have reached your destination.

Mostrar rutas

Para mostrar un objeto MapRoute en un MapControl, construye una MapRouteView con el objeto MapRoute. A continuación, agregue MapRouteView a la colección Routes de MapControl.

Importante

Debe especificar una clave de autenticación de mapas para poder usar los servicios de mapa o el control de mapa. Para obtener más información, consulta Solicitar una clave de autenticación de mapas.

 

using System;
using Windows.Devices.Geolocation;
using Windows.Services.Maps;
using Windows.UI;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Maps;
...
private async void ShowRouteOnMap()
{
   // Start at Microsoft in Redmond, Washington.
   BasicGeoposition startLocation = new BasicGeoposition() { Latitude = 47.643, Longitude = -122.131 };

   // End at the city of Seattle, Washington.
   BasicGeoposition endLocation = new BasicGeoposition() { Latitude = 47.604, Longitude = -122.329 };


   // Get the route between the points.
   MapRouteFinderResult routeResult =
         await MapRouteFinder.GetDrivingRouteAsync(
         new Geopoint(startLocation),
         new Geopoint(endLocation),
         MapRouteOptimization.Time,
         MapRouteRestrictions.None);

   if (routeResult.Status == MapRouteFinderStatus.Success)
   {
      // Use the route to initialize a MapRouteView.
      MapRouteView viewOfRoute = new MapRouteView(routeResult.Route);
      viewOfRoute.RouteColor = Colors.Yellow;
      viewOfRoute.OutlineColor = Colors.Black;

      // Add the new MapRouteView to the Routes collection
      // of the MapControl.
      MapWithRoute.Routes.Add(viewOfRoute);

      // Fit the MapControl to the route.
      await MapWithRoute.TrySetViewBoundsAsync(
            routeResult.Route.BoundingBox,
            null,
            Windows.UI.Xaml.Controls.Maps.MapAnimationKind.None);
   }
}

En este ejemplo se muestra lo siguiente en un MapControl denominado MapWithRoute.

control de mapa con la ruta visualizada.

Esta es una versión de este ejemplo que usa un via waypoint entre dos puntos de referencia de parada :

using System;
using Windows.Devices.Geolocation;
using Windows.Services.Maps;
using Windows.UI;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Maps;
...
private async void ShowRouteOnMap()
{
  Geolocator locator = new Geolocator();
  locator.DesiredAccuracyInMeters = 1;
  locator.PositionChanged += Locator_PositionChanged;

  BasicGeoposition point1 = new BasicGeoposition() { Latitude = 47.649693, Longitude = -122.144908 };
  BasicGeoposition point2 = new BasicGeoposition() { Latitude = 47.6205, Longitude = -122.3493 };
  BasicGeoposition point3 = new BasicGeoposition() { Latitude = 48.649693, Longitude = -122.144908 };

  // Get Driving Route from point A  to point B thru point C
  var path = new List<EnhancedWaypoint>();

  path.Add(new EnhancedWaypoint(new Geopoint(point1), WaypointKind.Stop));
  path.Add(new EnhancedWaypoint(new Geopoint(point2), WaypointKind.Via));
  path.Add(new EnhancedWaypoint(new Geopoint(point3), WaypointKind.Stop));

  MapRouteFinderResult routeResult =  await MapRouteFinder.GetDrivingRouteFromEnhancedWaypointsAsync(path);

  if (routeResult.Status == MapRouteFinderStatus.Success)
  {
      MapRouteView viewOfRoute = new MapRouteView(routeResult.Route);
      viewOfRoute.RouteColor = Colors.Yellow;
      viewOfRoute.OutlineColor = Colors.Black;

      myMap.Routes.Add(viewOfRoute);

      await myMap.TrySetViewBoundsAsync(
            routeResult.Route.BoundingBox,
            null,
            Windows.UI.Xaml.Controls.Maps.MapAnimationKind.None);
  }
}