November 2014

Volume 29 Number 11

Dieser Artikel wurde maschinell übersetzt.

Windows Phone 8.1 - Mapping in Windows Phone 8.1

Keith Pijanowski | November 2014

Laden Sie die Codebeispiele herunter

Jede Generation von Windows Phone bringt verbesserte Funktionen für die Zuordnung und Windows Phone 8.1, das neue anzeigen-Steuerelement mit Visual Studio 2013 eingeführt Update 3, ist keine Ausnahme. Wenn alles was Sie brauchen ist eine einfache Karte, zentriert auf einer angegebenen Position erreichen Sie dies durch das neue anzeigen-Steuerelement mit nur wenigen Zeilen Code. Aber wenn du musst auf Benutzerinteraktionen reagieren, die Darstellung des Steuerelements anpassen oder Routen zu berechnen, können auch das neue anzeigen-Steuerelement und die Mapping-Services-API für diese komplexeren Szenarien.

Dieser Artikel behandelt das neue Windows Phone 8.1 Karte-Steuerelement und die Mapping-Services-APIs. Ich werde zunächst grundlegende Karte anzeigen-Eigenschaften anzeigen, dann schauen Sie sich erweiterte Funktionen, die zeigen, wie Push-Pins auf der Karte an einer angegebenen Adresse. Ich werde Ihnen auch zeigen, wie XAML Bedienungselemente für die Karte, und wie man die GPS-Position (und Adresse), die zu einem bestimmten Punkt auf der Karte entspricht. Dies ist nützlich, möchten Sie erlauben dem Benutzer, berühren Sie eine Position von Interesse, und bestimmen Sie die GPS-Position und Straße und Hausnummer. Schließlich zeige ich wie zu fahren und zu Fuß Richtung berechnen.

Ein guter Begleiter zum Material ich werde Deckung ist im September 2014-Artikel "Schaffung einer Location-Aware App mit Geofencing," von Tony Champion. Ein Geofence ist ein bestimmtes Anbaugebiet rund um eine GPS-Position, die mit Windows registriert werden kann. Sobald die Region registriert ist, kann eine Anwendung Benachrichtigungen empfangen, wenn das Gerät eintritt oder dieses die Region verlässt. Geofencing ist auch neu für Windows Phone 8.1. Wenn Sie eine Anwendung erstellen, die Geofencing verwendet werden, erwägen Sie das Karte-Steuerelement können Benutzer angeben Geofences und zeigen ihre vorhandenen Geofences.

Während ich dies schreibe gibt es ein anderes Steuerelement anzeigen für jeden Geschmack von Mobile und Tablet-Plattform:

  • 8.0/8.1 und Windows Phone Silverlight-Anwendungen: Microsoft.Phone.Maps.Controls.Map
  • Windows-Speicher-8.x-Anwendungen: Bing.Maps.Map
  • Windows Phone 8.1 Runtime-Anwendungen: Windows.UI.Xaml.Controls.Maps

Dieser Artikel konzentriert sich auf die neue Karte-Kontrolle und Mapping-Diensten, die in Anwendungen für die Windows Phone 8.1 Runtime verwendet werden können.

Erste Schritte

Authentifizierung der Anwendung Your Windows Phone-Anwendung muss authentifiziert werden, jedes Mal, wenn das Steuerelement anzeigen oder die Mapping-Dienste gefunden in der Windows.Services.Maps-Namespace verwendet. Um die Anwendung zu authentifizieren, benötigen Sie einen Kartendienst ApplicationID und ein Kartendienst Token Authentifizierung, beide aus dem Developer Dashboard im Windows Phone Dev Center abgerufen werden können. Hier finden Sie detaillierte Anweisungen für das erhalten einer ApplicationID und AuthenticationToken aus dem MSDN Library-Artikel bei bit.ly/1y78M2F.

Sobald Sie sie haben, müssen Sie den ApplicationID innerhalb der Datei der Anwendung Package.appxmanifest zu platzieren. Anweisungen hierzu sind auch in der MSDN Library-Artikel. Sie verwenden die Karte Service Authentication Token in Ihrem Code wie Sie später in diesem Artikel sehen werden.

