В этой заметке я продолжу рассказ о картографическом сервисе CloudMade (начало смотри здесь) и рассмотрю, как можно использовать API HTTP-маршрутизатора.
Для использования сервиса Вам необходимо будет зарегистрироваться на сайте и получить ключ API для вашего домена, если Вы это не делали раньше.
Для получения данных о маршруте между двумя точками необходимо отправить запрос к маршрутизатору по протоколу HTTP.
Пример такого запроса:
http://routes.cloudmade.com/56eded06210846ecbb758f29e7c28152/api/0.3/56.32233,43.948743,56.315914,43.99581/bicycle.js?lang=ru |
Разберем пример подробно, а затем я перечислю все параметры которые можно использовать в запросе.
В самом началеhttp://routes.cloudmade.com/ — это адрес сервера к которому мы обращаемся.
Следующий параметр через слеш — ключ API для Вашего сайта.
После этого идет параметр API и версия API — 0.3.
Затем, через запятую указываются координаты начальной и конечной точки маршрута (широта, долгота).
Следующий параметр bicycle — определяет вид передвижения (на велосипеде).
Предпоследний параметр (js) — определяет формат вывода результатов JSON.
Последний (lang), после знака вопроса, язык вывода инструкций маршрутизатора (ru – русский).
Параметров для запроса к маршрутизатору существует больше чем в примере, перечислю их по порядку.
Параметры запроса к маршрутизатору:
start_point — координаты начала маршрута в формате широта, долгота (lat,lon);
end_point — координаты конца маршрута в формате широта, долгота (lat,lon);
route_type — вид передвижения (автомобиль — car, велосипед — bicycle или пешком — ‘foot );
output_format — формат вывода результатов ("js", "gpx")
Дополнительные параметры:
transit_points — указывать дополнительные точки, через которые должен пройти маршрут, они указываются в порядке следования в квадратных скобках, например, [51.2227,4.4120,51.2,4.41];
route_type_modifier — модификатор вида передвижения, на данный момент доступен один параметр — shortest, кратчайший маршрут на автомобиле;
lang — iso 2 символьный код языка вывода, по-умолчанию en, возможные значения доступных языков ( de, en, es, fr, hu, it, nl, ro, ru, se, vi, zh);
units — единицы измерения растояния, километры и мили (km или miles), по умолчанию — km;
callback — указывается функция обратного вызова, например, callback=routeLoaded, тогда ответ будет представлен в виде функции routeLoaded(JSON_object).
Возможные форматы ответа: "js" или "gpx".
Теперь рассмотрим, формат ответа маршрутизатора.
Пример ответа в формате JS (JSON):
{ "version":0.3, "status":0, "route_summary":{ "total_distance":4646, "total_time":873, "start_point":"улица Литвинова", "end_point":"улица Звездинка" }, "route_geometry":[ [ 56.32233, 43.948761 ], [ 56.322529, 43.948818 ], [ 56.323139, 43.948971 ], ... [ 56.31591, 43.995811 ] ], "route_instructions":[ [ "Направляйтесь на север по улица Литвинова", 202, 0, 36, "0.2 км", "N", 9.7 ], [ "Поверните направо на Канавинская улица", 241, 6, 87, "0.2 км", "S", 179.4, "TR", 94.1 ], [ "Поверните налево", 155, 9, 28, "0.2 км", "E", 82.4, "TL", 264.6 ], ... [ "Примите вправо на улица Звездинка", 14, 89, 3, "14 м", "E", 70.5, "TSLR", 25.1 ] ] } |
Параметр version — обозначает версию API, в данном случае 0.3
status — обозначает получен ответ (0) или произошла ошибка (1)
Если произошла ошибка, то следующим идет параметр status_message — содержит сообщение об ошибке.
route_summary — содержит данные о маршруте
total_distance — длина маршрута в метрах;
total_time — время движения по маршруту в секундах;
start_point — название начальной точки маршрута;
end_point — название конечной точки маршрута;
В случае указания в запросе транзитных точек, они перечисляются в параметре transit_points: [[наименование точки, широта, долгота], … [наименование точки, широта, долгота]]
route_geometry — содержит в себе координаты всех точек маршрута в виде массива, в проекции wgs84(EPSG:4326) .
route_instructions — содержит набор инструкций о движении по маршруту.
Параметры для инструкций:
Первая строка — текст инструкции, например, Поверните направо;
length, double — длина отрезка маршрута в метрах;
position, int — значение координат первой точки сегмента в route_geometry;
length_caption , String — длина сегмента в указанных единицах, например, 22 м, 23,4 км, 14,4 км
earth_direction , String — направление движения по сторонам света начала отрезка маршрута (в настоящее время поддерживаются только 8 направлений, N, NE, E, SE, S, SW, W, NW);
azimuth, double — азимут;
turn_type , String — код типа очереди, опционально, отсутствует для первого сегмента:
— C — продолжать (сразу),
— TL — поворот налево.
— TSLL — поворот налево плавный,
— TSHL — повернуть строго налево,
— TR — повернуть направо,
— TSLR — плавно повернуть направо,
TSHR — резкий поворот направо,
ТU — разворот
turn_angle — угол в градусах поворота между двумя сегментами, 0 для двигаться прямо, 90, повернуть
направо, 270, повернуть налево, 180 для разворота.
Пример в формате GPX:
<?xml version="1.0" encoding="UTF-8"?> <gpx creator="CloudMade" version="1.1" xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"> <metadata> <author> <name>CloudMade</name> <email id="support" domain="cloudmade.com" /> <link rel="nofollow" href="http://maps.cloudmade.com"></link> </author> <copyright author="CloudMade"> <license>http://cloudmade.com/faq#license</license> </copyright> <time>2011-10-16T09:22:21</time> </metadata> <extensions> <distance>4646</distance> <time>873</time> <start>улица Литвинова</start> <end>улица Звездинка</end> </extensions> <wpt lat="56.322327" lon="43.948761"/> <wpt lat="56.322525" lon="43.948826"/> <wpt lat="56.323135" lon="43.948967"/> ... <wpt lat="56.31591" lon="43.995811"/> <rte> <rtept lat="56.322327" lon="43.948761"> <desc>Направляйтесь на север по улица Литвинова, 0.2 км</desc> <extensions> <distance>202</distance> <time>36</time> <offset>0</offset> <distance-text>0.2 км</distance-text> <direction>N</direction> <azimuth>9.7</azimuth> </extensions> </rtept> <rtept lat="56.323509" lon="43.950462"> <desc>Поверните направо на Канавинская улица, 0.2 км</desc> <extensions> <distance>241</distance> <time>87</time> <offset>6</offset> <distance-text>0.2 км</distance-text> <direction>S</direction> <azimuth>179.4</azimuth> <turn>TR</turn> <turn-angle>94.1</turn-angle> </extensions> </rtept> <rtept lat="56.321678" lon="43.950409"> <desc>Поверните налево, 0.2 км</desc> <extensions> <distance>155</distance> <time>28</time> <offset>9</offset> <distance-text>0.2 км</distance-text> <direction>E</direction> <azimuth>82.4</azimuth> <turn>TL</turn> <turn-angle>264.6</turn-angle> </extensions> </rtept> ... <rtept lat="56.315872" lon="43.995602"> <desc>Примите вправо на улица Звездинка, 14 м</desc> <extensions> <distance>14</distance> <time>3</time> <offset>89</offset> <distance-text>14 м</distance-text> <direction>E</direction> <azimuth>70.5</azimuth> <turn>TSLR</turn> <turn-angle>25.1</turn-angle> </extensions> </rtept> </rte> </gpx> |
Документацию по использованию API HTTP-маршрутизатора CloudMade можно прочитать здесь.
Вы скажете, все это конечно хорошо, но для чего это можно использовать?
Вы можете это использовать для организации сервиса построения маршрутов на своем сайте и не обязательно использовать полностью API CloudMade.
Я покажу Вам простой пример реализации такого проекта с использованием API Google Maps и API HTTP-маршрутизатора CloudMade.
1. Используем карту Google
В этом примере мы будем использовать API Google Maps v3 для отображения карты и построения на ней рассчитанного маршрута.
Начальная и конечная точка маршрута задаются путем клика мышью по карте в нужных местах, после этого формируется запрос со значениями координат к HTTP-маршрутизатору CloudMade, ответ в формате JSON затем обрабатывается, по координатам строится с помощью полилинии маршрут, а с права от карты выводится текст с инструкциями о движении по маршруту.
Рассмотрим код примера.
В начале, после определения необходимых стилей, мы подключаем JavaScript-библиотеку jQuery из хранилища скриптов Google и API Google Maps v3.
После этого в функции инициализации мы определяем переменные для хранения данных:
counter — счетчик числа кликов по карте;
points — массив для хранения координат точек маршрута;
start_point, end_point — для хранения строки с координатами начальной и конечной точки.
Фрагмент кода:
var myOptions = { zoom: 14, center: new google.maps.LatLng(56.32233,43.948743), mapTypeId: google.maps.MapTypeId.ROADMAP }; var map = new google.maps.Map(document.getElementById('map_canvas'), myOptions); |
служит для определения параметров карты: центра карты 56.32233,43.948743, начального масштаба — 14, типа карты — MapTypeId.ROADMAP и размещения стандартных элементов управления на карте.
Карту мы будем создавать в контейнере с id=’map_canvas’.
После мы определяем обработчик кликов по карте google.maps.event.addListener
При каждом клике по карте мы увеличиваем счетчик кликов counter на единицу и проверяем его значение.
Если counter==1, то мы запоминаем координаты точки в переменной start_point, а на карте размещаем маркер.
Если counter==2, то мы также запоминаем координаты точки в end_point, на карту помещаем маркер и формируем запрос к HTTP-маршрутизатору CloudMade.
В запросе мы передаем координаты точек, а также 56eded06210846ecbb758f29e7c28152 — значения ключа API для нашего сайта, версию используемого API – 0.3, параметр car — вид перемещения на автомобиле, js — формат ответа JS(JSON), язык ответа для инструкций — lang=ru, а так как мы производим междоменный запрос передаем имя функции обратного вызова callback, в простейшем случае можно указать значение callback=?
Посылаем запрос методом getJSON и обрабатываем ответ в функции function(json).
С начала мы проверяем значение статуса, если все прошло без ошибок то оно должно равняться нулю.
Разбераем полученные данные, выводим значения:
Растояние всего, м
Время в пути, сек
Начало
Конец
Текст инструкций выводим в контейнер с id=’result’
Координаты точек маршрута добавляем в массив points и по ним строим полилинию на карте.
В случае, если counter имеет значение отличное от 1 или 2 присваиваем ему 0.
И последнее для загрузки карты необходимо с начала полностью загрузить код страницы, это определяется событием google.maps.event.addDomListener(window, ‘load’, initialize);
2. Используем карту OpenStreetMap
Здесь код похож на рассмотренный ранее, отличие заключается в том, что мы создаем новый тип карты OpenStreetMap и работаем с ним.
Хотелось бы увидеть пример Http-маршрутизатора на основе сервиса CloudMade, но по множеству точек (более двух). спасибо.