Il presente articolo è stato tradotto automaticamente.

Windows Phone 8.1

Le mappe in Windows Phone 8.1

Keith Pijanowski

Scaricare il codice di esempio

Ogni generazione di Windows Phone porta migliorate capacità di mappatura, e 8.1 di Windows Phone, con il nuovo controllo mappa introdotto con Visual Studio 2013 Update 3, non fa eccezione. Se tutto ciò che serve è una semplice mappa, centrata su una posizione specificata, è possibile realizzare con il nuovo controllo mappa con poche righe di codice. Ma se devi rispondere all'interazione dell'utente, personalizzare l'aspetto del controllo o calcolare itinerari, è anche possibile utilizzare il nuovo controllo della mappa e i servizi di mapping API per questi scenari più complessi.

Questo articolo riguarderà il nuovo controllo Windows Phone 8.1 mappa e i servizi di mapping API. Potrai iniziare dai risultati di funzioni di visualizzazione mappa base, poi date un'occhiata a funzionalità più avanzate che mostrano come effettuare il push pins sulla mappa a un indirizzo specificato. Inoltre ti mostrerò come effettuare controlli XAML del controllo della mappa e come ottenere la posizione GPS (e indirizzo) che corrisponde a un punto specifico nel controllo della mappa. Questo è utile se si desidera consentire all'utente di toccare una posizione di interesse e quindi determinare la posizione GPS e indirizzo. Infine, ti mostrerò come calcolare guida e indicazioni di camminare.

Un pezzo di buon compagno il materiale mi occuperò è l'articolo di settembre 2014, "creando un applicazione Location-Aware con Geofencing," di Tony Champion. Un geofence è una regione determinata intorno una posizione GPS che può essere registrata con Windows. Una volta registrata la regione, un'applicazione può ricevere notifiche quando il dispositivo entra o lascia la regione. Geofencing anche è una novità di Windows Phone 8.1. Se hai intenzione di costruire un'applicazione che utilizza geofencing, considerare l'utilizzo di controllo mappa per consentire agli utenti di specificare geografici e mostrare loro geografici esistente.

Al momento, c'è un controllo di mappa diverso per ogni sapore di mobile e piattaforma tablet:

  • Applicazioni Windows Phone Silverlight 8.0/8.1: Microsoft.Phone.Maps.Controls.Map
  • Applicazioni di Windows Store 8. x: Bing.Maps.Map
  • Applicazioni Windows Phone 8.1 Runtime: Windows.UI.Xaml.Controls.Maps

Questo articolo si concentra sul nuovo controllo mappa e servizi di mappatura che possono essere utilizzati all'interno di applicazioni scritte per Windows Phone 8.1 Runtime.

Guida introduttiva

L'autenticazione dell'applicazione Your Windows Phone applicazione deve essere autenticato ogni volta che utilizza il controllo della mappa o i servizi di mapping dello spazio dei nomi Windows.Services.Maps. Per autenticare l'applicazione, è necessario un servizio di mappa ApplicationID e un servizio di mappa Token di autenticazione, che può essere recuperati dalla tua bacheca di sviluppatore in Windows Phone Dev Center. Troverete istruzioni dettagliate per ottenere un oggetto ApplicationID e AuthenticationToken dall'articolo di MSDN Library al bit.ly/1y78M2F.

Una volta che li hai, è necessario posizionare l'oggetto ApplicationID all'interno del file appxmanifest dell'applicazione. Istruzioni per fare questo sono anche l'articolo di MSDN Library. Userai il Token di autenticazione servizio mappa nel codice, come si vedrà più avanti in questo articolo.

Capacità molti degli esempi in questo articolo utilizzare la posizione corrente dell'utente e il controllo della mappa può essere necessario Internet. Pertanto, le funzionalità di Internet e la posizione devono essere dichiarate nel file manifesto dell'applicazione come mostrato Figura 1. Tuttavia, servizi di mappatura funzionano anche senza connettività Internet quando le mappe vengono scaricate per l'utilizzo offline. Per ulteriori informazioni sul download di mappe, vedere "come per scaricare e aggiornamento Offline Maps (XAML)" a bit.ly/1nXBOrS.