Funktionen viele der Beispiele in diesem Artikel verwenden Sie die aktuelle Position des Benutzers und der Karten-Manager eventuell im Internet. Die Internet und Lage Fähigkeiten sollten daher in der Anwendungsmanifestdatei deklariert werden, wie in Abbildung 1. Allerdings funktionieren die Mapping-Diensten auch ohne Internetverbindung Wenn Karten zur offline-Nutzung heruntergeladen werden. Weitere Informationen zum Herunterladen von Karten finden Sie unter "wie zum Download und Update Offline Karten (XAML)" unter bit.ly/1nXBOrS.

Internet und Lage Funktionen deklarieren
Abbildung 1 Internet und Lage Funktionen deklarieren

Angezeigte Produkte: Karten

Anzeigen einer einfachen Karte Hinzufügen eines Map-Steuerelements zu einer Seite ist so einfach wie jedes andere Steuerelement hinzufügen. Sie das Steuerelement aus der Toolbox Visual Studio auf Ihre Seite ziehen können, oder Sie können den XAML-Code wie folgt eingeben:

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

Beachten Sie die MapServiceToken-Eigenschaft. Diese Eigenschaft muss der Wert der Karte Service Authentication Token angegeben werden, die Ihre Anwendung in der Developer-Auswertung des Windows Phone Dev Center zugewiesen wurde. Beachten Sie, dass Sie die Karten-Manager wie jedes andere Steuerelement positionieren können. Die Karten-Manager muss nicht den gesamten Bildschirm zu dominieren. Eine kleine Karte gezoomt in eine bestimmte Lage machen eine effektive visuelle auf einer Seite, die standortspezifische Informationen enthält. Auf der anderen Seite benötigen Karten die gezoomt werden (oder können vom Benutzer herausgezoomt) zusätzliche Immobilien. Erwägen Sie für solche Karten die ganze Seite.

Das vorangehende XAML wird uninteressant Ergebnisse erzeugen, wenn innerhalb einer Anwendung platziert und führen. Dieses Steuerelement wird zeigen, dass die Karte vollständig herausgezoomt. Daher ist der nächste Schritt mit dem Map-Steuerelement, um einen bestimmten Ort als den Mittelpunkt der Karte sowie die Zoom-Stufe zu identifizieren.

Der folgende Code zuerst berechnet aktuelle Position des Benutzers und dann wird diese Position in der Eigenschaft der Karte. Er legt auch die Zoomstufe auf 15. Der Mindestwert für die Zoom-Stufe ist 1, die zeigt die Karte vollständig herausgezoomt — und halben Globus in Ihre Karte-Steuerelement angezeigt. Der maximale Wert für die Zoom-Stufe ist 20, die das Steuerelement anzeigen in einer bestimmten Straße Adresse vergrößern können:

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;

Hinzufügen von Bildern zu den Karten-Manager Wenn Sie eine bestimmte Position auf der Karte markieren möchten, können Sie Bilder mit einem Titel auf der Karte-Steuerelement hinzufügen. Der Code in Abbildung 2 verweist auf die aktuelle Position des Geräts durch Hinzufügen eines Bildes aus dem Projektordner Vermögenswerte an das Steuerelement anzeigen.

Abbildung 2 die Karte-Steuerelement ein benutzerdefiniertes Bild hinzufügen

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

Um ein Bild zu Ihrem anzeigen-Steuerelement hinzufügen, zunächst erstellen Sie ein MapIcon-Objekt und legen Sie seine Location-Eigenschaft auf eine Geopoint, die die Position von Interesse auf der Karte darstellt. Der Code in Abbildung 2 wird die aktuelle Position des Benutzers verwendet. Die Title-Eigenschaft ist der Text, der über dem Bild angezeigt wird, die die Karte-Steuerelement hinzugefügt wird.

Um das Bild anzugeben, legen Sie die MapIcon Image-Eigenschaft mithilfe der RandomAccessStreamReference.CreateFromUri-Methode. Dies ist eine statische Methode in der Windows.Storage.Streams-Namespace gefunden. Das Bild sollte etwa 50 x 50 Pixel; Wenn es größer ist, wird es nach unten skaliert werden.

