Как добавить карты Bing Maps в Windows-приложение на HTML и JavaScript. Часть 2

OSzone.net » Microsoft » Разработка приложений » Windows (до Windows 10) » Как добавить карты Bing Maps в Windows-приложение на HTML и JavaScript. Часть 2
Иcточник: msdn.microsoft.com
Опубликована: 29.01.2015

В этой части мы будем продолжать улучшать нашу карту и добавлять различные полезные функции, такие как определение GPS-координаты, построение маршрутов и отображение информации о дорожной ситуации.

Добавляем текущую координату пользователя

Для отображения текущей координаты пользователя на карте, в Bing Maps SDK используется класс GeoLocationProvider.

Для класса GeoLocationProvider доступны следующие методы:

Для того, чтобы добавить отображение текущей позиции пользователя, создайте объект GeoLocationProvider, затем при помощи метода getCurrentPosition определите текущую позицию пользователя и добавьте метку на карту.

function GpsBtn_Tapped() {
map.entities.clear();
            // инициализация geoLocationProvider
            if (!geoLocationProvider)
            {
                geoLocationProvider = new Microsoft.Maps.GeoLocationProvider(map);
            }
            //Получение текущей позиции пользователя
            geoLocationProvider.getCurrentPosition({
                successCallback: function (e) {
                    map.entities.push(new Microsoft.Maps.Pushpin(e.center));
                }, errorCallback: function (e) {
         //Обработка случая невозможности определения координаты пользователя
                    var dialog = new Windows.UI.Popups.MessageDialog('Unable to locate you.', "GPS");
                    dialog.showAsync();
                }
        });
  }

Вы можете отобразить на карте GPS координаты метки или просто координаты центра карты. Для начала, добавьте в HTML файл элемент для отображения координат. Далее, в функцию GetMap добавьте обработчик события viewchange, затем добавьте значение широты и долготы в ваш HTML-элемент.

<span id='coordinateDisplay'"></span>
Microsoft.Maps.Events.addHandler(map, 'viewchange', function (e) {
            var center = map.getCenter();
            document.getElementById('textBox').innerText = center.latitude.toFixed(5) +
            ',' + center.longitude.toFixed(5);
         });

*
Увеличить


Обратите внимание: Вам необходимо добавить возможность определения геолокации в манифесте приложения. Для того, чтобы это сделать, откройте файл package.appxmanifest, перейдите во вкладку Возможности (Capabilities), поставьте галочку напротив Location.

*
Увеличить


Возможность узнать свои координаты или отобразить текущее местоположение пользователя, конечно, полезная, но, давайте перейдем к другим интересным возможностям, например, разберем, как можно работать с адресами – искать объекты и отображать их на карте.

Реализуем поиск по местам

SDK Bing Maps предоставляет возможность работы с геокодированием – процессом обработки введенного адреса и отображения его на карте. Обратное геокодирование делает противоположную задачу – преобразует координату точки на карте в адрес. Для реализиции поиска в Bing Maps используется класс SearchManager.

Для класса SearchManager доступны следующие методы:

НазваниеОписание
geocodeОбрабатывает введенный адрес и отображает его на карте. При этом результаты запроса возвращаются в callback функцию.
reverseGeocodeПреобразует координату точки на карте в адрес. При этом результаты запроса возвращаются в callback функцию.
searchВыполняет поиск, основанный на указанных параметрах запроса и возвращает результаты в callback функцию.

Для того, чтобы геокодировать место, вам необходимо передать объект, содержащий свойства геозапроса в метод geocode. Чаще всего используются следующие свойства параметра запроса:

НазваниеТипОписание
callbackфункцияЗапрос вызова функции в случае возврата успешного результата от запроса геокода. Функция callback получит объект GeocodeResult в качестве аргумента.
countчислоМаксимальное число результатов для возврата. Максимальное число, которое может быть возвращено – 20.
errorCallbackфункцияЗапрос вызова функции в случае возврата неуспешного результата от запроса. Функция callback получит объект, содержащий свойства запроса геокода.
whereстрокаСтрока, содержащая адрес или место, которое надо сопоставить с отображением на карте.

Когда пользователь вводит запрос на определение места по адресу (или наоборот), то этот запрос обрабатывается функцией GeocodeModule. Для реализации мы будем использовать Search module.

Общий план реализации геокодирования следующий:

Обратите внимание: alert не поддерживается в Windows Store apps. Вместо alert мы будем пользоваться классом Windows.UI.Popups.MessageDialog.

function GeocodeModule() {
    ClearMap();

    if (searchManager) {
        var request = {
            where: document.getElementById('searchTbx').value,
            count:1,
            callback: geocodeCallback,
            errorCallback: geocodeError
        };

        searchManager.geocode(request);
    } else {
        //Загружаем Search module и создаем search manager.
        Microsoft.Maps.loadModule('Microsoft.Maps.Search', {
            callback: function () {
                //Создаем search manager
                searchManager = new Microsoft.Maps.Search.SearchManager(map);

                //Реализуем логику поиска
                GeocodeModule();
            }
        });
    }
}