che dichiara di Internet e le funzionalità di localizzazione
Figura 1 che dichiara di Internet e le funzionalità di localizzazione

Visualizzazione mappe

Visualizzazione di una mappa semplice l'aggiunta di un controllo mappa a una pagina è facile come l'aggiunta di qualsiasi altro controllo. È possibile trascinare il controllo nella casella degli strumenti di Visual Studio tua pagina oppure è possibile immettere il codice XAML come segue:

<Maps:MapControl
  x:Name="myMapControl"
  MapServiceToken="Place your token here."
  Height="200" Width="300"
  HorizontalAlignment="Center"
  Margin="0,0,0,12"
  />

Notare la proprietà MapServiceToken. Questa proprietà deve essere dato il valore della mappa Servizio autenticazione Token che è stato assegnato all'applicazione nel cruscotto sviluppatore del Windows Phone Dev Center. Si noti inoltre che è possibile posizionare il controllo mappa come qualsiasi altro controllo. Il controllo della mappa non deve dominare l'intero schermo. Una piccola mappa ingrandita in una determinata posizione può rendere un efficace visivo su una pagina che contiene informazioni specifiche della posizione. D'altra parte, mappe che sono ingrandite (o possono essere ingrandite dall'utente) saranno necessario ulteriore immobiliare. Per le mappe, è possibile utilizzare la pagina intera.

XAML precedente sarà produrre risultati poco interessante se collocati all'interno di un'applicazione ed eseguire. Questo controllo mostrerà che una mappa completamente ingrandito. Pertanto, il passo successivo utilizzando il controllo della mappa è di individuare un percorso specifico come punto centrale della mappa, così come il livello di zoom.

Il codice seguente calcola prima la posizione corrente dell'utente e quindi imposta quella posizione nella proprietà centro della mappa. Imposta inoltre il livello di zoom a 15. Il valore minimo per il livello di zoom è 1, che mostra la mappa completamente rimpicciolisci — e visualizza mezzo globo in vostro controllo mappa. Il valore massimo per il livello di zoom è 20, che si può zoomare il controllo mappa un indirizzo specifico:

Geolocator geolocator = new Geolocator();
Geoposition geoposition = null;
try
{
  geoposition = await geolocator.GetGeopositionAsync();
}
catch (Exception ex)
{
  // Handle errors like unauthorized access to location
  // services or no Internet access.
}
myMapControl.Center = geoposition.Coordinate.Point;
myMapControl.ZoomLevel = 15;

L'aggiunta di immagini al controllo mappa se si desidera contrassegnare una posizione specifica sulla vostra mappa, è possibile aggiungere immagini con un titolo per il controllo della mappa. Il codice in Figura 2 punterà alla posizione corrente del dispositivo con l'aggiunta di un'immagine dalla cartella del progetto beni per il controllo della mappa.

Figura 2 l'aggiunta di un'immagine personalizzata per il controllo della mappa

Geolocator geolocator = new Geolocator();
Geoposition geoposition = null;
try
{
  geoposition = await geolocator.GetGeopositionAsync();
}
catch (Exception ex)
{
  // Handle errors like unauthorized access to location services or no Internet access.
}
MapIcon mapIcon = new MapIcon();
mapIcon.Image = RandomAccessStreamReference.CreateFromUri(
  new Uri("ms-appx:///Assets/PinkPushPin.png"));
mapIcon.NormalizedAnchorPoint = new Point(0.25, 0.9);
mapIcon.Location = geoposition.Coordinate.Point;
mapIcon.Title = "You are here";
myMapControl.MapElements.Add(mapIcon);

