Отображение маршрутов и направлений на карте

Примечание

MapControl и службы карт требуют ключ проверки подлинности Maps, который называется MapServiceToken. Дополнительные сведения о получении и установке ключа проверки подлинности карт см. в статье Запрос ключа проверки подлинности карт.

Запрашивайте маршруты и направления, а также отображайте их в своем приложении.

Примечание

Чтобы получить дополнительные сведения об использовании карт в приложении, скачайте пример карты универсальной платформы Windows (UWP). Если работа с картами является второстепенной функцией приложения, то рекомендуется использовать приложение "Карты Windows". Вы можете использовать bingmaps:, ms-drive-to:и схемы URI ms-walk-to: для запуска приложения "Карты Windows" с определенными картами и маршрутами. См. сведения в руководстве по запуску приложения "Карты Windows".

 

Общие сведения о результатах MapRouteFinder

Классы маршрутов и направлений связаны следующим образом.

  • Класс MapRouteFinder использует методы, позволяющие получать маршруты и направления. Эти методы возвращают MapRouteFinderResult.

  • MapRouteFinderResult содержит объект MapRoute. Получите доступ к этому объекту через свойство Route класса MapRouteFinderResult.

  • MapRoute содержит коллекцию объектов MapRouteLeg. Получите доступ к этой коллекции с помощью свойства Legs класса MapRoute.

  • Каждый MapRouteLeg содержит коллекцию объектов MapRouteManeuver. Получите доступ к этой коллекции с помощью свойства Maneuvers класса MapRouteLeg.

Получите маршрут и направления, чтобы добраться до места пешком или на машине, вызвав методы класса MapRouteFinder. Например, GetDrivingRouteAsync или GetWalkingRouteAsync.

При запросе маршрута можно указать следующее:

  • Можно указать только начальную и конечную точки или несколько точек для составления маршрута.

    Пункты Stop добавляют дополнительные отрезки маршрута, каждому из которых соответствует свой объект Itinerary. Для указания пунктов stop используйте любую из перегрузок GetDrivingRouteFromWaypointsAsync.

    Пункт Via определяет промежуточные точки между пунктами stop. Они не добавляют отрезки маршрута. Они представляют собой простые точки, через которые должен пролегать маршрут. Для указания пунктов via используйте любую из перегрузок GetDrivingRouteFromEnhancedWaypointsAsync.

  • Можно задать оптимизацию (например, использовать кратчайший путь).

  • Можно указать ограничения (например, избегать магистрали).

Отображение направлений

В объекте MapRouteFinderResult содержится объект MapRoute, доступ к которому можно получить с помощью свойства Route.

Созданный класс MapRoute имеет свойства, показывающие время прохождения маршрута и его длину, а также содержит коллекцию объектов MapRouteLeg, составляющих отрезки маршрута. Каждый объект MapRouteLeg содержит коллекцию объектов MapRouteManeuver. В объекте MapRouteManeuver содержатся направления, доступ к которым можно получить с помощью свойства InstructionText.

Важно!

Прежде чем использовать службы карт, необходимо указать ключ проверки подлинности карт. Дополнительные сведения см. в статье Запрос ключа проверки подлинности карт.

 

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

Этот пример отображает в текстовом поле 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.

Отображение маршрутов

Чтобы отобразить MapRoute в MapControl, постройте MapRouteView с MapRoute. Затем добавьте MapRouteView в коллекцию Routes элемента MapControl.

Важно!

Прежде чем использовать службы карт или элемент управления картой, необходимо указать ключ проверки подлинности карт. Дополнительные сведения см. в статье Запрос ключа проверки подлинности карт.

 

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

В этом примере показан следующий элемент управления MapControl с именем MapWithRoute.

элемент управления картой с отображенным маршрутом

Вот версия этого примера, в которой используется пункт via между двумя пунктами stop:

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