mirror of
https://github.com/gpxstudio/gpx.studio.git
synced 2026-10-19 09:22:12 +00:00
refactoring
This commit is contained in:
1 parent
4795513344
commit
890bcd765a
169 files changed
+263
-256
No files matched your search
@@ -0,0 +1,63 @@
|
||||
/**
|
||||
* The statistics of an example file (a ride of 102 trackpoints with timestamps and temperatures),
|
||||
* for the pages that show the elevation profile and the statistics without a file: the home page
|
||||
* and the documentation. They are the ones that the engine computes for `example.gpx`, kept as
|
||||
* they are (see `example-data.ts`) so that the example does not need the engine.
|
||||
*/
|
||||
import type { GlobalStatistics, SelectionStatistics } from '$lib/engine';
|
||||
import { exampleData as data } from '$lib/data/example/example-data';
|
||||
|
||||
const length = data.lng.length;
|
||||
|
||||
// the values that are cumulative over the selection: those of a range are the difference of its ends
|
||||
const cumulative = {
|
||||
totalDistance: data.totalDistance,
|
||||
movingDistance: data.movingDistance,
|
||||
totalTime: data.totalTime,
|
||||
movingTime: data.movingTime,
|
||||
elevationGain: data.elevationGain,
|
||||
elevationLoss: data.elevationLoss,
|
||||
};
|
||||
|
||||
/** The statistics of the trackpoints from `start` to `end` (both included), as the engine does. */
|
||||
function slice(start: number, end: number): GlobalStatistics | undefined {
|
||||
if (!(start >= 0 && start <= end && end < length)) {
|
||||
return undefined;
|
||||
}
|
||||
const delta = (values: number[]) => values[end] - values[start];
|
||||
// the times are in ms, in seconds in the statistics; a range cannot last a negative time
|
||||
const totalTime = Math.max(0, delta(cumulative.totalTime));
|
||||
const movingTime = Math.max(0, delta(cumulative.movingTime));
|
||||
const totalDistance = delta(cumulative.totalDistance);
|
||||
const movingDistance = delta(cumulative.movingDistance);
|
||||
const hours = (ms: number) => ms / 3_600_000;
|
||||
return {
|
||||
...data.global,
|
||||
totalDistance,
|
||||
movingDistance,
|
||||
totalTime: totalTime / 1000,
|
||||
movingTime: movingTime / 1000,
|
||||
elevationGain: delta(cumulative.elevationGain),
|
||||
elevationLoss: delta(cumulative.elevationLoss),
|
||||
startTime: data.timestamps[start],
|
||||
endTime: data.timestamps[end],
|
||||
totalSpeed: totalTime > 0 ? totalDistance / hours(totalTime) : undefined,
|
||||
movingSpeed: movingTime > 0 ? movingDistance / hours(movingTime) : undefined,
|
||||
};
|
||||
}
|
||||
|
||||
export const exampleStatistics: SelectionStatistics = {
|
||||
global: data.global,
|
||||
length,
|
||||
totalDistance: Float64Array.from(data.totalDistance),
|
||||
slope: Float64Array.from(data.slope),
|
||||
lng: Float64Array.from(data.lng),
|
||||
lat: Float64Array.from(data.lat),
|
||||
ele: Float64Array.from(data.ele),
|
||||
timestamps: BigInt64Array.from(data.timestamps, (time) => BigInt(time)),
|
||||
speed: Float64Array.from(data.speed),
|
||||
atemp: Float64Array.from(data.atemp),
|
||||
slopeSegmentSlope: Float64Array.from(data.slopeSegmentSlope),
|
||||
slopeSegmentDistance: Float64Array.from(data.slopeSegmentDistance),
|
||||
slice,
|
||||
};
|
||||
Reference in new issue
Block a user