diff options
| author | Claude <noreply@anthropic.com> | 2026-05-21 08:11:36 +0000 |
|---|---|---|
| committer | Claude <noreply@anthropic.com> | 2026-05-21 08:11:36 +0000 |
| commit | 0da5ea2d140fc5bfa7e46a954be296d70fea49c4 (patch) | |
| tree | f6064f56fb0ceb002609fef4732a63e73a174d39 /android-app/app/src | |
| parent | e4fb66791269d761a96a97213b3fd6aaeb151772 (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/src')
| -rw-r--r-- | android-app/app/src/main/kotlin/org/terst/nav/track/TrackColors.kt | 31 |
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") |