function geocodeCallback(response, userData) {
    if (response &&
        response.results &&
        response.results.length > 0) {
        var r = response.results[0];
        var l = new Microsoft.Maps.Location(r.location.latitude, r.location.longitude);

        //Отображаем результат на карту
        var p = new Microsoft.Maps.Pushpin(l);
        map.entities.push(p);

        //Перемещаемся к месту результата
        map.setView({ center: l, zoom : 15 });
    } else {
        ShowMessage("Geocode Response", "Not results found.");
    }
}

function geocodeError(request) {
    ShowMessage("Geocode Error", "Unable to Geocode request.");
}

function ShowMessage(title, msg) {
    var m = new Windows.UI.Popups.MessageDialog(title, msg);
    m.showAsync();
}

*
Увеличить


Готово! Теперь мы можем искать объекты на карте!

Далее разберемся с маршрутами, посмотрим, как построить маршрут по начальной и конечной точкам. 

Добавляем маршрут на карту

Для того, чтобы реализовать показ маршрута на карте, нам нужно получить от пользователя адрес начальной и конечной точек (точка А и точка В, соответственно). Воспользуемся модулем Directions module.

План работы с модулем Directions похож на работу с геокодирванием, а именно:

Обратите внимание, что вы можете выбрать тип (driving, transit, walking) рассчитываемых маршрутов при помощи свойства routеMode.

function GetRoute() {
    ClearMap();

    if (directionsManager) {
        // Определяем Route Mode
        directionsManager.setRequestOptions({ routeMode: Microsoft.Maps.Directions.RouteMode.driving });

        // Создаем точки начала и конца пути
        var startWaypoint = new Microsoft.Maps.Directions.Waypoin
        t({ address: document.getElementById(‘fromTbx’).value });
        var endWaypoint = new Microsoft.Maps.Directions.Waypoint({ address: document.getElementById(‘toTbx’).value });
        directionsManager.addWaypoint(startWaypoint);
        directionsManager.addWaypoint(endWaypoint);

        directionsManager.setRenderOptions({ itineraryContainer: document.getElementById(‘itineraryDiv’) });

        // Считаем расстояния
        directionsManager.calculateDirections();
    } else {
        //Загружаем модуль directions module и создаем directions manager.
        Microsoft.Maps.loadModule(‘Microsoft.Maps.Directions’, {
            callback: function () {
                //Создаем directions manager
                directionsManager = new Microsoft.Maps.Directions.DirectionsManager(map);

                //Логика маршрута
                GetRoute();
            }
        });
    }
}

*
Увеличить


Теперь на карте отображается путь, а слева появилась информация и подсказки по оптимальному (с точки зрения кратчайшего расстояния) пути!

Кроме расчета маршрута пользователю может быть интересна информация о текущей дорожной ситуации – пробках и дорожно-транспортных происшествиях. И вы можете предоставить ему эту информацию. Давайте посмотрим, как это сделать.

Добавляем информацию о пробках на карту

В Bing Maps SDK есть возможность показать на карте картину скорости транспортного потока (места пробок) и добавить метки дорожно-транспортных происшествий. Информация о скорости транспортного потока отображается при помощи подсветки дороги разными цветами в зависимости от скорости потока. Дорожно-транспортные происшествия показываются на карте как метки.

Для работы с информацией о дорожной ситуации доступны следующие методы:

ИмяТипОписание
getIsOnбулевВозвращает булево значение, определяющее отображается информация о дорожной ситуации или нет.
hideСкрывает всю информацию о траффике.
hideFlowСкрывает информацию о скорости транспортного потока.
hideIncidentsСкрывает информацию о дорожно-транспортных происшествиях.
hideLegendСкрывает легенду транспортного потока.
showОтображает всю информацию о транспортных потоках.
showFlowОтображает информацию о скорости транспортного потока.
showIncidentsОтображает информацию о дорожно-транспортных происшествиях.
showLegendОтображает легенду транспортного потока.
function ToggleTrafficBtn_Tapped() {
            map.entities.clear();
            if (trafficManager) {
                if (trafficManager.getIsOn()) {
                    trafficManager.hide();
                }
                else {
                    trafficManager.show();
                } } else {
                //В случае, если информация о пробках не отображалась до этого,
                //вызываем функцию отображения дорожной ситуации.
                Microsoft.Maps.loadModule('Microsoft.Maps.Traffic', {
                    callback: function () {
                        trafficManager = new Microsoft.Maps.Traffic.TrafficManager(map);
                        ToggleTrafficBtn_Tapped();
                    }
            }); }

        }

Теперь на нашей карте отображается картина скорости транспортного потока. Можно спланировать поездку в объезд всех пробок.

*
Увеличить

Итоги

У нас получилось полноценное приложение для работы с картами, при помощи которого мы можем найти необходимое место на карте по его адресу и построить маршрут, а также узнать информацию о дорожной ситуации для выбора оптимального маршрута. В Bing Maps SDK есть еще много всего интересного, читайте остальные статьи и модернизируйте свое приложение!

Дополнительные ссылки

Bing maps developer center
Bing Maps SDK для Windows 8.1 Store приложений
Bing Maps на MSDN
Видео о Bing Maps
MVA курс по мобильной разработке для веб-разработчиков
Загрузить бесплатную или пробную Visual Studio
Попробовать Microsoft Azure
Изучить курсы Microsoft Virtual Academy


Ссылка: http://www.oszone.net/26150/Windows