Per aggiungere un'immagine al vostro controllo mappa, prima di creare un oggetto MapIcon e impostarne la proprietà posizione per un Geopoint, che rappresenta la posizione di interesse sulla mappa. Il codice in Figura 2 utilizza la posizione corrente dell'utente. La proprietà Title è il testo che verrà visualizzato sopra l'immagine che viene aggiunto al controllo mappa.

Per specificare l'immagine, impostare la proprietà Image di MapIcon utilizzando il metodo RandomAccessStreamReference.CreateFromUri. Questo è un metodo statico dello spazio dei nomi Windows.Storage.Streams. L'immagine dovrebbe essere circa 50 pixel di 50 pixel; Se è più grande, esso verrà ridimensionato.

Quando lo scopo della vostra immagine deve puntare a una posizione specifica, è consigliabile utilizzare la proprietà NormalizedAnchorPoint su MapIcon. Questa proprietà consente di indicare il punto all'interno della vostra immagine che sarà posizionato sopra il Geopoint specificato. Se l'immagine è un perno di Spinta, questo sarebbe la punta del perno. Se stai usando un'immagine di una freccia, questo punto sarà la punta della freccia. Il valore predefinito per la proprietà NormalizedAnchorPoint è un oggetto creato con un valore di (0, 0), che rappresenta l'angolo superiore sinistro dell'immagine. L'angolo inferiore destro dell'immagine è (1,1). Questo sistema di coordinate è raffigurato in Figura 3 con pochi punti di campionamento.

sistema di Coordinate utilizzato per la proprietà di NormalizedAnchorPoint
Figura 3 sistema di Coordinate utilizzato per la proprietà di NormalizedAnchorPoint

Se l'immagine utilizzata come icona della mappa contiene un puntatore e non si imposta la proprietà NormalizedAnchorPoint correttamente, l'icona mappa punterà a una posizione scorretta sulla vostra mappa. Se l'immagine è semplicemente un puntino o un piccolo cerchio, si utilizzerà un valore di (0.5,0.5), che è il centro dell'immagine.

Se non si specifica un'immagine, la MapControl ha un'immagine predefinita, mostrata Figura 4, che verrà utilizzata.

l'icona mappa predefinita
Figura 4 l'icona mappa predefinita

Come potete vedere, l'immagine del MapIcon predefinito ha un puntatore che si trova in basso al centro dell'immagine. Pertanto, il Normalized­AnchorPoint proprietà deve essere impostata (0.5, 1.0).

Il dettaglio finale a notare sul codice è che l'oggetto MapIcon è aggiunto MapElements insieme di mappa, quindi è possibile aggiungere più di un MapIcon alla mappa, se lo si desidera.

Non non c'è alcuna garanzia che l'icona della mappa e il titolo verrà mostrati. Potrebbe essere nascosta se nasconderanno altri elementi o etichette sulla mappa. Ciò è particolarmente vero in quanto la mappa è ingrandita (zoom livello diminuisce) e ulteriori informazioni dispongono adattarsi all'interno del controllo mappa.

Il codice in Figura 2 Visualizza la mappa in Figura 5, supponendo che stai guardando una partita di baseball in Fenway Park.

mappa controllo visualizzando Fenway Park di Boston, Massachusetts
Figura 5 mappa controllo visualizzando Fenway Park di Boston, Massachusetts

Aggiunta di controlli per il controllo della mappa l'aggiunta di un XAML control per il controllo della mappa è simile all'aggiunta di un'immagine. Il codice seguente crea un'ellisse, e le dimensioni a un cerchio, aggiunge al controllo mappa e si è incentrata su una coordinata geografica:

// Create a circle
Windows.UI.Xaml.Shapes.Ellipse fence = 
  new Windows.UI.Xaml.Shapes.Ellipse();
fence.Width = 30;
fence.Height = 30;
fence.Stroke = new SolidColorBrush(Colors.DarkOrange);
fence.StrokeThickness = 2;
MapControl.SetLocation(fence, geoposition.Coordinate.Point);
MapControl.SetNormalizedAnchorPoint(fence, new Point(0.5, 0.5));
myMapControl.Children.Add(fence);

