Промежуточные точки

Промежуточные точки в маршрутах HERE Maps API представляют собой вычисляемые или заранее заданные координаты, расположенные между начальной и конечной точками маршрута. Они используются для анализа геометрии пути, анимации движения, построения детализированных траекторий и решения задач пространственной интерполяции.

В контексте HERE Maps JavaScript API маршрут обычно возвращается как последовательность географических координат, формирующих ломаную линию (polyline). Эта линия описывает реальную траекторию движения с учётом дорожной сети, ограничений и выбранного профиля маршрутизации.


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

platform.getRoutingService().calculateRoute(
  {
    routingMode: 'fast',
    transportMode: 'car',
    origin: '52.5200,13.4050',
    destination: '52.5300,13.4500',
    return: 'polyline,summary'
  },
  result => {
    const route = result.routes[0];
    const section = route.sections[0];
    const shape = section.polyline;
  },
  error => console.error(error)
);

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


Декодирование геометрии маршрута

HERE использует компактное кодирование координат, которое преобразуется в набор точек через утилиты API:

const lineString = H.geo.LineString.fromFlexiblePolyline(shape);

Результатом является объект LineString, содержащий последовательность координат маршрута. Каждая точка — это узел ломаной линии, но не обязательно равномерно распределённый по расстоянию.


Промежуточные точки как элемент геометрии маршрута

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

  • Нативные точки маршрута — возвращаются сервисом routing API и образуют геометрию дороги
  • Интерполированные точки — вычисляются программно между существующими координатами

Нативные точки зависят от детализации маршрута и могут быть сгущены на поворотах и развязках. Однако для задач анимации или анализа расстояний часто требуется равномерное распределение точек.


Интерполяция точек вдоль маршрута

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

Алгоритм:

  1. Вычисляется общее расстояние маршрута
  2. Определяется шаг интерполяции (например, каждые 100 метров)
  3. Последовательно обходятся сегменты линии
  4. Внутри сегмента вычисляется точка по коэффициенту t ∈ [0, 1]

Вычисление расстояния между координатами

Для расчёта расстояний в географических координатах применяется формула гаверсинуса:

function getDistance(lat1, lon1, lat2, lon2) {
  const R = 6371e3;
  const toRad = deg => deg * Math.PI / 180;

  const φ1 = toRad(lat1);
  const φ2 = toRad(lat2);
  const Δφ = toRad(lat2 - lat1);
  const Δλ = toRad(lon2 - lon1);

  const a =
    Math.sin(Δφ / 2) * Math.sin(Δφ / 2) +
    Math.cos(φ1) * Math.cos(φ2) *
    Math.sin(Δλ / 2) * Math.sin(Δλ / 2);

  const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

  return R * c;
}

Эта функция позволяет оценивать длину сегментов и суммарную протяжённость маршрута.


Построение равномерных промежуточных точек

На основе декодированного LineString формируется массив точек с равномерным шагом:

function interpolateRoute(lineString, stepMeters) {
  const points = lineString.getLatLngAltArray();
  const result = [];

  let accumulated = 0;
  let lastPoint = null;

  for (let i = 0; i < points.length; i += 3) {
    const lat = points[i];
    const lng = points[i + 1];

    if (lastPoint) {
      const segmentDistance = getDistance(
        lastPoint.lat, lastPoint.lng,
        lat, lng
      );

      accumulated += segmentDistance;

      if (accumulated >= stepMeters) {
        result.push({ lat, lng });
        accumulated = 0;
      }
    }

    lastPoint = { lat, lng };
  }

  return result;
}

Такой подход создаёт упрощённую сетку точек, пригодную для визуализации движения объекта по маршруту.


Использование H.geo.LineString для геометрических операций

Объект H.geo.LineString предоставляет удобный интерфейс для работы с последовательностью координат. Он используется как основа для:

  • построения полилиний на карте
  • вычисления длины маршрута
  • передачи геометрии в слои карты
const lineString = new H.geo.LineString();

shape.forEach(coord => {
  const [lat, lng] = coord.split(',');
  lineString.pushLatLngAlt(lat, lng, 0);
});

map.addObject(new H.map.Polyline(lineString, { style: { strokeColor: 'blue', lineWidth: 4 } }));

Получение точки по доле маршрута

Одна из ключевых задач — нахождение точки, находящейся на определённом проценте пути. Это используется для анимации маркера.

Подход:

  1. Вычисляется общая длина маршрута
  2. Определяется целевая дистанция
  3. Проход по сегментам до достижения нужного значения
function getPointAtDistance(lineString, targetDistance) {
  const coords = lineString.getLatLngAltArray();
  let distance = 0;

  for (let i = 0; i < coords.length - 3; i += 3) {
    const lat1 = coords[i];
    const lng1 = coords[i + 1];
    const lat2 = coords[i + 3];
    const lng2 = coords[i + 4];

    const segment = getDistance(lat1, lng1, lat2, lng2);

    if (distance + segment >= targetDistance) {
      const t = (targetDistance - distance) / segment;

      return {
        lat: lat1 + (lat2 - lat1) * t,
        lng: lng1 + (lng2 - lng1) * t
      };
    }

    distance += segment;
  }

  return null;
}

Применение промежуточных точек в анимации

Промежуточные точки используются для плавного перемещения объектов по карте. Вместо перескакивания между узлами маршрута создаётся непрерывное движение.

Типовой сценарий:

  • маршрут декодируется в LineString
  • создаётся массив точек с шагом 10–50 метров
  • маркер последовательно перемещается между ними
let index = 0;

function animate(marker, path) {
  if (index >= path.length) return;

  marker.setGeometry(path[index]);
  index++;

  requestAnimationFrame(() => animate(marker, path));
}

Уточнение геометрии маршрута через дополнительные точки

В некоторых случаях необходимо повысить детализацию маршрута, например для:

  • отображения сложных развязок
  • анализа дорожных манёвров
  • построения тепловых карт движения

Для этого выполняется densification — добавление точек между существующими узлами линии с фиксированным шагом расстояния.


Особенности работы с точностью координат

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

  • искажения проекции на больших расстояниях
  • накопление ошибки при линейной интерполяции
  • неравномерность исходной геометрии маршрута

Для повышения точности часто комбинируются:

  • геодезические расчёты (haversine / Vincenty)
  • сегментная интерполяция
  • нормализация шага по длине дуги

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

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

  • вычисление зон ускорения и замедления
  • определение плотности поворотов
  • сегментация маршрута по участкам

Такая обработка позволяет превращать геометрию маршрута в структурированные данные для последующего анализа транспортных потоков и поведения объектов на карте.