fix: deterministic GPX ordering in parseGpxFiles (trip.html.twig)

This commit is contained in:
2026-06-19 23:06:28 +02:00
parent 3845d1b5e4
commit 103ceb62b9
+10 -3
View File
@@ -405,35 +405,42 @@ function haversineKm(lat1, lng1, lat2, lng2) {
function parseGpxFiles(urls, callback) { function parseGpxFiles(urls, callback) {
var pending = urls.length; var pending = urls.length;
var masterPts = []; var fileResults = new Array(urls.length);
if (pending === 0) { callback({ error: 'no files' }); return; } if (pending === 0) { callback({ error: 'no files' }); return; }
urls.forEach(function(url) { urls.forEach(function(url, idx) {
fetch(url) fetch(url)
.then(function(r) { return r.text(); }) .then(function(r) { return r.text(); })
.then(function(text) { .then(function(text) {
var xml = new DOMParser().parseFromString(text, 'text/xml'); var xml = new DOMParser().parseFromString(text, 'text/xml');
var trkpts = xml.querySelectorAll('trkpt'); var trkpts = xml.querySelectorAll('trkpt');
var pts = [];
trkpts.forEach(function(pt) { trkpts.forEach(function(pt) {
var eleEl = pt.querySelector('ele'); var eleEl = pt.querySelector('ele');
var timeEl = pt.querySelector('time'); var timeEl = pt.querySelector('time');
masterPts.push({ pts.push({
lat: parseFloat(pt.getAttribute('lat')), lat: parseFloat(pt.getAttribute('lat')),
lon: parseFloat(pt.getAttribute('lon')), lon: parseFloat(pt.getAttribute('lon')),
ele: eleEl ? parseFloat(eleEl.textContent) : NaN, ele: eleEl ? parseFloat(eleEl.textContent) : NaN,
time: timeEl ? timeEl.textContent : null time: timeEl ? timeEl.textContent : null
}); });
}); });
fileResults[idx] = pts;
pending--; pending--;
if (pending === 0) { computeAndCallback(); } if (pending === 0) { computeAndCallback(); }
}) })
.catch(function(err) { .catch(function(err) {
console.warn('GPX load failed:', url, err); console.warn('GPX load failed:', url, err);
fileResults[idx] = [];
pending--; pending--;
if (pending === 0) { computeAndCallback(); } if (pending === 0) { computeAndCallback(); }
}); });
}); });
function computeAndCallback() { function computeAndCallback() {
var masterPts = [];
fileResults.forEach(function(pts) {
if (pts) { pts.forEach(function(p) { masterPts.push(p); }); }
});
var n = masterPts.length; var n = masterPts.length;
if (n < 2) { callback({ distance: 0 }); return; } if (n < 2) { callback({ distance: 0 }); return; }
var distance = 0, eleGain = 0, eleLoss = 0; var distance = 0, eleGain = 0, eleLoss = 0;