Si noti che la funzione statica di controllo mappa SetLocation deve essere utilizzata per fissare le coordinate geografiche all'oggetto ellisse. Analogamente, la funzione SetNormalizedAnchorPoint viene utilizzata per collegare la proprietà punto di ancoraggio normalizzato.

Qualsiasi controllo che eredita da UIElement o MapItemsControl può essere aggiunto al controllo mappa usando queste tecniche.

Ottenere la posizione

Il cuore del controllo mappa è l'oggetto di BasicGeoposition, che può rappresentare ogni posizione sulla terra utilizzando solo tre numeri: latitudine, longitudine e altitudine. Non solo è questo è un modo efficace per dividere il mondo, è anche preciso. Ogni località ha la propria combinazione unica di latitudine, longitudine e altitudine. No due posizioni avrà la stessa combinazione.

Purtroppo, l'applicazione sta per interfaccia con gli esseri umani e gli esseri umani non piace rappresentare posizioni come puri valori numerici. Di conseguenza, il mondo è diviso in continenti, paesi, all'interno dei continenti, regioni (o stati) all'interno di paesi, città all'interno delle regioni e strade nelle città. Mentre il continente nomi, nomi di paese e codici postali sono unici, regioni a volte possono contenere due o più comuni con lo stesso nome. Inoltre, una città può avere due o più strade con lo stesso nome. La linea di fondo è che è possibile per un indirizzo deve essere confuso con due o più posizioni. Questo è particolarmente vero quando si tratta di una rappresentazione incompleta di un indirizzo (lasciando fuori il nome dello stato, codice postale o città).

Pertanto, se l'applicazione sta per mostrare più di posizione corrente dell'utente, che può essere estratto direttamente dal dispositivo, sarà necessario convertire tra i sistemi numerici e denominati precedentemente descritti. Il processo di conversione di un indirizzo di una località geografica è conosciuto come geocodifica. Il processo di conversione di una posizione geografica di un indirizzo leggibile è noto come reverse geocoding.

Conversione di un indirizzo in una posizione geografica (Geocoding) Geocoding un indirizzo richiede l'uso della mappatura dei servizi API — l'insieme delle classi trovato dello spazio dei nomi Windows.Services.Maps. Per utilizzare queste API, è necessario impostare il Token di autenticazione nella proprietà statica ServiceToken della classe MapService. La seguente riga di codice viene illustrato come fare questo (il resto di questo articolo presuppone che questa riga di codice è nell'evento OnLaunched dell'applicazione):

MapService.ServiceToken = "Place your token here";

Una volta che il Token di autenticazione è stato impostato, è possibile utilizzare la funzione statica di FindLocationsAsync, che si trova nella classe MapLocationFinder. Ecco come utilizzare la funzione FindLocationsAsync:

Geolocator geolocator = new Geolocator();
Geoposition currentPosition = await geolocator.GetGeopositionAsync();

MapLocationFinderResult result = await MapLocationFinder.FindLocationsAsync(
  address, currentPosition.Coordinate.Point, 5);

Il primo parametro della funzione FindLocationsAsync è una rappresentazione di stringa di un indirizzo. Qualsiasi stringa può essere passata a questa funzione. I servizi di mappatura del posteriore, che comunica la funzione FindLocationsAsync, farà il meglio che possibile per trovare una posizione corrispondente. Il secondo parametro è noto come punto di riferimento e rappresenta la posizione geografica in cui deve iniziare la ricerca. Questo parametro è a volte indicato come un suggerimento. Se usato correttamente può aumentare notevolmente la rilevanza delle posizioni restituite e la velocità con cui essi sono calcolati. Ad esempio, se sai che l'utente sta facendo una ricerca locale, passare nella posizione corrente dell'utente come punto di riferimento. Tuttavia, se si conosce che l'utente sta progettando la sua vacanza, passare la posizione del suo hotel. Il parametro finale è il numero massimo di posizioni che verrà restituito.

Il valore restituito della funzione FindLocationsAsync è un oggetto di tipo MapLocationFinderResult. Vi dirà se la ricerca è stata eseguita o non. Se la ricerca ha successo, il MapLocation­FinderResult oggetto conterrà un insieme di oggetti MapLocation. Il codice in Figura 6 controlla il successo della ricerca e se è successo, mette insieme in un controllo ListView affinché tutte le sedi di corrispondenza possono essere visualizzate all'utente. L'oggetto MapLocation contiene sia informazioni indirizzo leggibile e le informazioni geografiche che possono essere utilizzate dal MapControl. Il codice in Figura 6 potrebbe essere facilmente convertito per mostrare push pin su un controllo della mappa.

Figura 6 recuperando i risultati di una ricerca di posizione

if (result.Status == MapLocationFinderStatus.Success)
{
  List<string> locations = new List<string>();
  foreach (MapLocation mapLocation in result.Locations)
  {
    // create a display string of the map location
    string display = mapLocation.Address.StreetNumber + " " +
      mapLocation.Address.Street + Environment.NewLine +
      mapLocation.Address.Town + ", " +
      mapLocation.Address.RegionCode + "  " +
      mapLocation.Address.PostCode + Environment.NewLine +
      mapLocation.Address.CountryCode;
    // Add the display string to the location list.
    locations.Add(display);
  }
  // Bind the location list to the ListView control.
  lvLocations.ItemsSource = locations;
}
else
{
  // Tell the user to try again.
}

Conversione di una posizione geografica in un indirizzo (Reverse Geocoding) un'altra caratteristica utile può fornire un'applicazione di mapping è la possibilità di ottenere un indirizzo leggibile da una zona toccata di controllo mappa. Per questa caratteristica di codice, è innanzitutto necessario un modo per ottenere la posizione del controllo che è stato toccato dall'utente. Questo può essere realizzato utilizzando l'evento MapTapped del controllo mappa. Il controllo della mappa ha anche un evento Tapped, che viene generato quando un bambino XAML del controllo mappa è tappato. Qualsiasi rubinetto diretto del controllo mappa passa attraverso l'evento MapTapped. Il codice in Figura 7 viene illustrata un'implementazione dell'evento MapTapped che visualizza l'indirizzo della posizione maschiata in un controllo TextBlock.

Figura 7 trovando l'indirizzo di una posizione filettata sul controllo mappa

private async void myMapControl_MapTapped(MapControl sender, 
  MapInputEventArgs args)
{
  // Find the address of the tapped location.
  MapLocationFinderResult result =
    await MapLocationFinder.FindLocationsAtAsync(args.Location);
  if (result.Status == MapLocationFinderStatus.Success)
  {
    if (result.Locations.Count > 0)
    {
      string display = result.Locations[0].Address.StreetNumber + " " +
        result.Locations[0].Address.Street;
      tbAddress.Text = display;
    }
  }
}

Ci sono alcuni dettagli vale la pena chiamare in questa implementazione dell'evento MapTapped. In primo luogo, il geopoint che ha associato la posizione maschiata è passato a questo evento tramite args.Posizione. La funzione FindLocationsAtAsync può utilizzare questo geopoint per ottenere un indirizzo leggibile. Questa funzione è una funzione statica nella classe MapLocationFinder, che fa parte dei servizi di mapping API (spazio dei nomi Windows.Services.Maps). Questa funzione restituisce un oggetto MapLocationFinderResult che contiene una proprietà Status e un insieme di oggetti MapLocation. Anche se il valore restituito consente per un insieme di oggetti MapLocation, solitamente ci sarà solo un oggetto MapLocation. Tuttavia, ci potrebbe essere un grattacielo da qualche parte nel mondo che ha due o più indirizzi stradali connessi con esso. Se un utente fa clic al centro di un grande campo o un lago, un valore ancora verrà restituito. Se non non c'è nessun indirizzo effettivo nelle vicinanze, l'oggetto MapLocation conterrà solo la regione, paese e codice postale.