Wenn dein Bild an einem bestimmten Ort zu zeigen soll, ist es eine bewährte Methode, die MapIcon NormalizedAnchorPoint-Eigenschaft verwenden. Diese Eigenschaft können Sie den Punkt in Ihrem Bild angeben, die auf den angegebenen Geopoint positioniert wird. Wenn Ihr Bild eine Reißzwecke, wäre dies die Spitze des Stiftes. Wenn Sie ein Bild eines Pfeils verwenden, wäre dieser Punkt die Spitze des Pfeils. Der Standardwert für die NormalizedAnchorPoint-Eigenschaft ist ein Point-Objekt erstellt, mit dem Wert (0, 0), der die obere linke Ecke des Bildes darstellt. Die unteren rechten Ecke des Bildes ist (1,1). Dieses Koordinatensystem ist abgebildet Abbildung 3 mit wenigen Messpunkten.

Koordinatensystem verwendet für die NormalizedAnchorPoint-Eigenschaft
Abbildung 3-Koordinatensystem verwendet für die NormalizedAnchorPoint-Eigenschaft

Wenn das Bild als Symbol der Karte einen Zeiger enthält und die NormalizedAnchorPoint-Eigenschaft nicht korrekt festgelegt ist, wird das Symbol "Karte" auf eine falsche Position auf der Karte zeigen. Wenn Ihr Bild lediglich ein Punkt oder kleinen Kreis, würde Sie einen Wert (0,5; 0,5), verwenden, der das Zentrum des Bildes ist.

Wenn Sie ein Bild angeben, der MapControl hat ein Standardbild angezeigt, die Abbildung 4, die verwendet werden.

das Standardsymbol Karte
Abbildung 4 das Standardsymbol Karte

Wie Sie sehen können, hat das Standard-MapIcon-Bild einen Zeiger unten in der Mitte des Bildes liegt. Daher die Normalized­AnchorPoint-Eigenschaft muss festgelegt werden, um (0.5, 1.0).

Das letzte Detail über den Code zu bemerken ist, dass die Kartensammlung MapElements das MapIcon-Objekt hinzugefügt wird, so dass Sie mehr als eine MapIcon zur Karte hinzufügen können, wenn Sie es wünschen.

Es gibt keine Garantie, das das Symbol "Karte" und der Titel angezeigt werden. Es kann ausgeblendet werden, wenn es, andere Elemente oder Beschriftungen auf der Karte dunkel wird. Dies gilt insbesondere, da die Karte herausgezoomt ist (Zoom Level sinkt) und weitere Informationen innerhalb des Steuerelements anzeigen passen muss.

Der Code in Abbildung 2 zeigt die Karte in Abbildung 5, vorausgesetzt, du schaust einem Baseballspiel im Fenway Park.

Karte Kontrolle Ergebnis Fenway Park in Boston, Massachusetts.
Abbildung 5 Karte Kontrolle Ergebnis Fenway Park in Boston, Massachusetts.

Hinzufügen von Steuerelementen zu den Karten-Manager Hinzufügen einer XAML Steuerelement für das Map-Steuerelement ist ähnlich wie das Hinzufügen eines Bildes. Der folgende Code erzeugt eine Ellipse, passt es zu einem Kreis, dem Map-Steuerelement hinzugefügt und konzentriert es sich auf eine geographische Koordinate:

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

Beachten Sie, dass die Karten-Manager statische Funktion SetLocation verwendet werden muss, die geographische Koordinate an das Ellipsenobjekt anfügen. Ebenso wird die SetNormalizedAnchorPoint-Funktion verwendet, um die Eigenschaft Normalized Ankerpunkt zu befestigen.

Die Karten-Manager, die mit diesen Techniken kann jedes Steuerelement, das von UIElement oder MapItemsControl erbt hinzugefügt werden.

Immer die Lage

Das Herz des Steuerelements anzeigen ist das BasicGeoposition-Objekt, das jedem Ort auf der Erde mit nur drei Zahlen darstellen kann: Breite, Länge und Höhe. Nicht nur ist dies ist eine effiziente Möglichkeit, den Globus zu unterteilen, sondern auch präzise. Jeder Ort hat seine eigene einzigartige Kombination von Breite, Länge und Höhe. Keine zwei Orten haben die gleiche Kombination.

