Продолжаем знакомиться с особенностями API Яндекс.Карт версии 2.х (смотрите части 1, 2, 3).
В этой заметке, на примерах, мы познакомимся с возможностями построения автомобильных маршрутов.
Первый пример, решает наиболее типичную задачу для сайтов организаций, расчет маршрута проезда до ее офиса.
Для примера, я возьму адрес недавно открывшегося в Нижнем Новгороде кинотеатра Синема Парк DeLuxe IMAX — ул. Бетанкура 1 ТРК Седьмое небо.
Рассмотрим работу примера.
Над окном карты расположена форма для ввода адреса отправления, конечный адрес у нас постоянный (Нижний Новгород, ул. Бетанкура 1).
После ввода адреса (Нижний Новгород, Варварская ул., 7), мы нажимаем на кнопку «Найти», происходит расчет и построение на карте маршрута.
Поясню исходный код примера.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Добавление маршрута на карту - API Яндекс.Карт 2.х</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <script src="http://yandex.st/jquery/1.6.4/jquery.min.js" type="text/javascript"></script> <script src="http://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU" type="text/javascript"></script> <script type="text/javascript"> var myMap, route; // Как только будет загружен API и готов DOM, выполняем инициализацию ymaps.ready(init); function init () { myMap = new ymaps.Map("map", { center: [56.326944, 44.0075], zoom: 12 }); $('#search_route').submit(function () { var start = $("#start").val(); var end = $("#end").val(); ymaps.route([ // Список точек, которые необходимо посетить [start], [end]], { // Опции маршрутизатора mapStateAutoApply: true // автоматически позиционировать карту }).then(function (router) { route && myMap.geoObjects.remove(route); route = router; myMap.geoObjects.add(route); }, function (error) { alert("Возникла ошибка: " + error.message); }); return false; }); } </script> </head> <body> <form id="search_route"> <b>Начало: </b> <input id="start" type="text" value="Нижний Новгород, " style="width: 360px;"><br /> <b>Конец: Синема Парк DeLuxe IMAX</b> <input id="end" type="text" value="Нижний Новгород, ул. Бетанкура 1" style="width: 260px;"> <input type="submit" value="Найти"/> </form> <br /> <div id="map" style="width:800px;height:600px"></div> </body> </html> |
В самом начале, мы подключаем javascript-библиотеку jquery, т. к. ее нет в новой версии API API Яндекс.Карт 2.х.
По клику на кнопке «Найти» вызывается функция в которой определяются значения полей формы search_route начало и конец маршрута.
Эти значения передаются маршрутизатору ymaps.route, а в качестве дополнительного параметра mapStateAutoApply: true — для автоматического позиционирования карты, после построения маршрута.
Далее мы проверяем существует или нет на карте уже построенный ранее маршрут, если да то удаляем его с карты, после чего добавляем новый маршрут командой myMap.geoObjects.add(route);
Если в процессе построения маршрута возникнут ошибки, выводим их во всплывающем окне.
При построении маршрута возможно задания дополнительных параметров, с одним из них mapStateAutoApply мы уже познакомились.
Перечислю остальные параметры:
avoidTrafficJams — значения true — строить маршрут с учетом пробок, false — без учета пробок При использовании опции учитывайте, что объезд пробок не всегда возможен.
Значение по умолчанию: false;
boundedBy — значение определяет область на карте, где предположительно находятся искомые объекты. Используется, если точки маршрута заданы почтовым адресом, а не координатами;
strictBounds — определяет возможность поиска только внутри области, заданной опцией boundedBy. Используется, если точки маршрута заданы почтовым адресом, а не координатами.
Значение по умолчанию: false
Давайте зададим область поиска в границах Нижнего Новгорода, тогда дополнительно указывать город в адресной строке ненужно.
Второй пример.
Код примера:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Ограничение области поиска - добавление маршрута на карту - API Яндекс.Карт 2.х</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <script src="http://yandex.st/jquery/1.6.4/jquery.min.js" type="text/javascript"></script> <script src="http://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU" type="text/javascript"></script> <script type="text/javascript"> var myMap, route; // Как только будет загружен API и готов DOM, выполняем инициализацию ymaps.ready(init); function init () { myMap = new ymaps.Map("map", { center: [56.326944, 44.0075], zoom: 12 }); $('#search_route').submit(function () { var start = $("#start").val(); var end = $("#end").val(); ymaps.route([ // Список точек, которые необходимо посетить [start], [end]], { // Опции маршрутизатора mapStateAutoApply: true, // автоматически позиционировать карту boundedBy: [[56.155974,43.549068],[56.421028,44.155787]], strictBounds: true }).then(function (router) { route && myMap.geoObjects.remove(route); route = router; myMap.geoObjects.add(route); }, function (error) { alert("Возникла ошибка: " + error.message); }); return false; }); } </script> </head> <body> <form id="search_route"> <b>Начало: </b> <input id="start" type="text" value=" " style="width: 360px;"><br /> <b>Конец: Синема Парк DeLuxe IMAX</b> <input id="end" type="text" value="Нижний Новгород, ул. Бетанкура 1" style="width: 260px;"> <input type="submit" value="Найти"/> </form> <br /> <div id="map" style="width:800px;height:600px"></div> </body> </html> |
Здесь код примера похож на предыдущий, за исключением двух параметров:
boundedBy: [[56.155974,43.549068],[56.421028,44.155787]] — задает границы области;
strictBounds: true — возможность поиска только в заданной области.
Мы можем задавать промежуточные точки для нашего маршрута.
Третий пример
В этом примере между точками start и end, мы добавляем промежуточную точку на пл. Ленина
{ type: 'viaPoint', // площадь Ленина - транзитная точка (проезжать через эту точку, но не останавливаться в ней) point: 'Нижний Новгород, площадь Ленина' }, |
Тогда при вычислении маршрута, он всегда должен будет проходить через транзитную точку.
При желании мы можем различным образом изменять стиль отображения маршрута на карте, а также обозначение начала и конца маршрута.
Четвертый пример
Здесь мы изменяем иконки на красные и добавляем текст в метки, а также изменяем цвет отображения самого маршрута и его прозрачность.
Код примера:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Задание стиля для меток и маршрута - добавление маршрута на карту - API Яндекс.Карт 2.х</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <script src="http://yandex.st/jquery/1.6.4/jquery.min.js" type="text/javascript"></script> <script src="http://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU" type="text/javascript"></script> <script type="text/javascript"> var myMap, route; // Как только будет загружен API и готов DOM, выполняем инициализацию ymaps.ready(init); function init () { myMap = new ymaps.Map("map", { center: [56.326944, 44.0075], zoom: 12 }); $('#search_route').submit(function () { var start = $("#start").val(); var end = $("#end").val(); ymaps.route([ // Список точек, которые необходимо посетить [start], [end]], { // Опции маршрутизатора mapStateAutoApply: true, // автоматически позиционировать карту }).then(function (router) { route && myMap.geoObjects.remove(route); route = router; route.options.set({ strokeColor: '0000ffff', opacity: 0.9 }); myMap.geoObjects.add(route); // С помощью метода getWayPoints() получаем массив точек маршрута // (массив транзитных точек маршрута можно получить с помощью метода getViaPoints) var points = route.getWayPoints(); // Задаем стиль метки - иконки будут красного цвета, и // их изображения будут растягиваться под контент points.options.set('preset', 'twirl#redStretchyIcon'); // Задаем контент меток в начальной и конечной точках points.get(0).properties.set('iconContent', 'Точка отправления'); points.get(1).properties.set('iconContent', 'Точка прибытия'); }, function (error) { alert("Возникла ошибка: " + error.message); }); return false; }); } </script> </head> <body> <form id="search_route"> <b>Начало: </b> <input id="start" type="text" value="Нижний Новгород, " style="width: 360px;"><br /> <b>Конец: Синема Парк DeLuxe IMAX</b> <input id="end" type="text" value="Нижний Новгород, ул. Бетанкура 1" style="width: 260px;"> <input type="submit" value="Найти"/> </form> <br /> <div id="map" style="width:800px;height:600px"></div> </body> </html> |
Цвет и величина прозрачности маршрута задается в строке
route.options.set({ strokeColor: ‘0000ffff’, opacity: 0.9 });
Еще несколько строк кода отвечают за изменения стиля конечных точек маршрута:
// С помощью метода getWayPoints() получаем массив точек маршрута // (массив транзитных точек маршрута можно получить с помощью метода getViaPoints) var points = route.getWayPoints(); // Задаем стиль метки - иконки будут красного цвета, и // их изображения будут растягиваться под контент points.options.set('preset', 'twirl#redStretchyIcon'); // Задаем контент меток в начальной и конечной точках points.get(0).properties.set('iconContent', 'Точка отправления'); points.get(1).properties.set('iconContent', 'Точка прибытия'); |
Мы легко можем заменить стандартные иконки на свои.
Пятый пример
Здесь мы задаем стили для нашей картинки:
points.options.set('preset', { iconImageHref: 'my-markers.png', // картинка иконки iconImageSize: [32, 37], // размеры картинки iconImageOffset: [16, -37] // смещение картинки }); |
Можно вывести общую длину маршрута и время в пути под картой.
Шестой пример.
Добавив после строки:
myMap.geoObjects.add(route);
следующие строки
$("#resmarshrut").append('Общая длина маршрута: '+route.getHumanLength()); $("#resmarshrut").append('<br /> Время в пути: '+route.getHumanTime()); |
В этих строчках кода мы обращаемся к соответствующим методам объекта router.Route:
getHumanLength() — он возвращает строковое представление длины маршрута с единицами измерения;
GetHumanTime() — он возвращает строковое представление времени проезда маршрута с единицами измерения.
С другими методами можно познакомиться здесь
И последний пример — это вывод маршрутного листа.
Пример кода:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Вывод путевого листа - добавление маршрута на карту - API Яндекс.Карт 2.х</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <script src="http://yandex.st/jquery/1.6.4/jquery.min.js" type="text/javascript"></script> <script src="http://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU" type="text/javascript"></script> <script type="text/javascript"> var myMap, route; // Как только будет загружен API и готов DOM, выполняем инициализацию ymaps.ready(init); function init () { myMap = new ymaps.Map("map", { center: [56.326944, 44.0075], zoom: 12 }); $('#search_route').submit(function () { var start = $("#start").val(); var end = $("#end").val(); ymaps.route([ // Список точек, которые необходимо посетить [start], [end]], { // Опции маршрутизатора mapStateAutoApply: true, // автоматически позиционировать карту }).then(function (router) { route && myMap.geoObjects.remove(route); route = router; myMap.geoObjects.add(route); // Получаем первый маршрут var way = route.getPaths().get(0), // Маршрут состоит из сегментов. Сегмент - участок маршрута, который нужно проехать // до следующего изменения направления движения. segments = way.getSegments(), moveList = 'Трогаемся,</br>'; for (var i = 0; i < segments.length; i++) { var street = segments[i].getStreet(); moveList += ('Едем ' + segments[i].getHumanAction() + (street ? ' на ' + street : '') + ', проезжаем ' + segments[i].getLength() + ' м.,'); moveList += '</br>' } moveList += 'Останавливаемся.'; $("#list").empty(); // Выводим маршрутный лист $('#list').append(moveList); }, function (error) { alert("Возникла ошибка: " + error.message); }); return false; }); } </script> </head> <body> <form id="search_route"> <b>Начало: </b> <input id="start" type="text" value="Нижний Новгород, " style="width: 360px;"><br /> <b>Конец: Синема Парк DeLuxe IMAX</b> <input id="end" type="text" value="Нижний Новгород, ул. Бетанкура 1" style="width: 260px;"> <input type="submit" value="Найти"/> </form> <br /> <div id="map" style="width:800px;height:600px"></div> <br /><br /> <div id="list"></div> </body> </html> |
В этом примере весь маршрут разбивается на сегменты и для каждого с помощью методов объекта router.Segment формируется текстовая подсказка движения по маршруту.
С другими методами можно познакомиться здесь
После сформированный маршрутный лист передается в контейнер div с id="list".
Благодарю. Отличные статьи
Отлично! А можно сделать так: тыкаешь на карте — ставится метка, тыкаешь второй раз — ставится вторая и между ними прокладывается маршрут?
Есть пример от разработчиков API маршрутизация и расчет стоимости поездки, в котором реализовано прокладка маршрута при клике на карте. Немного позже сделаю свой пример.
Проблема с «маршрутизатором» при добавлении «элементов управления картой»
После добавления в код «Элементов управления картой» перестает работать «Маршрутизатор» во всех браузерах(IE, Opera, Google Chrome), кроме Mozilla Firefox. Версии браузеров актуальны. + сами «Элементы управления» не появляются в браузерах(коме Mozilla Firefox).
Сайт на cms Joomla 1,5. Без Joomla во всех браузерах этот же код (с «элементами управления») работает без проблем.
Добавляю следующие строки:
//Элементы управления
myMap.controls
// Кнопка изменения масштаба — компактный вариант
.add(‘smallZoomControl’, { left: 10, top: 10 })
// Список типов карты
.add(‘typeSelector’)
Как вылечить?
Проблема постом выше решилась обновлением mootools.
По поводу прокладки маршрута при клике на карту — жду Ваш пример!
Написал по теме новую заметку с примером
А можно чтоб маршруты в базу записывались
желательно на жумле 2,5?
Уже руки опускаються, пишу на С# ASP в визуал студии
Не понимаю в чем проблема, Просто создаю пустую страницу АСП, вставляю выше приведенный код, любой, Карта отображаеться, все хорошо, но, маршрут не строица, брал применр с яндекса, если ввожу названия улиц ручками все хорошо, если начинаю брать из текстбоксов, ничего не работает. Помогите кто может.
Подскажите пожайлуста — а что означает символ $ в строке («#resmarshrut»).append(‘Общая длина маршрута: ‘+route.getHumanLength());
Так $ обозначаются функции в jQuery, если на сайте применяются другие JavaScript библиотеки, где $ может использоваться для своих нужд, то можно использовать её синоним — jQuery.
А как добавить, чтобы в поле ввода, автоматически находил город из списка, как это сделано на яндекс картах
Нужно иметь базу данных с именами городов и делать автодополнение при помощи AJAX.
Подскажите, а как проложить маршрут, чтобы метки вообще не выводились, или можно было задать содержимое балунов!
Вот обсуждение в клубе разработчиков которое Вам поможет
Здравствуйте! На моем сайте, расчет маршрута выдается, только если пользователь зарегистрирован, есть мысли почему так?. Все модули и пункты меню включены для всех. Спасибо!
Скажите, а как определить лежит ли какая-либо произвольная точка на маршруте или может можно узнать удаленность точки от маршрута?
Добрый день. Как добавить меню для ввода транзитных пунктов?
меню такое
var items=0;
function AddItem() {
div=document.getElementById(«items»);
button=document.getElementById(«add»);
items++;
newitem=»Пункт » + items + «: «;
newitem+=»»;
newnode=document.createElement(«span»);
newnode.innerHTML=newitem;
div.insertBefore(newnode,button);
}
в функцию search_route добавил var items = $(«#items»).val();
А че карты 2,0 существовали уже в 2012 году? Ого! Я думал это недавняя версия