Itinerari

I servizi di mappatura possono calcolare rotte da un determinato punto di partenza per un dato punto finale. Il controllo della mappa è in grado di visualizzare il percorso, che può essere calcolato come guida itinerari o percorsi a piedi.

Guida itinerari come il nome implica, guida itinerari sono destinati a essere guidato in qualche veicolo non viaggia nel modo sbagliato giù una strada a senso unico e deve obbedire a tutte le altre regole della strada. Il codice in Figura 8 calcola le indicazioni stradali da Grand Central Station di New York City a Central Park.

Figura 8 calcolo un percorso di guida

// Start at Grand Central Station.
BasicGeoposition startLocation = new BasicGeoposition();
startLocation.Latitude = 40.7517;
startLocation.Longitude = -073.9766;
Geopoint startPoint = new Geopoint(startLocation);
// End at Central Park.
BasicGeoposition endLocation = new BasicGeoposition();
endLocation.Latitude = 40.7669;
endLocation.Longitude = -073.9790;
Geopoint endPoint = new Geopoint(endLocation);
// Get the route between the points.
MapRouteFinderResult routeResult =
await MapRouteFinder.GetDrivingRouteAsync(
  startPoint,
  endPoint,
  MapRouteOptimization.Time,
  MapRouteRestrictions.None,
  290);

Il codice è abbastanza semplice. La funzione statica MapRouteFinder.GetDrivingRouteAsync viene passata un punto di partenza, un punto finale, un parametro di ottimizzazione (descritto più avanti) e un parametro che specifica le restrizioni (anche descritte più avanti). Il quinto ed ultimo parametro è un'intestazione opzionale che specifica la direzione corrente­zione dell'utente in com­passare gradi (0 gradi rappresenta nord, rappresenta 180 gradi sud e così via). Questo è utile quando rotte vengono calcolate mentre l'utente sta guidando. Quando viene utilizzato il parametro voce, l'itinerario viene calcolato sulla base il senso corrente dell'utente della corsa. Le gambe di qualche prime della route conterrà manovre che convincere l'utente il miglior percorso possibile, particolarmente utile all'interno delle città dove l'utente potrebbe essere su una strada a senso unico nella direzione sbagliata. Cambiando l'intestazione a 135 nel codice in Figura 8 provoca il percorso da calcolare tale che esso contiene un modo legale per cambiare direzione.

Una volta che hai un risultato dalla MapRouteFinder.GetDrivingRoute­funzione Async, bisogno di controllarlo. Se un percorso è stato recuperato, quindi può essere visualizzato come turn-by-turn istruzioni. L'itinerario può anche essere visivamente visualizzato in un controllo di mappa. Il codice in Figura 9 Visualizza il percorso da Grand Central Station a Central Park come turn-by-turn istruzioni.

Figura 9 scorrendo in rotta le gambe e le manovre di rotta

if (routeResult.Status == MapRouteFinderStatus.Success)
{
  // Use the route to initialize a MapRouteView.
  MapRouteView viewOfRoute = new MapRouteView(routeResult.Route);
  viewOfRoute.RouteColor = Colors.Blue;
  viewOfRoute.OutlineColor = Colors.Blue;
  // Add the new MapRouteView to the Routes collection
  // of the MapControl.
  MapwithDrivingRoute.Routes.Add(viewOfRoute);
  // Fit the MapControl to the route.
  await MapwithDrivingRoute.TrySetViewBoundsAsync(
    routeResult.Route.BoundingBox,
    null,
    Windows.UI.Xaml.Controls.Maps.MapAnimationKind.Bow);
}