Leider Ihre Anwendung wird als Schnittstelle zu den Menschen, und Menschen nicht gern Standorte als reine Zahlenwerte darstellen. Folglich gliedert sich der Erde in Kontinente, Länder innerhalb der Kontinente, Regionen (oder Staaten) innerhalb der Länder, Städte, Regionen und Straßen innerhalb von Städten. Während Kontinent Namen, Ländernamen und Postleitzahlen eindeutig sind, können Regionen manchmal zwei oder mehrere Städte mit dem gleichen Namen enthalten. Darüber hinaus kann eine Stadt mindestens zwei Straßen mit dem gleichen Namen haben. Das Endergebnis ist, dass es möglich für eine Adresse mit zwei oder mehreren Orten zu verwechseln. Dies gilt insbesondere, wenn es um eine unvollständige Darstellung einer Adresse (Name des Bundeslandes, Postleitzahl oder Stadt verlassen).

Daher, wenn Ihre Anwendung kommt mehr als aktuelle Position des Benutzers, die direkt vom Gerät abgerufen werden können, müssen Sie konvertieren zwischen den Systemen numerischen und benannten zuvor beschrieben. Der Prozess der Konvertierung einer Adresse in einem geografischen Ort bekannt als Geokodierung. Der Prozess der Konvertierung eines geographischen Ort in eine lesbare Adresse bekannt als reverse Geocoding.

Konvertieren eine Adresse in einem geografischen Standort (Geocoding) Geocoding eine Adresse erfordert die Verwendung des Mapping-services-APIs — die Sammlung von Klassen im Namespace Windows.Services.Maps gefunden. Um diese APIs verwenden, müssen Sie in die statische Eigenschaft ServiceToken der Klasse MapService Ihr Token Authentifizierung festlegen. Die folgende Codezeile zeigt, wie dies zu tun (der Rest dieses Artikels wird davon ausgehen, dass diese Codezeile in das OnLaunched-Ereignis der Anwendung):

MapService.ServiceToken = "Place your token here";

Sobald die Authentication Token festgelegt wurde, können Sie die statische FindLocationsAsync-Funktion, das in der MapLocationFinder-Klasse zu finden ist. Hier finden Sie die FindLocationsAsync-Funktion verwenden:

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

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

Der erste Parameter der Funktion FindLocationsAsync ist eine String-Darstellung einer Adresse. Eine beliebige Zeichenfolge kann an diese Funktion übergeben werden. Die Backend-Mapping-Diensten, die die FindLocationsAsync-Funktion kommuniziert, werden das beste, was, die es, um eine passende Stelle zu finden kann. Der zweite Parameter ist bekannt als Bezugspunkt und stellt die geografische Lage, wo die Suche begonnen werden soll. Dieser Parameter wird auch bezeichnet als Hinweis. Richtig eingesetzt kann es erheblich erhöhen, die Relevanz der zurückgegebenen Standorte und die Geschwindigkeit, mit der sie berechnet sind. Z. B. Wenn Sie, dass der Benutzer eine lokale Suche geht wissen, dann übergeben Sie die aktuelle Position des Benutzers als Referenzpunkt. Jedoch wenn Sie, dass der Benutzer ihre Urlaubsplanung ist wissen, übergeben Sie die Lage ihres Hotels. Der letzte Parameter ist die maximale Anzahl der Standorte, die zurückgegeben wird.

Der Rückgabewert der Funktion FindLocationsAsync wird ein Objekt vom Typ MapLocationFinderResult. Es wird Ihnen sagen, wenn die Suche erfolgreich oder nicht war. Wenn die Suche erfolgreich war die Kartenregion­FinderResult-Objekt enthält eine Auflistung von Objekten Kartenregion. Der Code in Abbildung 6 überprüft den Erfolg der Suche, und wenn es erfolgreich ist, platziert die Auflistung in einem ListView-Steuerelement, sodass alle passenden Orte für den Benutzer angezeigt werden können. Das Kartenregion-Objekt enthält Informationen lesbare Adresse und geographische Informationen, die von der MapControl verwendet werden kann. Der Code in Abbildung 6 konnte leicht um die Push-Pins für ein Steuerelement anzeigen Karte konvertiert werden.

Abbildung 6 Abrufen der Ergebnisse einer Location-Suche

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.
}

Umwandlung von einer geographischen Position in eine Adresse (Reverse Geocoding) ein weiteres nützliches Feature eine Mapping-Anwendung bieten ist die Fähigkeit, eine lesbare Adresse aus einem berührt Bereich des Steuerelements anzeigen. Um dieses Feature zu codieren, benötigen Sie zuerst eine Möglichkeit, die Position des Steuerelements abzurufen, die von dem Benutzer angesprochen wurde. Dies kann erreicht werden, mit dem MapTapped-Ereignis des Steuerelements anzeigen. Das Karte-Steuerelement verfügt über ein Tapped-Ereignis, das ausgelöst wird, wenn ein XAML-Kind des Steuerelements Karte getappt ist. Direkten Hahn des Steuerelements anzeigen geht durch das MapTapped-Ereignis. Der Code in Abbildung 7 zeigt eine Implementierung des MapTapped-Ereignisses, das die Adresse des Standortes getappt in einem TextBlock-Steuerelement anzeigt.

Abbildung 7 finden der Adresse eine getappte Lage auf der Karte kontrollieren

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

Es gibt ein paar Details Wert rief in dieser Implementierung des MapTapped-Ereignisses. Zuerst wird der Geopoint, die getappten Standort zugeordnet ist zu dieser Veranstaltung über Args übergeben.Lage. Die FindLocationsAtAsync-Funktion kann diese Geopoint verwenden, um eine lesbare Adresse abzurufen. Diese Funktion ist eine statische Funktion in der MapLocationFinder-Klasse, die die Mapping-Services-API (Windows.Services.Maps Namespace) gehört. Diese Funktion gibt ein MapLocationFinderResult-Objekt, eine Statuseigenschaft und eine Auflistung von Kartenregion Objekten enthält. Auch wenn der Rückgabewert für eine Auflistung von Kartenregion Objekten ermöglicht es, es in der Regel gibt nur eine Kartenregion-Objekt. Jedoch möglicherweise ein Hochhaus, der irgendwo in der Welt, die zwei oder mehr Adressen zugeordnet hat. Klickt ein Benutzer in der Mitte ein großes Feld oder See, wird noch ein Wert zurückgegeben werden. Ist keine eigentliche Straße in der Nähe, enthält das Kartenregion-Objekt nur die Region, Land und Postleitzahl.

Routen

Die Mapping-Diensten können Routen von einem bestimmten Ausgangspunkt zu einem bestimmten Endpunkt berechnen. Das Map-Steuerelement selbst kann Anzeige der Route, welche als treibende Routen oder Wanderwege berechnet werden kann.

Fahrtrouten wie der Name schon sagt, treibende Routen sollen in einigen Fahrzeug gefahren werden, das wird nicht den falschen Weg nach unten eine Einbahnstraße Reisen und muss alle anderen Verkehrsregeln. Der Code in Abbildung 8 berechnet die Wegbeschreibungen von New Yorker Grand Central Station zum Central Park.

Abbildung 8 eine Fahrt-Route berechnen

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

Der Code ist relativ einfach. Ein Startpunkt, Endpunkt, eine Optimierung der Parameter (wird später beschrieben) und einen Parameter, der angibt, Einschränkungen (auch später beschrieben), wird die statische Funktion MapRouteFinder.GetDrivingRouteAsync übergeben. Der fünfte und letzte Parameter ist eine optionale Überschrift, die die aktuellen Direc gibt­Tion des Benutzers im com­Grad (0° steht für Norden, 180 Grad stellt Süden und so weiter) zu übergeben. Dies ist nützlich, wenn Routen berechnet werden, während der Benutzer fährt. Wenn der Überschrift-Parameter verwendet wird, ist die Route anhand der Benutzer aktuelle Fahrtrichtung berechnet. Die ersten paar Beine der Route enthält Manöver, die den Benutzer für die beste Route zu erhalten, die besonders in den Städten ist wo der Benutzer eine unidirektionale unterwegs sein könnte in die falsche Richtung. Ändern der Überschrift auf 135 im Code in Abbildung 8 führt die Route berechnet werden, so dass es enthält einen legalen Weg um Richtungen zu ändern.

