Промежуточные точки в маршрутах 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, содержащий
последовательность координат маршрута. Каждая точка — это узел ломаной
линии, но не обязательно равномерно распределённый по расстоянию.
Промежуточные точки можно разделить на два типа:
Нативные точки зависят от детализации маршрута и могут быть сгущены на поворотах и развязках. Однако для задач анимации или анализа расстояний часто требуется равномерное распределение точек.
Для построения промежуточных точек используется линейная интерполяция по сегментам маршрута. Основная идея заключается в вычислении точки на заданной доле расстояния между двумя координатами.
Алгоритм:
Для расчёта расстояний в географических координатах применяется формула гаверсинуса:
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 предоставляет удобный интерфейс
для работы с последовательностью координат. Он используется как основа
для:
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 } }));
Одна из ключевых задач — нахождение точки, находящейся на определённом проценте пути. Это используется для анимации маркера.
Подход:
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;
}
Промежуточные точки используются для плавного перемещения объектов по карте. Вместо перескакивания между узлами маршрута создаётся непрерывное движение.
Типовой сценарий:
LineStringlet index = 0;
function animate(marker, path) {
if (index >= path.length) return;
marker.setGeometry(path[index]);
index++;
requestAnimationFrame(() => animate(marker, path));
}
В некоторых случаях необходимо повысить детализацию маршрута, например для:
Для этого выполняется densification — добавление точек между существующими узлами линии с фиксированным шагом расстояния.
При вычислении промежуточных точек важно учитывать:
Для повышения точности часто комбинируются:
Промежуточные координаты применяются не только для визуализации, но и для аналитики:
Такая обработка позволяет превращать геометрию маршрута в структурированные данные для последующего анализа транспортных потоков и поведения объектов на карте.