L'oggetto MapRoute contiene informazioni di riepilogo che indica quanto tempo dovrebbe prendere per attraversare il percorso e la lunghezza del percorso in metri. L'oggetto MapRoute organizza informazioni di percorso utilizzando gli oggetti MapRouteLeg e MapRouteManeuver. Un MapRoute contiene uno o più oggetti MapRouteLeg e ogni MapRouteLeg contiene uno o più oggetti di MapRouteManeuver. Le informazioni che verranno visualizzate all'utente sono nell'oggetto MapRouteManeuver. Gli oggetti MapRouteManeuver contengono naviga­zionale istruzioni, uscire informazioni (se applicabile), lunghezza della manovra e manovra avvisi (se applicabile). La proprietà Kind è anche molto utile. I valori di esempio includono svolta a sinistra, svoltare a destra e così via. Può essere utilizzato per associare un'immagine a ogni manovra. Un elenco completo dei valori possibili per la proprietà Kind è reperibile in bit.ly/1nXOyi7. Figura 10 illustrato che cosa queste direzioni sarebbe simile a un'applicazione.

Turn-by-Turn indicazioni per un percorso di guida
Figura 10 Turn-by-Turn indicazioni per un percorso di guida

Percorsi possono anche essere visualizzati graficamente all'interno di un controllo della mappa (vedere Figura 11).

Figura 11 mostrando un itinerario visivamente in una mappa di controllo

// Display summary info about the route.
tbTurnByTurn.Inlines.Add(new Run()
{
  Text = "Total estimated time (minutes) = "
    + routeResult.Route.EstimatedDuration.TotalMinutes.ToString("F1")
});
tbTurnByTurn.Inlines.Add(new LineBreak());
tbTurnByTurn.Inlines.Add(new Run()
{
  Text = "Total length (kilometers) = "
    + (routeResult.Route.LengthInMeters / 1000).ToString("F1")
});
tbTurnByTurn.Inlines.Add(new LineBreak());
// Display the directions.
tbTurnByTurn.Inlines.Add(new Run()
{
  Text = "DIRECTIONS"
});
tbTurnByTurn.Inlines.Add(new LineBreak());
// Loop through the legs and maneuvers.
int legCount = 0;
foreach (MapRouteLeg leg in routeResult.Route.Legs)
{
  foreach (MapRouteManeuver maneuver in leg.Maneuvers)
  {
    tbTurnByTurn.Inlines.Add(new Run()
    {
      Text = maneuver.InstructionText
    });
    tbTurnByTurn.Inlines.Add(new LineBreak());
  }
}

Per visualizzare un itinerario in un controllo della mappa è necessario prima creare una visualizzazione del percorso utilizzando la classe MapRouteView. Una volta che avete una vista è possibile aggiungerlo all'insieme del controllo mappa itinerari. Infine, la mappa funzione del controllo TrySetViewBoundsAsync sarà misura controllo mappa tale che l'intero percorso è visibile. Questa funzione viene anche con un parametro di animazione che fornisce un effetto visivo, come il controllo della mappa è ridisegnato per accomodare la rotta. Figura 12 illustrato che cosa questo sarebbe simile a un'applicazione.

guida rotta in una controllo di mappa
Figura 12 guida rotta in una controllo di mappa

Instradare le ottimizzazioni guida itinerari può essere ottimizzata rispetto al tempo, distanza e traffico. L'enumerazione MapRouteOptimization fornisce i valori in Figura 13 per ottimizzare il calcolo di una rotta.

Figura 13 l'enumerazione MapRouteOptimization

Time L'itinerario verrà ottimizzata tale che può essere coperto in minor tempo dato il limite di velocità e distanza per ogni manovra del percorso.
Distanza L'itinerario verrà ottimizzato tali che può essere coperto nella distanza più breve, data la distanza di ogni manovra.
TimeWithTraffic L'itinerario verrà ottimizzata tale che può essere coperto in minor tempo, data la distanza, limite di velocità e condizioni di traffico attuali per ogni manovra del percorso.

 

Itinerario restrizioni rotte di guida può essere calcolato anche con restrizioni, come "no autostrade" o "nessun strade a pedaggio". Il MapRoute­restrizioni enumerazione fornisce i valori riportati Figura 14 per limitare il calcolo di un percorso di guida.

