summaryrefslogtreecommitdiff
path: root/android-app/app
diff options
context:
space:
mode:
authorClaude <noreply@anthropic.com>2026-05-21 08:11:36 +0000
committerClaude <noreply@anthropic.com>2026-05-21 08:11:36 +0000
commit0da5ea2d140fc5bfa7e46a954be296d70fea49c4 (patch)
treef6064f56fb0ceb002609fef4732a63e73a174d39 /android-app/app
parente4fb66791269d761a96a97213b3fd6aaeb151772 (diff)
Fix speed-colored track: pre-compute hex color per segment, use get("color")
Instead of asking MapLibre to interpolate/step colors at render time (which was silently failing), pre-compute the CSS hex color for each segment in speedSegments() and store it as a "color" property. speedColorExpression() is now Expression.get("color") — a simple property lookup that MapLibre parses as a CSS color for line-color. https://claude.ai/code/session_01YUbuZNDAoLea4cf9UGQ9qn
Diffstat (limited to 'android-app/app')
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/track/TrackColors.kt31
1 files changed, 19 insertions, 12 deletions
diff --git a/android-app/app/src/main/kotlin/org/terst/nav/track/TrackColors.kt b/android-app/app/src/main/kotlin/org/terst/nav/track/TrackColors.kt
index 145a4dd..292240a 100644
--- a/android-app/app/src/main/kotlin/org/terst/nav/track/TrackColors.kt
+++ b/android-app/app/src/main/kotlin/org/terst/nav/track/TrackColors.kt
@@ -5,7 +5,18 @@ import org.maplibre.geojson.Feature
import org.maplibre.geojson.LineString
import org.maplibre.geojson.Point
-/** Breaks [points] into consecutive 2-point LineString Features, each tagged with "speed" (knots). */
+private fun speedToHex(speedKt: Double): String = when {
+ speedKt >= 13 -> "#F44336" // red
+ speedKt >= 10 -> "#FFC107" // amber
+ speedKt >= 7 -> "#4CAF50" // green
+ speedKt >= 4 -> "#00BCD4" // cyan
+ else -> "#2196F3" // blue
+}
+
+/**
+ * Breaks [points] into consecutive 2-point LineString Features.
+ * Each feature carries "speed" (knots) and "color" (CSS hex) properties.
+ */
fun speedSegments(points: List<TrackPoint>): List<Feature> =
(0 until points.size - 1).map { i ->
val sog = (points[i].sogKnots + points[i + 1].sogKnots) / 2.0
@@ -14,18 +25,14 @@ fun speedSegments(points: List<TrackPoint>): List<Feature> =
Point.fromLngLat(points[i].lon, points[i].lat),
Point.fromLngLat(points[i + 1].lon, points[i + 1].lat)
))
- ).apply { addNumberProperty("speed", sog) }
+ ).apply {
+ addNumberProperty("speed", sog)
+ addStringProperty("color", speedToHex(sog))
+ }
}
/**
- * MapLibre expression that step-interpolates line-color from the "speed" feature property.
- * Scale: 0 kt → blue · 4 kt → cyan · 7 kt → green · 10 kt → amber · 13+ kt → red.
+ * Returns the lineColor expression for speed-colored segments.
+ * Reads the pre-computed "color" string property from each feature.
*/
-fun speedColorExpression(): Expression = Expression.step(
- Expression.get("speed"),
- Expression.literal("#2196F3"), // < 4 kt: blue
- Expression.stop(4, Expression.literal("#00BCD4")), // cyan
- Expression.stop(7, Expression.literal("#4CAF50")), // green
- Expression.stop(10, Expression.literal("#FFC107")), // amber
- Expression.stop(13, Expression.literal("#F44336")) // red
-)
+fun speedColorExpression(): Expression = Expression.get("color")