GPX (GPS Exchange Format) представляет собой XML-формат, предназначенный для хранения и обмена данными о маршрутах, треках и точках интереса. В контексте веб-картографии GPX-треки используются для визуализации пройденных маршрутов, планирования поездок, анализа движения и отображения географических данных поверх картографической подложки.
В экосистеме HERE Technologies работа с GPX чаще всего реализуется через HERE Maps API for JavaScript, где трек преобразуется в геометрические примитивы карты и отображается как полилиния с возможностью интерактивного взаимодействия.
GPX-файл представляет собой XML-документ, содержащий несколько ключевых сущностей:
<trk> — трек (маршрут движения)<trkseg> — сегмент трека<trkpt> — точка трека с координатамиlat и lon — широта и долготаele (высота), time,
speed (в расширениях)Типичный фрагмент GPX:
<trk>
<name>Morning Ride</name>
<trkseg>
<trkpt lat="48.8566" lon="2.3522">
<ele>35.0</ele>
<time>2026-06-06T08:00:00Z</time>
</trkpt>
<trkpt lat="48.8570" lon="2.3530">
<ele>36.5</ele>
<time>2026-06-06T08:01:00Z</time>
</trkpt>
</trkseg>
</trk>
При обработке в JavaScript GPX обычно парсится через
DOMParser или специализированные библиотеки, после чего
координаты извлекаются в массив точек.
Базовый подход заключается в использовании стандартного XML-парсера:
function parseGPX(gpxText) {
const parser = new DOMParser();
const xml = parser.parseFromString(gpxText, "application/xml");
const points = xml.getElementsByTagName("trkpt");
const coordinates = [];
for (let i = 0; i < points.length; i++) {
const lat = parseFloat(points[i].getAttribute("lat"));
const lon = parseFloat(points[i].getAttribute("lon"));
coordinates.push({ lat, lng: lon });
}
return coordinates;
}
Результатом является массив объектов, пригодный для дальнейшего преобразования в геометрию карты.
В HERE Maps API for JavaScript основным объектом для работы с линиями
является H.geo.LineString.
const lineString = new H.geo.LineString();
coordinates.forEach(point => {
lineString.pushLatLngAlt(point.lat, point.lng, 0);
});
После этого линия может быть отрисована как полилиния:
const polyline = new H.map.Polyline(lineString, {
style: {
strokeColor: 'blue',
lineWidth: 4
}
});
map.addObject(polyline);
Работа с картой начинается с создания базовых объектов:
const platform = new H.service.Platform({
apikey: 'YOUR_API_KEY'
});
const defaultLayers = platform.createDefaultLayers();
const map = new H.Map(
document.getElementById('map'),
defaultLayers.vector.normal.map,
{
center: { lat: 48.8566, lng: 2.3522 },
zoom: 12,
pixelRatio: window.devicePixelRatio || 1
}
);
const beh * avior = new H.mapevents.Behavior(new H.mapevents.MapEvents(map));
const ui = H.ui.UI.createDefault(map, defaultLayers);
После добавления полилинии важно автоматически подогнать viewport:
map.getViewModel().setLookAtData({
bounds: polyline.getBoundingBox()
});
При работе с длинными маршрутами (тысячи точек) важно учитывать производительность:
Пример простого downsampling:
function simplify(points, step = 5) {
return points.filter((_, index) => index % step === 0);
}
function splitSegments(points, size = 500) {
const segments = [];
for (let i = 0; i < points.length; i += size) {
segments.push(points.slice(i, i + size));
}
return segments;
}
Для улучшения визуального восприятия часто добавляют специальные маркеры:
const startMarker = new H.map.Marker(coordinates[0]);
const endMarker = new H.map.Marker(coordinates[coordinates.length - 1]);
map.addObjects([startMarker, endMarker]);
Это позволяет быстро определить направление движения и границы трека.
Одним из наиболее прикладных сценариев является симуляция движения объекта по маршруту.
let index = 0;
function animate() {
if (index >= coordinates.length) return;
const point = coordinates[index];
marker.setGeometry(point);
map.setCenter(point);
index++;
requestAnimationFrame(animate);
}
Для более реалистичной симуляции используется временная шкала из GPX:
function animateWithTime(points, times) {
let i = 0;
function step() {
if (i >= points.length) return;
marker.setGeometry(points[i]);
const delay = (times[i + 1] - times[i]) || 1000;
i++;
setTimeout(step, delay);
}
step();
}
GPX часто содержит данные ele, которые позволяют строить
профиль высот.
Извлечение:
const elevations = [];
points.forEach(p => {
const ele = p.ele || 0;
elevations.push(ele);
});
Дальнейшее применение:
В HERE Maps API for JavaScript можно добавлять интерактивность к GPX-трекам:
polyline.addEventListener('tap', function(evt) {
const pointer = evt.target;
const geometry = pointer.getGeometry();
console.log('Clicked at:', geometry.lat, geometry.lng);
});
Также поддерживаются:
В реальных приложениях GPX может обновляться в режиме реального времени:
function updateTrack(newCoordinates) {
const newLine = new H.geo.LineString();
newCoordinates.forEach(p => {
newLine.pushLatLngAlt(p.lat, p.lng, 0);
});
polyline.setGeometry(newLine);
}
Это позволяет использовать GPX как основу для live-трекинга.
GPX-треки часто накладываются на дополнительные данные:
map.addLayer(defaultLayers.vector.traffic.map);
map.addLayer(defaultLayers.raster.satellite.map);
Это расширяет аналитическую ценность трека.
GPX-данные позволяют выполнять вычисления:
Пример расчета расстояния между точками:
function toRad(x) {
return x * Math.PI / 180;
}
function distance(a, b) {
const R = 6371;
const dLat = toRad(b.lat - a.lat);
const dLng = toRad(b.lng - a.lng);
const lat1 = toRad(a.lat);
const lat2 = toRad(b.lat);
const h =
Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.sin(dLng / 2) * Math.sin(dLng / 2) *
Math.cos(lat1) * Math.cos(lat2);
return 2 * R * Math.asin(Math.sqrt(h));
}
При работе с реальными файлами важно учитывать:
Типичная защита:
if (!xml || xml.getElementsByTagName("trkpt").length === 0) {
throw new Error("Invalid GPX file");
}
GPX-треки в связке с картографическим API применяются для:
Интеграция с HERE Technologies позволяет объединять трековые данные с маршрутизацией, пробками и геокодированием, формируя полноценную геоаналитическую платформу.