Статьи

Направление маршрута маршрута с помощью Bing Maps в C # / XAML в приложении для Windows 8

Вступление

Эта статья поможет вам нарисовать путь из одного места в другое с помощью Bing Maps в приложении C # / XAML Metro. В основном он использует REST-сервис Bing Maps, а вспомогательный класс используется для анализа JSON.

Фон

В одном из моих приложений для Windows 8 я должен предоставить функцию для рисования направления пути маршрута из одного места в другое с помощью Bing Maps. Я много искал в Google и, наконец, нашел пример в  JavaScript  , но я хотел его в C # / XAML. Тогда я спросил на форумах MSDN, и  Ричард Брандрит   помог мне, предоставив класс помощника BEST Maps REST Service. С этим мне удалось это сделать. Здесь я размещаю код. Все ссылки REST и шаблоны URL можно найти  здесь . Спасибо Ричарду Брандритту.

Предпосылки

Чтобы использовать Bing Maps в приложении Windows 8, вам понадобится  Bing Map SDK   и ключ для их использования. Итак, вот  статья CodeProject, которая показывает основные операции Bing Maps. А затем добавьте  службу BEST Maps REST .NET-библиотеки . Обратите внимание, что карта Bing не поддерживается в некоторых регионах. Вы можете проверить здесь. Когда это не поддерживается, вы получите красный крест на карте Bing, как показано ниже. Таким образом, чтобы установить поддерживаемый регион, вы должны установить свойство HomeRegion , в противном случае это будет пользовательский регион в Windows 8. 

Используя код

Это приложение использует REST-сервис Bing Map. Поэтому он сначала генерирует поток, чтобы получить асинхронный ответ. Поток получит URL-адрес службы REST, который может иметь в качестве параметра координаты местоположения или ориентиры, и вернет строку JSON. Класс DataContractJsonSerializer используется для сериализации ответа JSON.

private async Task<Response> GetResponse(Uri uri)
{ 
    System.Net.Http.HttpClient client = new System.Net.Http.HttpClient();
    var response = await client.GetAsync(uri);
    using (var stream = await response.Content.ReadAsStreamAsync())
    {
        DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Response));
        return ser.ReadObject(stream) as Response;
    }
}

Теперь, когда пользователь запускает, пользователь сможет передать параметры для поиска маршрута.
Пользователь может передать координаты или местоположение, в соответствии с тем, что маршрут нанесен на карту. Я передал значение для маршрута между Ахмадабадом и Мумбаи. Здесь MyMap — это элемент управления Map в XAML, а MyPushPin — это пин-код в местоположении from. Класс MapShapeLayer используется для создания слоя на карте для рисования полилиний или полигонов.

private async void btnGiveDirections_Click(object sender, RoutedEventArgs e)
{
    try
    {
        tbError.Text = string.Empty;
        if (rdCoord.IsChecked == true)
            URL = "http://dev.virtualearth.net/REST/V1/Routes/Driving?o=json&wp.0=" + 
            txtFromCoord.Text + "&wp.1=" + txtToCoord.Text + 
            "&optmz=distance&rpo=Points&key=" + MyMap.Credentials;
        else
            URL = "http://dev.virtualearth.net/REST/V1/Routes/Driving?o=json&wp.0=" + 
            txtFromLocation.Text + "&wp.1=" + txtToLocation.Text + 
            "&optmz=distance&rpo=Points&key=" + MyMap.Credentials;
        Uri geocodeRequest = new Uri(URL);
        BingMapsRESTService.Response r = await GetResponse(geocodeRequest);

        geolocator = new Geolocator();
        MyPushPin = new Pushpin();

        FromLatitude = ((BingMapsRESTService.Route)(r.ResourceSets[0].Resources[0])).RoutePath.Line.Coordinates[0][0];
        FromLongitude = ((BingMapsRESTService.Route)(r.ResourceSets[0].Resources[0])).RoutePath.Line.Coordinates[0][1];

        location = new Location(FromLatitude, FromLongitude);
        MapLayer.SetPosition(MyPushPin, location);
        MyMap.Children.Add(MyPushPin);
        MyMap.SetView(location, 15.0f);

        MapPolyline routeLine = new MapPolyline();
        routeLine.Locations = new LocationCollection();
        routeLine.Color = Windows.UI.Colors.Blue;
        routeLine.Width = 5.0;
        // Retrieve the route points that define the shape of the route.
        int bound = ((BingMapsRESTService.Route)
          (r.ResourceSets[0].Resources[0])).RoutePath.Line.Coordinates.GetUpperBound(0);
        for (int i = 0; i < bound; i++)
        {
            routeLine.Locations.Add(new Location
            {
                Latitude = ((BingMapsRESTService.Route)
                  (r.ResourceSets[0].Resources[0])).RoutePath.Line.Coordinates[i][0],
                Longitude = ((BingMapsRESTService.Route)
                  (r.ResourceSets[0].Resources[0])).RoutePath.Line.Coordinates[i][1]
            });
        }
        MapShapeLayer shapeLayer = new MapShapeLayer();
        shapeLayer.Shapes.Add(routeLine);
        MyMap.ShapeLayers.Add(shapeLayer);
    }
    catch (Exception)
    {
        tbError.Text = "Error Occured !!! Please Try Again";
    }
}

Итак, эта демонстрация показывает, как разработчик может использовать REST-сервис Bing Map для расчета маршрута и рисования на карте.