Visualizzare percorsi e indicazioni stradali su una mappa

Nota

MapControl e i servizi per le mappe richiedono una chiave di autenticazione delle mappe denominata MapServiceToken. Per altre informazioni su come ottenere e impostare una chiave di autenticazione delle mappe, vedere Richiedere una chiave di autenticazione per le mappe.

Puoi richiedere itinerari e indicazioni stradali e visualizzarli nella tua app.

Nota

Per altre informazioni sull'uso delle mappe nell'app, scaricare l'esempio mappa piattaforma UWP (Universal Windows Platform). Se il mapping non è una funzionalità di base dell'app, prendere in considerazione l'avvio dell'app Maps di Windows. È possibile usare gli schemi bingmaps:, ms-drive-to:e ms-walk-to: URI per avviare l'app Maps di Windows in mappe specifiche e indicazioni stradali di volta in volta. Per altre informazioni, vedi Avviare l'app Mappe Windows.

 

Introduzione ai risultati di MapRouteFinder

Ecco come sono correlate le classi per itinerari e indicazioni stradali:

Ottenere un percorso di guida o a piedi e indicazioni stradali chiamando i metodi della classe MapRouteFinder. Ad esempio, GetDrivingRouteAsync o GetWalkingRouteAsync.

Quando si richiede una route, è possibile specificare gli elementi seguenti:

  • È possibile specificare solo un punto iniziale e un punto finale oppure fornire una serie di punti di partenza per calcolare la route.

    Stop waypoints aggiunge ulteriori gambe di percorso, ognuna con il proprio Itinerario. Per specificare i punti di arresto del percorso, usare uno degli overload GetDrivingRouteFromWaypointsAsync.

    Via waypoint definisce posizioni intermedie tra punti di interruzione del percorso. Non aggiungono gambe di percorso. Si tratta semplicemente di punti di arrivo che un itinerario deve attraversare. Per specificare i punti di arresto del percorso, usare uno degli overload GetDrivingRouteFromEnhancedWaypointsAsync.

  • È possibile specificare ottimizzazioni (ad esempio: ridurre al minimo la distanza).

  • È possibile specificare limitazioni (ad esempio: evitare le autostrade).

Visualizzare le indicazioni stradali

L'oggetto MapRouteFinderResult contiene un oggetto MapRoute a cui si può accedere attraverso la sua proprietà Route.

La MapRoute calcolata ha proprietà che forniscono il tempo necessario per attraversare il percorso, la lunghezza del percorso e l'insieme di oggetti MapRouteLeg che contengono gambe del percorso. Ogni oggetto MapRouteLeg contiene una raccolta di oggetti MapRouteManeuver. L'oggetto MapRouteManeuver contiene indicazioni che è possibile accedere tramite la relativa proprietà InstructionText.

Importante

È necessario specificare una chiave di autenticazione delle mappe prima di poter usare i servizi mappa. Per maggiori informazioni, vedere Richiedere una chiave di autenticazione delle mappe.

 

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();
   }
}

Questo esempio visualizza i risultati seguenti nella casella di testo 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.

Visualizzare le route

Per visualizzare un oggetto MapRoute su un MapControl, costruire una MapRouteView con la MapRoute. Quindi, aggiungere MapRouteView alla raccolta di Routes di MapControl.

Importante

È necessario specificare una chiave di autenticazione delle mappe prima di poter usare i servizi mappa o il controllo mappa. Per maggiori informazioni, vedere Richiedere una chiave di autenticazione delle mappe.

 

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);
   }
}

In questo esempio viene visualizzato quanto segue in un oggetto MapControl chiamato MapWithRoute.

map control with route displayed.

Ecco una versione di questo esempio che usa un punto di passaggio via tra due punti di arresto:

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);
  }
}