Visualizzare percorsi e indicazioni stradali su una mappa
Importante
Ritiro del servizio Bing Maps per le aziende
Il MapControl e i servizi di mappatura UWP dello spazio dei nomi Windows.Services.Maps si basano su Bing Maps. Bing Maps per le aziende è obsoleto e verrà ritirato; da quel momento in poi MapControl e i servizi non riceveranno più i dati.
Per altre informazioni, vedere il Centro per sviluppatori Bing Maps e la documentazione di Bing Maps.
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
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:
La classe MapRouteFinder include metodi che ottengono itinerari e indicazioni stradali. Questi metodi restituiscono un MapRouteFinderResult.
MapRouteFinderResult contiene un oggetto MapRoute. Accedere a questo oggetto tramite la proprietà Route di MapRouteFinderResult.
MapRoute contiene un insieme di oggetti MapRouteLeg. Accedere a questa raccolta tramite la proprietà Legs di MapRoute.
Ogni MapRouteLeg contiene una raccolta di oggetti MapRouteManeuver. Accedere a questa raccolta tramite la proprietà Maneuvers di MapRouteLeg.
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.
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);
}
}