Как записать маршрут движения на смартфоне
Недавно у меня возникла необходимость отображать маршрут между двумя точками на карте Google в моем приложении. На Хабре уже были публикации на эту тему. Например, «Маршруты на картах Google в вашем Android-приложении». Однако этим материалам уже довольного много времени и они не используют новых возможностей. Хочу показать еще один способ рисования маршрутов, может быть, кому-то он окажется полезен.
Я опущу процесс интеграции Google карт в приложение, интересующиеся могут найти всю информацию в подробном руководстве от Google. Весь процесс отображения маршрутов состоит из нескольких этапов:
- Получение информации о маршруте;
- Обработка полученного ответа;
- Рисование маршрута на карте.
Получение маршрута
Для получения информации о маршруте мы должны выполнить запрос к службе маршрутов Google. Полное описание запросов и возвращаемых запросов доступны на сайте Google. Я лишь отмечу, что для получения маршрута мы должны выполнить запрос вида:
В качестве output мы можем выбрать XML, либо (в нашем случае) JSON. К числу обязательных параметров относятся origin и destination — их можно указать в виде текстового представления адреса, либо в виде значений широты и долготы, разделенных запятой. Третий обязательный параметр sensor указывает на то, исходит ли запрос от устройства с датчиком положения, либо нет — в нашем случае всегда будет равен true.
После того, как мы разобрались с форматом запроса, необходимо выбрать способ, которым мы будем выполнять наш запрос к службе маршрутов Google и получать ответ. Я использую библиотеку Retrofit, которая позволят выполнять формировать запросы к REST-сервисам буквально в пару строк.
Для использования Retrofit необходимо подключить библиотеку к вашему проекту. С использованием gradle это делается добавлением одной строки зависимости в ваш gradle-файл:
Далее нам необходимо описать API службы маршрутов Google. Для этого мы создаем новый Java-интерфейс, где мы создаем некоторое количество методов и при помощи аннотаций Retrofit сопоставляем их с различными методами на сервере. Так как мы будем получать только информацию, нам нужно описать только один метод для GET-запроса:
Аннотация GET в качестве аргумента принимает директорию на сервере, к которой должен выполняться запрос, а уже в самом методе аннотируем каждый его параметр аннотацией Query. Как аргумент для каждой аннотации имя параметра, который мы включаем в запрос. В данном случае для параметров origin и destination я устанавливаю свои значения для флага encodeValue, при помощи которого я сообщаю Retrofit, чтобы он не кодировал запятую, которая разделяет значения широты и долготы в моем запросе. Также я добавляю еще один параметр language для того, что бы ответ от сервера приходил на русском языке. Наш REST-метод должен возвращать некий объект, назовем его RouteResponse. Его мы опишем позже, а пока просто создадим еще один класс с именем RouteResponse.
После того, как мы описали API нашей службы, мы можем выполнить запрос. Для этого нам надо создать RestAdapter, создать сервис, представляющий удаленную службу и вызвать у него метод нашего API:
Вот и все, что нужно, чтобы получить маршрут от службы маршрутов Google. Добавив в конструктор RestAdapter строку , вы можете выполнить запрос, и увидеть у себя в логе ответ от сервера. Но мы на этом не останавливаемся.
Обработка полученного ответа
В результате выполнения запроса мы получим объект RouteResponse. На самом деле, поскольку от сервера мы запросили JSON, то и ответ от сервера придет в JSON-формате. Retrofit, получив ответ от сервера, самостоятельно запускает парсинг JSON с использованием парсера от Google GSON, а уж тот парсит JSON в объект RouteResponse. При желании можно выбрать другой парсер — Jackson, либо JSON-парсер от Instagram, но я предпочитаю пользоваться GSON. GSON идет в комплекте с Retrofit, поэтому никаких дополнительных зависимостей для его использования нам в проект включать не надо.
Для того, чтобы доставать какие-то данные из JSON-ответа, нам нужно создать класс, описывающий эти данные. Мы уже создали класс RouteResponse, осталось наполнить его каким-то содержимым. Общая структура ответа от сервера службы маршрутов Google такова:
Как видим, в ответе нам приходит массив маршрутов Routes, который содержит массив отрезков Legs, состоящий из шагов Steps, составляющих отрезок маршрута, и информации об отрезке. В ранних примерах маршруты строились на основе информации о каждом шаге отрезка, однако уже в объекте Route содержится объект Overview_polyline — это объект с массивом закодированных элементов points, которые представляют приблизительный (сглаженный) путь результирующего маршрута. В большинстве случаев этого сглаженного маршрута будет достаточно. Поэтому для рисования я буду использовать именно его.
На основе этой информации мы пишем наш класс модели для GSON:
Выполнив запрос и получив объект RouteResponse мы можем получить из него строку points. В своем исходном состоянии она нам мало что дает. Для того, чтобы добыть из нее какую-то информацию, нам нужно расшифровать ее. Здесь нам придет на помощь класс PolyUtil из библиотеки Google Maps Android API utility library. Чтобы им воспользоваться, нужно включить следующую зависимость в ваш проект:
PolyUtil содержит метод decode(), принимающий строку Points и возвращающий набор объектов LatLng, узлов нашего маршрута. Этого нам достаточно для того, чтобы нарисовать наш маршрут на карте.
Рисование маршрута на карте
В старых примерах для рисования маршрута использовался Overlay, мы же обойдемся классом Polyline — в этом случае нам не нужно создавать дополнительный класс, наследуемый от Overlay и объем кода, который нам необходимо написать, радикально сокращается. Polyline — это список точек на карте и линия, их соединяющая. Polyline затем можно добавить на карту:
Для начала мы создаем экземпляр класса PolylineOptions и устанавливаем толщину и цвет линии. Затем получаем экземпляр LatLngBuilder для построения ограничивающего прямоугольника, который будет использоваться для того, чтобы масштабировать карту. Дальше мы проходим по списку объектов LatLng, полученному в результате расшифровки ответа от API маршрутов Google и добавляем каждую точку на линию в и LatLngBuilder. Для первого и последнего объекта в списке, которые представляют собой координаты начальной и конечной точки соответственно, мы создаем маркеры и добавляем их на карту. После завершения перебора элементов списка мы добавляем построенную линию на карту вызовом метода addPolyline().
Затем нам нужно масштабировать карту таким образом, чтобы отобразить весь маршрут. Перемещение по карте выполняется при помощи метода moveCamera() класса Camera, который принимает на вход настройки камеры в объекте UpdateCamera. Объект CameraUpdate мы создаем вызовом метода newLatLngBoudns у класса UpdateCameraFactory. Мы пеередаем ему созданный нами объект LatLngBounds, который содержит все точки нашего маршрута и передаем ему ширину нашего экрана и добавляем отступ от краев. После этого мы вызываем метод для передвижения камеры. И всё, маршрут нарисован.
Программа представляет собой оболочку, в которую загружаются карты Google. Поверх карты она рисует пройденный путь в виде линии, по умолчанию красного цвета, но можно настроить приложение так, что цвет лини будет зависеть от скорости движения. Кроме GPS-маршрутов в приложении доступна обширная статистика движения, а также графики скорости и высоты от расстояния. Приложение может собирать статистику не только при помощи GPS-модуля. Оно также поддерживает внешние датчики, подключенные по bluetooth (например, пульсометр).
Программа будет полезна всем, кто занимается активным отдыхом: спортсменам-бегунам, велосипедистам, мотоциклистам, автомобилистам, а также всем желающим, кто хочет поделиться своим маршрутом с другими.
Использование приложения
Для записи трека, перед началом своего путешествия, включите GPS-приемник в вашем телефоне, запустите приложение и нажмите красную кнопку внизу экрана. Начнется запись пройденного пути.
Запись можно приостановить или возобновить, повторно нажав на ту же кнопку. По завершении своей прогулки нажмите на соседнюю кнопку "Остановить". Появится диалог сохранения трека, в котором по желанию можно указать название, вид активности (например: пеший туризм, велосипед и т.д.) и описание. Именем трека по умолчанию выступает название улицы или населенного пункта, определенного по картам Google.
Сохраненный трек можно просмотреть кликнув по нему. На первом экране "Карта" будет подгружена карта Google и наложен на нее пройденный вами путь, разбитый на участки равного интервала времени (задается в настройках). Традиционно, как и в картах Google, можно выбирать режим просмотра карты: карта, спутник, гибрид, рельеф.
На втором экране "График" можно увидеть две зависимости: скорость и высота от пройденного пути (настраивается в опциях). График масштабируемый и прокручивается. Кликнув по желаемой метке можно просмотреть дополнительную информацию о выбранном участке: расстояние, потраченные калории, общее затраченное время, время в движении, средняя скорость на выбранном участке, средняя скорость движения на выбранном участке и максимальная скорость.
На последнем экране "Статистика" будут представлены общие данные о треке: расстояние, затраченные калории, общее затраченное время, время в движении, средняя скорость, средняя в движении и максимальная скорости.
Треки можно экспортировать на карту памяти или загрузить на сервисы Google. При экспорте можно выбрать желаемый формат файла (в виде KML-, GPX-, CSV- или TCX-файла).
Треки можно воспроизвести на телефоне или на компьютере. Для воспроизведения трека на телефоне необходимо установить приложение "Google Earth".
Немного о настройках
Среди большого количества настроек хотелось бы сказать пару слов о некоторых из них. В ветке "Карта" есть настройка цветовых порогов трека в зависимости от скорости. Можно установить минимальный и максимальный пороги скорости ниже и выше которых цвет будет изменяться. Я установил значение "Динамические пороги", чтобы они автоматически определялись, так как я могу идти пешком, а могу и ехать на машине. Можно вообще отключить пороги скорости, выбрав значение "Один цвет", тогда весь трек будет записываться одним красным цветом.
В ветке настроек "Запись" можно установить интервал голосовых оповещений (отключено по умолчанию). К сожалению, в версии 2.0.6 (последней на момент написания этой статьи) они только на английском языке. Здесь также можно настроить интервал времени между разделительными маркерами.
Линия маршрута с точной привязкой к координатам идеально подходит на роль «путеводной нити» — особенно в стороне от цивилизации. CHIP расскажет, как записать свой трек и воспользоваться уже готовым.
Помимо всевозможных автонавигаторов, GPS-трекеров, функцией геопозиционирования сегодня оснащены недорогие модели смартфонов и даже фотоаппараты. Как правило, навигатор или смартфон используют для планирования маршрута и навигации в режиме реального времени. Но при этом многие не догадываются, что у таких устройств есть еще одно полезное применение — сохранение информации о пройденном пути. Для каких целей эта функция может пригодиться?
Во-первых, файл трека — отличный способ быстро ответить на вопрос, как добраться до нужной точки. С помощью файла-трека, который записали вы или кто-то другой, прошедший этот путь оптимальным образом, есть возможность поделиться полезными сведениями с другими желающими попасть, например, к роднику в лесу, точке переправы, охотничьему домику и пр.
В некоторых случаях записанный трек может использоваться для возврата по только что пройденному маршруту.
Во-вторых, трек — это один из элементов рассказа о путешествии, к которому вполне можно привязать сделанные в пути фотоснимки, если, конечно, камера поддерживает геотеги. Энтузиасты даже используют GPS-треки для рисования собственных карт местностей. К слову, именно так развивается проект OpenStreetMap.
В-третьих, это способ анализировать свои спортивные достижения: оценивать длину и высотный профиль маршрута вечерней пробежки или очередного велосипедного трипа. Приложения позволяют не только следить за прогрессом, но и ставить перед собой амбициозные цели тренировок.
CHIP расскажет, как создается трек, как его анализировать и какие приложения и сервисы пригодятся для его записи, воспроизведения и передачи другим пользователям.
Запись и хранение маршрута
Программы для работы с треками можно условно разделить на два класса: те, которые способны функционировать без доступа к Интернету, и те, что наполнены вспомогательными функциями настолько, что без Интернета не работают. Приоритет за офлайн-решениями.
«Мои треки» (My Tracks)
Простой инструмент от Google позволяет записывать и анализировать треки как в процессе записи, так и после завершения маршрута.
Приложение позволяет смотреть треки на Google Maps, выгружать сохраненные данные в GPX- и KML-файлы или прямо в Google Docs, где рассматривать их уже на карте или расшаривать друзьям. Для любителей спорта реализована поддержка нескольких внешних датчиков, в частности, пульсометров. Правда, такая техника не особо распространена в нашей стране.
OsmAnd/OsmAnd+
В OsmAnd запись треков можно включить, активировав дополнительный плагин «Служба логгирования и спящий режим». После этого в настройках программы появится меню, где можно задать папку сохранения файла, интервал записи точек и пр. Программа сохраняет информацию в GPX-файлах, позволяя потом с помощью другого плагина отображать ее на карте и даже преобразовывать в маршрут для следования. Настройки можно сделать для автомобильного, велосипедного и пешего режимов.
Где хранить трекинг-файлы?
Треки, как и любые другие файлы, можно хранить на жестком диске. Но чаще всего пользователям нужна та информация, которую можно «выудить» из анализа таблицы трека: отображение пройденного пути на карте, данные о маршруте и т. п.
Сервис GPSLog Labs дает возможность анализировать треки и строить графики
В целом, все упомянутые сервисы решают одну и ту же задачу: обеспечивают хостинг самого файла, его отображение на онлайн-карте, а также простейшие инструменты для разграничения доступа — треки можно объявить «личными» или «публичными».
Мобильное приложение «Мои треки» работает в связке с сервером Google
Выбирая сервис для хранения треков, необходимо позаботиться о том, чтобы файлы оттуда при необходимости можно было забрать. Это будет полезно в случае, если ваш оригинал окажется утерян, а сервис вдруг надумает закрываться или переходить на какую-то платную модель работы.
Упомянутая выше возможность просмотра KML- и GPX-файлов на Google Drive — своего рода «промежуточное решение» между хранением в своей структуре каталогов и выкладыванием на онлайн-ресурс.
Есть и отдельный класс программ для записи треков, которые, с одной стороны, умеют работать в офлайн-режиме, а с другой — позволяют автоматически загружать созданные файлы в сторонние хранилища.
Так, навигационные программы OruxMaps и Maverick сотрудничают с GPSies, «Мои треки» — с сервером Google, а OsmAnd позволяет загружать треки на сервер OpenStreetMaps для рисования карт.
Тренировки и экскурсии
Программы для записи трека не столь требовательны к интернет-соединению, как навигационные инструменты, использующие онлайн-карты. В этот раздел мы собрали приложения, которые за счет взаимодействия с собственными веб-сервисами позволяют решить дополнительные задачи.
EveryTrail
EveryTrail — это онлайн-хранилище треков, для которого можно записывать и загружать очередной путь через соответствующее мобильное приложение (для iPhone и Android есть бесплатные и платные версии).
Интернет для работы программе нужен постоянно, поскольку она использует онлайн-карты Google.
Помимо загрузки собственных треков, EveryTrail позволяет искать чужие маршруты поблизости, среди которых есть и вполне приличные гиды по местности, следовать им, снимать по пути фотографии и «прикреплять» к треку для формирования новых «гидов».
Приложение интегрируется с социальными сервисами Facebook и Twitter.
EveryTrail — онлайн-хранилище треков
Endomondo
Endomondo делает акцент на результатах анализа треков, отслеживая спортивные достижения владельца смартфона.
Информацию о тренировках можно вводить вручную или же получать автоматически при записи GPS-трека, отмечая лишь тип активности.
Приложение строит календарь активности, дает возможность устанавливать цели и добиваться их при поддержке аудиогида. Он будет не по-русски бубнить вам в наушники прямо во время тренировки.
Кроме того, реализованы социальные функции: можно собираться в команды друзей.
«Тропинки мира»
Этот сервис с романтичным названием ориентирован на любителей пешего, горного и велосипедного туризма. Специально для классификации маршрутов перед записью необходимо выбрать тип активности.
Что приятно, есть русский язык. Как и предыдущий сервис, «Тропинки мира» задействуют для отображения местоположения пользователя онлайн-карты, ищут чужие маршруты.
Кроме того, есть возможность открывать ранее сохраненные на устройстве файлы GPX или KML (чтобы использовать их в качестве «путеводной нити»).
Данные о своей активности можно выкладывать в публичный профиль на сайте программы.
«Тропинки мира» задействуют для отображения местоположения пользователя онлайн-карты
RunKeeper
RunKeeper явно пользуется более активной поддержкой разработчиков, благо у нее реализована даже поддержка русского языка. Кроме того, сервис «дружит» с разными сторонними устройствами, в том числе навигаторами Garmin, позволяя собирать в одном месте всю информацию о тренировках и физической активности.
Программа имеет только бесплатную версию, хотя сам веб-сервис предлагает «элитную» подписку, позволяющую демонстрировать свои спортивные тренировки (активность, фото, местоположение) в публичном профиле на сайте.
Трек-файлы и форматы
GPS-трек — это текстовый файл, содержащий записанную через равные промежутки времени информацию о координатах объекта. Такой файл создается при помощи встроенной функции навигационной программы или специального GPS-трекера, программного или аппаратного. Впоследствии по записанным координатам можно рассчитать скорость движения, пройденное расстояние и получить другую информацию о маршруте.
Ценные данные
Инструментов для работы с ранее записанными GPS-треками существует великое множество. Различаются они набором функций.
Отображение трека на карте. Этим нас может порадовать почти любой картографический софт, в частности, Google Earth. Функция может пригодиться тем, кто хочет рассказать о своих путешествиях или только планирует маршрут на основе чужих данных. Здесь имеется расчет общих данных: времени в пути, средней скорости, общего перемещения, смещения по карте и т. п.
Расчет скорости движения. Эта функция полезна тем, кто анализирует треки своих спортивных «заездов» (не важно, на велосипеде, байдарке или автомобиле). Кроме того, ее любят коммерческие предприятия — так можно контролировать водителей автопарка на предмет лишних «перекуров» в дороге и превышений скорости.
Анализ высотного профиля. Эта функция востребована туристами и, естественно, теми, кто любит бегать или ездить на велосипеде. Она позволяет посчитать набор высоты за маршрут, а значит, прикинуть физическую нагрузку. Такой анализ можно выполнить, если устройство во время записи трека фиксировало высоту над уровнем моря.
Привязка к карте и отображение фотографий. Удобно использовать для демонстрации на карте мест путешествия.
Но этими функциями польза от треков не ограничивается. К примеру, всем известные пробочные сервисы тоже построены на анализе треков от участников движения.
Форматы файлов
Единого формата для сохранения GPS-треков нет. Однако есть несколько вариантов, наиболее привычных российскому пользователю.
С форматом PLT хорошо работает программа OziExplorer, популярная у любителей путешествовать по растровым картам
KML — формат Google Earth. Он наиболее удобен с точки зрения просмотра трека на карте без специальных программ. Достаточно выложить такой файл в Google Drive, и его можно будет прямо оттуда открывать на Google Maps, не устанавливая никакого дополнительного ПО.
Онлайн-сервис Google Earth позволяет загрузить трек формата KML и сделать на карте пользовательские пометки
GPX — cвободный формат файлов GPS-треков, в основе которого лежат идеи XML. Формат поддерживают популярные приложения для работы с GPS, в том числе упомянутые выше Google Earth и OziExplorer.
Анализ данных таблицы трека позволяет составить картину высот и возможной скорости передвижения по маршруту
Паркуйтесь так, чтобы не искать машину на штрафстоянке! Навигатор самостоятельно в конце каждой поездки предлагает быстрый маршрут (не дольше 15 мин) с экскурсией по ближайшим парковочным местам. При этом место стоянки будет в шаговой доступности до цели вашей поездки, а если парковка платная — приложение сообщит вам об этом отдельно. Места, разрешенные для парковки, будут помечены синим, а запрещенные для стоянки — красным. Такую карту парковок района, в который едете, можно изучить и до поездки из дома.
Ищите в приложении места, которые освободились в течение последних 5 минут. Свободное парковочное место выглядит как зеленый кружок. Если нажмете на точку, узнаете, как давно машина уехала с этого места. Конечно, наличие метки на карте пока не дает 100% гарантии, что это место до сих пор никто не занял. Но шансы припарковаться там точно гораздо выше!
Кнопка «Обзор»
Экономьте время! Чтобы не отвлекать водителя от дороги каждую минуту, Яндекс.Навигатор предлагает изменить маршрут, только если расчетная экономия времени выходит больше 5 минут. Специально для тех, кто не хочет терять ни минуты, в панели быстрого доступа Навигатора есть кнопка «Обзор». С ее помощью водитель может в любую минуту проверить, нет ли маршрута на 2–3 минуты быстрее текущего.
Мои поездки
Ведите статистику! Для тех, кто записывает каждую деталь биографии своего автомобиля или просто хочет вспомнить, каким маршрутом прошлым летом быстро добрался до дачи лучшего друга, в настройках Навигатора есть раздел «Мои поездки». О каждой поездке можно узнать подробности: точный маршрут, время в пути и среднюю скорость. Доступна и сводная статистика — по неделям и по месяцам.
Подъезды
Подъезжайте сразу к заветным дверям! Недавно Яндекс.Навигатор научился подводить к дому со стороны подъездов. Информацию о них компания собирает через «Народную карту». Пока их немного, но вы можете добавить свой, и друзья легко найдут к вам дорогу. Чтобы подъехать сразу к нужному подъезду, введите его номер в строку поиска после основного адреса, например: ул. Лесная, д. 5, п. 2.
Техпомощь на дороге
Промежуточная точка пути
Меняйте маршрут, когда захотите! Если по дороге в точку назначения вы вспомнили, что вам нужно заехать, например, в аптеку или вы просто хотите проехать по Воздвиженке и полюбоваться особняком Морозова, можно попросить Навигатор перестроить маршрут через нужную точку. Для этого зайдите в раздел «Обзор», найдите на карте голубой значок «плюса» и перетяните его в промежуточную точку, которую нужно захватить по дороге.
Фоновый режим
Не теряйтесь, если отвлеклись (а лучше не отвлекайтесь!). Навигатор, оказывается, умеет работать и в фоновом режиме. Оксана, Дима и другие любимые герои не бросят вас, даже если вы свернули приложение, чтобы проверить почту или принять важный звонок: приложение продолжит вести вас по маршруту и давать голосовые подсказки.
Более того, подсказки и предупреждения о камерах будут слышны, даже если вы погасите экран телефона. Это бывает необходимо, чтобы, например, сэкономить батарею на телефоне, если под рукой нет зарядки.
Предупреждения о превышении скорости
Настраивайте уведомления о превышениях скорости так, как удобно лично вам! В настройках приложения можно установить порог превышения скорости (от 1 до 60 км/ч), после которого Навигатор будет предупреждать о камерах. Например, если выставить допустимое превышение «19» и поехать по дороге с ограничением 60 км/ч, приложение будет реагировать на камеры только после отметки «79» на спидометре.
С десктопа на телефон в один клик
Бонус. Возможна ли навигация без интернета?
Если вы волнуетесь, что в поездке закончится интернет, то карты местности можно скачать заранее. Конечно, для построения маршрута понадобится выход в Сеть. Но, как нам по секрету рассказали в Яндексе, компания уже готовит полностью офлайновую маршрутизацию.
Читайте также: