beartrack-mobile/www/js/trackParser.js

234 lines
8.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

function borderGpxParser(map, fileName) {
fetch('borders/' + fileName + '.gpx')
.then(response => response.text())
.then(data => {
gpxParse.parseGpx(data, function (error, parsedData) {
if (error) {
console.error('Error parsing GPX file:', error);
return;
}
var trackPoints = parsedData.tracks[0].segments[0];
// Преобразование треков в формат, пригодный для Yandex.Maps
var coordinates = trackPoints.map(function (point) {
return [point.lat, point.lon];
});
// Создание полигона на карте
createPolygon(map, coordinates);
});
});
}
function createPolygon(map, coordinates) {
var polygon = new ymaps.GeoObject({
geometry: {
type: 'Polygon',
coordinates: [coordinates]
},
properties: {
hintContent: 'Природный парк «Налычево»'
}
}, {
fillColor: 'rgba(9,138,9,0.2)', // Прозрачный зеленый цвет
strokeColor: '#058105', // Зеленые границы
strokeWidth: 4
});
map.geoObjects.add(polygon);
// Центрирование карты на полигоне
var bounds = polygon.geometry.getBounds();
map.setBounds(bounds, {
checkZoomRange: true // Эта опция учитывает доступные уровни зума
});
}
function gpxParser(map, fileName){
fetch('gpx/' + fileName + '.gpx')
.then(response => response.text())
.then(data => {
gpxParse.parseGpx(data, function(error, parsedData) {
if (error) {
console.error('Error parsing GPX file:', error);
return;
}
var trackPoints = parsedData.tracks[0].segments[0];
// Преобразование треков в формат, пригодный для Yandex.Maps
var coordinates = trackPoints.map(function(point) {
return [point.lat, point.lon];
});
/*// Копируем массив координат, чтобы не менять исходный
var reversedCoordinates = coordinates.slice();
// Меняем местами начальную и конечную точки
reversedCoordinates.reverse();
coordinates = reversedCoordinates;*/
// Создание линии маршрута на карте
var routeLine = new ymaps.GeoObject({
geometry: {
type: 'LineString',
coordinates: coordinates
},
properties: {
hintContent: 'Маршурт \"Налычево-Центральное\"'
}
}, {
strokeColor: '#9900ff',
strokeWidth: 4
});
map.geoObjects.add(routeLine);
// Установка маркеров
addMarkers(map, coordinates);
// Центрирование карты на маршруте
/*var bounds = routeLine.geometry.getBounds();
map.setBounds(bounds, {
checkZoomRange: true // Эта опция учитывает доступные уровни зума
});*/
});
});
}
function gpxCombainParser(map, fileName1, reverse1, fileName2, reverse2) {
// Функция для загрузки и парсинга GPX файла
function parseGpxFile(fileName, reverse, callback) {
fetch('gpx/' + fileName + '.gpx')
.then(response => response.text())
.then(data => {
gpxParse.parseGpx(data, function(error, parsedData) {
if (error) {
console.error('Error parsing GPX file:', error);
return;
}
var trackPoints = parsedData.tracks[0].segments[0];
// Преобразование трека в формат, пригодный для Yandex.Maps
var coordinates = trackPoints.map(function(point) {
return [point.lat, point.lon];
});
// Если требуется развернуть трек
if (reverse) {
coordinates.reverse();
}
callback(coordinates);
});
});
}
// Парсим первый GPX файл
parseGpxFile(fileName1, reverse1, function(coordinates1) {
// Парсим второй GPX файл
parseGpxFile(fileName2, reverse2, function(coordinates2) {
// Объединяем координаты из двух файлов
var combinedCoordinates = coordinates1.concat(coordinates2);
// Создание линии маршрута на карте
var routeLine = new ymaps.GeoObject({
geometry: {
type: 'LineString',
coordinates: combinedCoordinates
},
properties: {
hintContent: 'Маршурт \"Налычево-Центральное\"'
}
}, {
strokeColor: '#9900ff',
strokeWidth: 4
});
map.geoObjects.add(routeLine);
// Установка маркеров
addMarkers(map, combinedCoordinates);
// Центрирование карты на маршруте
/*var bounds = routeLine.geometry.getBounds();
map.setBounds(bounds, {
checkZoomRange: true // Эта опция учитывает доступные уровни зума
});*/
});
});
}
function addMarkers(map, coordinates) {
var distance = 0;
var kmCounter = 1;
var lastPoint = coordinates[0];
var R = 6371e3; // Радиус Земли в метрах
// Установка маркера в начале маршрута
addMarker(map, coordinates[0], 'Старт','islands#blueStretchyIcon');
for (var i = 1; i < coordinates.length; i++) {
var currentPoint = coordinates[i];
distance += getDistanceFromLatLonInMeters(lastPoint[0], lastPoint[1], currentPoint[0], currentPoint[1]);
lastPoint = currentPoint;
if (distance >= kmCounter * 1000) {
addWayMarker(map, currentPoint, kmCounter.toString());
kmCounter++;
}
}
// Установка маркера в конце маршрута
addMarker(map, coordinates[coordinates.length - 1], 'Финиш', 'islands#blueStretchyIcon');
}
function addMarker(map, coordinates, text, preset) {
var marker = new ymaps.Placemark(coordinates, {
iconContent: text
}, {
preset: preset,
iconColor: preset === 'islands#blueCircleDotIcon' ? '#1e98ff' : undefined // Для км маркеров - голубая кайма
});
map.geoObjects.add(marker);
}
function addWayMarker(map, coordinates, text){
var MyIconContentLayout = ymaps.templateLayoutFactory.createClass(
'<div class="rounded-circle border border-primary border-2 d-flex align-items-center justify-content-center bg-white" style="width: 28px; height: 28px; overflow: hidden;">' +
' <p class="text-center">' + text + '</p>' +
'</div>'
);
var placemark = new ymaps.Placemark(
coordinates,
{},
{
iconLayout: 'default#imageWithContent',
iconImageHref: '', // путь к изображению, если нужно
iconImageSize: [28, 28], // размер иконки
iconContentLayout: MyIconContentLayout,
iconImageOffset: [-14, -14], // смещение, чтобы центрировать иконку
balloonPanelMaxMapArea: 0 // убираем ограничение размера балуна
}
);
map.geoObjects.add(placemark);
}
function getDistanceFromLatLonInMeters(lat1, lon1, lat2, lon2) {
var R = 6371e3; // Радиус Земли в метрах
var φ1 = lat1 * Math.PI/180; // φ, λ в радианах
var φ2 = lat2 * Math.PI/180;
var Δφ = (lat2 - lat1) * Math.PI/180;
var Δλ = (lon2 - lon1) * Math.PI/180;
var a = Math.sin(Δφ/2) * Math.sin(Δφ/2) +
Math.cos(φ1) * Math.cos(φ2) *
Math.sin(Δλ/2) * Math.sin(Δλ/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var distance = R * c; // В метрах
return distance;
}