Отображение маршрутов и направлений на карте
Внимание
Bing Maps для выхода на пенсию службы Enterprise
Службы MapControl UWP и карты из пространства имен Windows.Services.Maps используют карты Bing. Карты Bing для предприятия устарели и будут прекращены, в то время как mapControl и службы больше не будут получать данные.
Дополнительные сведения см. в документации по Центру разработчиков карт Bing и картам Bing.
Примечание.
Для служб MapControl и служб карт требуется ключ проверки подлинности карт с именем MapServiceToken. Дополнительные сведения о получении и настройке ключа проверки подлинности карт см. в разделе "Запрос ключа проверки подлинности карт".
Запрашивайте маршруты и направления, а также отображайте их в своем приложении.
Примечание.
Если сопоставление не является основной функцией приложения, попробуйте запустить приложение Карты Windows. Схемы URI и ms-walk-to:
URI можно использовать bingmaps:
ms-drive-to:
для запуска приложения Карты Windows для определенных карт и поворотных направлений. См. сведения в руководстве по запуску приложения "Карты Windows".
Введение в результаты MapRouteFinder
Вот как связаны классы маршрутов и направлений:
Класс MapRouteFinder имеет методы, которые получают маршруты и направления. Эти методы возвращают MapRouteFinderResult.
MapRouteFinderResult содержит объект MapRoute. Доступ к этому объекту через свойство Route объекта MapRouteFinderResult.
MapRoute содержит коллекцию объектов MapRouteLeg. Получите доступ к этой коллекции с помощью свойства Legs mapRoute.
Каждый MapRouteLeg содержит коллекцию объектов MapRouteManeuver. Получите доступ к этой коллекции с помощью свойства Maneuvers mapRouteLeg.
Получите маршрут для вождения или ходьбы, вызвав методы класса MapRouteFinder . Например, GetDrivingRouteAsync или GetWalkingRouteAsync.
При запросе маршрута можно указать следующие моменты:
Можно указать только начальную точку и конечную точку или предоставить ряд точек пути для вычисления маршрута.
Точки останова добавляют дополнительные ноги маршрута, каждый из которых имеет собственный маршрут. Чтобы указать точки останова, используйте любые перегрузки GetDrivingRouteFromWaypointsAsync.
С помощью точки пути определяются промежуточные расположения между точками останова . Они не добавляют ноги маршрута. Они являются лишь точками пути, через которые должен пройти маршрут. Чтобы указать точки пути, используйте любые перегрузки 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.
Ниже приведена версия этого примера, которая использует точку пути между двумя точками останова:
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);
}
}