Figura 14 l'enumerazione MapRouteRestrictions

Nessuno Restrizioni non vengono applicate per il calcolo di una rotta. Il percorso può contenere manovre che includono le autostrade, tunnel, traghetti, strade a pedaggio e strade sterrate.
Autostrade L'itinerario non conterrà eventuali manovre che viaggiano in autostrada.
TollRoads L'itinerario non conterrà alcun manovre che viaggiano in una strada a pedaggio.
Traghetti L'itinerario non conterrà alcun manovre che richiedono l'utilizzo di un traghetto.
Gallerie L'itinerario non conterrà alcun manovre che viaggiano attraverso un tunnel.
DirtRoads L'itinerario non conterrà alcun manovre che viaggiano in una strada sterrata.

 

Questi valori possono essere combinati in modo logico. Ad esempio, il seguente codice è una restrizione che impedisce l'utilizzo di autostrade e strade a pedaggio:

MapRouteFinderResult routeResult =
  await MapRouteFinder.GetDrivingRouteAsync(
  startPoint,
  endPoint,
  MapRouteOptimization.Time,
  MapRouteRestrictions.Highways || MapRouteRestrictions.TollRoads);

Passeggiate itinerari calcolo da percorsi è molto simile al calcolo guida itinerari. Il codice seguente calcola un percorso a piedi basato sugli stessi punti di fine come esempio guida itinerario:

// Get the route between the points.
MapRouteFinderResult routeResult =
  await MapRouteFinder.GetWalkingRouteAsync(
  startPoint,
  endPoint);

La funzione statica che maproutefinder.getwalkingrouteasync viene utilizzato per eseguire questo calcolo. A differenza della funzione corrispondente per il calcolo dei percorsi di guida, questa funzione non ha nessun overload che consentono per le ottimizzazioni, restrizioni o voce corrente. Questi attributi non impatto calcoli di percorso a piedi perché i limiti di velocità e condizioni di traffico non sono pertinenti. Inoltre, la voce corrente può essere facilmente modificata. Percorsi a piedi sono calcolati per la distanza più breve. Le immagini in Figura 15 e in Figura 16 Visualizza il percorso a piedi dalla Grand Central Station a Central Park.

Turn-by-Turn indicazioni per un itinerario a piedi
Figura 15 Turn-by-Turn indicazioni per un itinerario a piedi

a piedi l'itinerario indicato in un controllo di mappa
Figura 16 a piedi l'itinerario indicato in un controllo di mappa

Conclusioni

In questo articolo ho mostrato come utilizzare il nuovo controllo mappa per Windows Phone 8.1, tra cui la visualizzazione della mappa di base, aggiungendo immagini e aggiunta di controlli. Anche introdotto il sottostante mappatura servizi API e dato un'occhiata alla geocodifica, geocodifica inversa e calcoli di rotta.

Dovrebbe essere considerato un certo numero di altri argomenti correlati al mapping: sovrapposizione piastrelle immagini, dati di associazione e la gestione di mappe offline. Si possono trovare informazioni su questi argomenti su Windows Dev Center (bit.ly/X7S7ei).


Keith Pijanowski ha più di 20 anni di esperienza nel settore software. Ha lavorato per start-up e grandi aziende in ruoli che spaziavano dalla scrittura di codice per lo sviluppo del business. Attualmente, sta lavorando per se stesso come consulente indipendente. Pijanowski vive nella zona di New York City, ma non ha mai applaudito per una squadra sportiva di New York. Contattarlo al keithpij@msn.com o twitter.com/keithpij.

Grazie al seguente Microsoft esperto tecnico per la revisione di questo articolo: Mike o ' Malley
Mike O'Malley è Senior Program Manager, sistemi operativi di Microsoft. Ha lavorato su Mmap-sviluppatore relativo esperienze per Microsoft per tre anni e ha presentato posizione - sviluppo di applicazioni consapevoli a costruire ogni anno.