Sobald Sie ein Ergebnis aus der MapRouteFinder.GetDrivingRoute haben­Async-Funktion, die Sie benötigen, um es zu überprüfen. Wenn eine Route erfolgreich abgerufen wurde, kann es dann als Turn-by-Turn-Anweisungen angezeigt werden. Die Route kann auch visuell in einem Map-Steuerelement angezeigt werden. Der Code in Abbildung 9 zeigt die Route von Grand Central Station, Central Park als Turn-by-Turn-Anweisungen.

Abbildung 9 durchlaufen Route Beine und Route-Manöver

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

Das MapRoute-Objekt enthält zusammenfassende Informationen, der angibt, wie lange es dauern sollte, um die Route und die Länge der Strecke in Metern zu durchlaufen. Das MapRoute-Objekt organisiert Route-Informationen mithilfe von MapRouteLeg und MapRouteManeuver-Objekte. Ein MapRoute enthält mindestens ein MapRouteLeg-Objekt und jedes MapRouteLeg enthält ein oder mehrere MapRouteManeuver-Objekte. Die Informationen, die dem Benutzer angezeigt wird ist das MapRouteManeuver-Objekt. Die MapRouteManeuver-Objekte enthalten Naviga­Tional Anweisungen, Ausfahrt Informationen (falls zutreffend), die Länge der Manöver und Manöver-Hinweise (falls zutreffend). Die Kind-Eigenschaft ist auch sehr nützlich. Beispielwerte sind Links abbiegen, rechts abbiegen und So weiter. Es kann verwendet werden, um jedes Manöver ein Bild zuordnen. Eine vollständige Liste der möglichen Werte für die Kind-Eigenschaft finden Sie unter bit.ly/1nXOyi7. Abbildung 10 zeigt, wie diese Anweisungen in einer Anwendung aussehen würde.

Turn-by-Turn Richtungen für eine Fahrt-Route
Abbildung 10 Turn-by-Turn Richtungen für eine Fahrt-Route

Routen können auch grafisch in einem Map-Steuerelement angezeigt werden (siehe Abbildung 11).

Abbildung 11 zeigt einen Weg visuell in einem Steuerelement anzeigen

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

Um eine Route in einem Map-Steuerelement anzuzeigen müssen Sie zuerst einen Blick auf die Route mithilfe der MapRouteView-Klasse erstellen. Sobald Sie eine Ansicht haben können Sie es auf die Strecken-Auflistung des Steuerelements anzeigen hinzufügen. Schließlich wird TrySetViewBoundsAsync der Karte Kontrollfunktion Steuerelements Karte Größe so, dass die gesamte Strecke angezeigt wird. Diese Funktion kommt sogar mit einem Animation-Parameter, der die einen visuellen Effekt das Karte-Steuerelement neu gezeichnet werden wird ermöglicht, um die Route zu berücksichtigen. Abbildung 12 zeigt, wie dies in einer Anwendung aussehen würde.

Route fahren, in einem Steuerelement anzeigen
Abbildung 12 Route fahren, in einem Steuerelement anzeigen

Route Optimierungen Fahrtrouten in Bezug auf Zeit, Distanz und Verkehr optimiert werden kann. Die MapRouteOptimization-Enumeration stellt die Werte in Abbildung 13 für die Berechnung einer Route zu optimieren.

Abbildung 13 der MapRouteOptimization-Enumeration

Zeit Die Route wird optimiert werden, so dass es in kürzester Zeit die Entfernung und Geschwindigkeit Begrenzung für jedes Manöver der Route abgedeckt werden kann.
Distanz Die Route wird optimiert, so dass es in den kürzesten Abstand den Abstand jedes Manöver gegeben abgedeckt werden kann.
TimeWithTraffic Die Route wird optimiert, so dass es in kürzester Zeit die Entfernung abgedeckt werden kann Geschwindigkeitsbegrenzung und aktuellen Verkehrsbedingungen für jedes Manöver der Route.

 

Route Einschränkungen Fahrtrouten kann auch errechnet werden, mit Einschränkungen, z. B. "keine Highways" oder "keine Mautstraßen." Die MapRoute­Einschränkungen-Enumeration stellt Werte in Abbildung 14 zur Einschränkung der Berechnungdes eine Fahrstrecke.

Abbildung 14 die MapRouteRestrictions-Enumeration

Keine Aktion Keine Einschränkungen gelten für die Berechnung einer Route. Die Route kann Manöver enthalten mit Autobahnen, Tunnel, Fähren, gebührenpflichtige Straßen und Feldwege.
Autobahnen Die Route enthält keine Manöver, die über eine Autobahn zu reisen.
Mautsrassen Die Route enthält keine Manöver, die Reisen über eine Mautstraße.
Fähren Die Route enthält keine Manöver, die die Verwendung einer Fähre erfordern.
Tunnel Die Route enthält keine Manöver, die durch einen Tunnel fahren.
DirtRoads Die Route enthält keine Manöver, die Reisen über eine unbefestigte Straße.

 

Diese Werte können logisch kombiniert werden. Der folgende Code ist z. B. eine Einschränkung, die die Verwendung von Autobahnen und Mautstraßen verhindert:

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

Wanderwege Berechnung der Wanderwege ist sehr ähnlich zu treibende Routen berechnen. Im folgende Code wird ein Fernwanderweg, der auf der Grundlage von die gleichen Endpunkte wie das treibende Strecke Beispiel berechnet:

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

Die statische Funktion MapRouteFinder.GetWalkingRouteAsync wird verwendet, um diese Berechnung durchführen. Im Gegensatz zur entsprechenden Funktion für die Berechnung der treibender Routes hat diese Funktion keine Überladungen, für Optimierungen, Einschränkungen oder aktuellen Kurs. Diese Attribute auswirken nicht walking Route Berechnungen, weil Geschwindigkeitsbegrenzungen und Verkehrsbedingungen nicht relevant sind. Außerdem kann die aktuelle Position leicht geändert werden. Wanderwege sind für die kürzeste Entfernung berechnet. Die Bilder in Abbildung 15 und in Abbildung 16 zeigen der Fernwanderweg von Grand Central Station zum Central Park.

Turn-by-Turn Richtungen für eine Walking-Strecke
Abbildung 15 Turn-by-Turn Richtungen für eine Walking-Strecke

Wanderweg angezeigt in einem Steuerelement anzeigen
Abbildung 16 Wanderweg angezeigt in einem Steuerelement anzeigen

Zusammenfassung

In diesem Artikel habe ich gezeigt, wie das neue anzeigen-Steuerelement für Windows Phone 8.1, einschließlich grundlegende Kartendarstellung, Hinzufügen von Bildern und Hinzufügen von Steuerelementen verwendet. Ich auch die zugrunde liegenden Mapping-Services-API eingeführt und warf einen Blick auf die Geocodierung, reverse Geocoding und Route Berechnungen.

Eine Reihe anderer Themen mit Bezug zu Zuordnung sollten berücksichtigt werden: Überlagerung gekachelte Bilder, Daten binden und offline Karten verwalten. Finden Sie Informationen zu diesen Themen im Windows Dev Center (bit.ly/X7S7ei).


Keith Pijanowski hat mehr als 20 Jahre Erfahrung in der Softwarebranche. Er arbeitete für Start-ups und Großunternehmen in Rollen, die reichten von Schreiben von Code für die Entwicklung. Derzeit arbeitet er als unabhängiger Berater für sich selbst. Pijanowski lebt in New York City gelegen, aber hat nie für einen New York-Sport-Team bejubelt. Sie erreichen ihn am keithpij@msn.com oder twitter.com/keithpij.

Unser Dank gilt dem folgenden technischen Experten von Microsoft für die Durchsicht dieses Artikels: Mike O' Malley
Mike O'Malley ist leitender Programmmanager, Betriebssysteme von Microsoft. Er arbeitet auf Mmap-Verwandte Entwickler für Microsoft-Erlebnisse für drei Jahre und hat über Lage - unterstützende Anwendungsentwicklung bauen jedes Jahr vorgelegt.