Маршруты

Маршрут - это последовательность координат на карте, путь, по которому должен двигаться пользователь чтобы попасть из точки A в точку B. Маршрут может включать в себя промежуточные via-точки.

Помимо данных о траектории поездки, маршрут содержит различную дополнительную информацию. Например, дорожные предупреждения, дистанцию, примерное время движения по маршруту и т.д.

В MapKit SDK маршрут представлен классом DrivingRoute, рассмотрим его основной функционал.

Метаданные

Метаданные DrivingRouteMetadata содержат информацию об описании маршрута, его параметрах и характеристиках, дистанцию и примерное время движения по маршруту.

Для получения метаданных используется метод DrivingRoute.getMetadata.

URI маршрута

URI представляет собой строковый идентификатор маршрута.

Для получения URI маршрута, используется метод DrivingRouteMetadata.getUri.

Позиция

Маршрут может содержать информацию о текущей позиции, она отражает какая часть маршрута была пройдена.

Для получения текущей позиции используется метод DrivingRoute.getPosition.

Предупреждения и события

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

Предупреждения на маршруте содержат информацию о различных объектах на маршруте. Среди объектов встречаются светофоры (DrivingRoute.getTrafficLights), железнодорожные переправы (DrivingRoute.getRailwayCrossings), лежачие полицейские (DrivingRoute.getSpeedBumps) и т.д. Подробнее об этом можно узнать в DrivingRoute API.

Пробки на маршруте

С помощью метода DrivingRoute.getJamSegments можно получить информацию о загруженности дорог на маршруте. Данный метод возвращает список из JamSegment объектов. Каждый элемент списка описывает состояние загруженности дороги и среднюю скорость движения по ней на соответствующем отрезке маршрута. Отрезок с номером N соответствует участку маршрута, который находится между N и N + 1 точками геометрии маршрута, которые можно получить с помощью вызова DrivingRoute.getGeometry.

Подписка на обновление

В течении жизненного цикла маршрута некоторые данные о маршруте могут измениться. MapKit SDK предоставляет возможность подписаться на изменения информации о маршруте при помощи интерфейса ConditionsListener.

Расчет прогресса по маршруту

Прогрессом по маршруту называется доля от изначального маршрута, которая была пройдена.

Ниже приведен фрагмент кода для вычисления данного значения:

fun routeProgress(route: DrivingRoute): Float {
    val startPosition = PolylinePosition(0.0, 0.0)
    val distanceFull = route.metadataAt(startPosition).weight.distance.value
    val distanceLeft = route.metadata.weight.distance.value
    return 1f - distanceLeft / distanceFull
}

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

Расстояние между точками маршрута

Для вычисления расстояния между двумя произвольными точками маршрута используются методы из PolylineUtils. Выполните следующие шаги:

  1. Создайте объект PolylineIndex, привязанный к вашему маршруту, используя PolylineUtils.createPolylineIndex.

  2. Используйте метод PolylineIndex.closestPolylinePosition для получения PolylinePosition точек на маршруте.

  3. Вычислите значение расстояния между двумя точками на маршруте, с помощью PolylineUtils.distanceBetweenPolylinePositions.

Пример вычисления значения расстояния между двумя произвольными точками маршрута:

fun distanceBetweenPointsOnRoute(route: DrivingRoute, first: Point, second: Point): Float {
    val polylineIndex = PolylineUtils.createPolylineIndex(route.geometry)
    val firstPosition = polylineIndex.closestPolylinePosition(first, Priority.CLOSEST_TO_RAW_POINT, 1.0)!!
    val secondPosition = polylineIndex.closestPolylinePosition(second, Priority.CLOSEST_TO_RAW_POINT, 1.0)!!
    return PolylineUtils.distanceBetweenPolylinePositions(route.geometry, firstPosition, secondPosition)
}

Время между точками маршрута

Рассмотрим алгоритм нахождения времени поездки между текущей точкой маршрута и произвольной точкой на маршруте, которая следует по маршруту позже.

  1. Нужно найти расстояние между текущей точкой маршрута и второй точкой. Для этого можно использовать алгоритм из предыдущего пункта.

  2. При помощи метода RoutePosition.advance рассчитайте значение RoutePosition второй точки.

  3. Используя метод RoutePosition.timeToFinish найдите разницу времени поездки между текущей точкой маршрута и второй точкой.

Пример вычисления времени поездки от текущей позиции маршрута до произвольной точки маршрута:

fun timeTravelToPoint(route: DrivingRoute, point: Point): Float {
    val currentPosition = route.routePosition
    val distance = distanceBetweenPointsOnRoute(route, currentPosition.point, point)
    val targetPosition = currentPosition.advance(distance)
    return targetPosition.timeToFinish() - currentPosition.timeToFinish()
}

Для вычисления времени поездки между двумя произвольными точками на маршруте, используйте разницу между результатами вычисления timeTravelToPoint для обоих точек.