diff --git a/src/main/java/org/operaton/fitpub/model/entity/ActivityMetrics.java b/src/main/java/org/operaton/fitpub/model/entity/ActivityMetrics.java
index 6d90219..99a1e5f 100644
--- a/src/main/java/org/operaton/fitpub/model/entity/ActivityMetrics.java
+++ b/src/main/java/org/operaton/fitpub/model/entity/ActivityMetrics.java
@@ -27,9 +27,15 @@ public class ActivityMetrics {
@JoinColumn(name = "activity_id", nullable = false)
private Activity activity;
+ /**
+ * Average speed in km/h (converted from m/s in FitParser/GpxParser).
+ */
@Column(name = "average_speed", precision = 8, scale = 2)
private BigDecimal averageSpeed;
+ /**
+ * Maximum speed in km/h (converted from m/s in FitParser/GpxParser).
+ */
@Column(name = "max_speed", precision = 8, scale = 2)
private BigDecimal maxSpeed;
diff --git a/src/main/java/org/operaton/fitpub/util/ParsedActivityData.java b/src/main/java/org/operaton/fitpub/util/ParsedActivityData.java
index e5fa745..d4558ca 100644
--- a/src/main/java/org/operaton/fitpub/util/ParsedActivityData.java
+++ b/src/main/java/org/operaton/fitpub/util/ParsedActivityData.java
@@ -49,6 +49,7 @@ public class ParsedActivityData {
private Integer heartRate;
private Integer cadence;
private Integer power;
+ /** Speed in km/h (converted from m/s in FitParser/GpxParser). */
private BigDecimal speed;
private BigDecimal temperature;
private BigDecimal distance;
diff --git a/src/main/resources/static/js/fitpub.js b/src/main/resources/static/js/fitpub.js
index 261db8e..89dfa8c 100644
--- a/src/main/resources/static/js/fitpub.js
+++ b/src/main/resources/static/js/fitpub.js
@@ -194,8 +194,8 @@ function createActivityMap(containerId, geoJsonData, options = {}) {
popupContent += `Heart Rate: ${props.heartRate} bpm
`;
}
if (props.speed !== undefined) {
- const speedKmh = props.speed * 3.6;
- popupContent += `Speed: ${speedKmh.toFixed(2)} km/h
`;
+ // Speed is already in km/h from backend (converted in FitParser)
+ popupContent += `Speed: ${props.speed.toFixed(2)} km/h
`;
}
if (props.elevation !== undefined) {
popupContent += `Elevation: ${props.elevation.toFixed(1)} m
`;
diff --git a/src/main/resources/templates/activities/detail.html b/src/main/resources/templates/activities/detail.html
index 8b3ab4e..7e7caa7 100644
--- a/src/main/resources/templates/activities/detail.html
+++ b/src/main/resources/templates/activities/detail.html
@@ -487,9 +487,10 @@
}
// Additional Metrics (conditional)
+ // Note: averageSpeed is already in km/h from backend (converted in FitParser)
if (activity.averageSpeed) {
document.getElementById('metricAvgSpeedContainer').style.display = 'block';
- document.getElementById('metricAvgSpeed').textContent = (activity.averageSpeed * 3.6).toFixed(1) + ' km/h';
+ document.getElementById('metricAvgSpeed').textContent = parseFloat(activity.averageSpeed).toFixed(1) + ' km/h';
}
if (activity.averageHeartRate) {
document.getElementById('metricAvgHRContainer').style.display = 'block';