From 241a2387b12cfc12c46399dc3821e4b169467bf1 Mon Sep 17 00:00:00 2001 From: cepprice Date: Sat, 3 Apr 2021 01:26:33 +0500 Subject: [PATCH] Fix colorization when speed was derived from timestamps --- .../java/net/osmand/router/RouteColorize.java | 43 ++++++++++++++----- .../net/osmand/plus/track/GradientCard.java | 24 +++-------- .../osmand/plus/views/layers/GPXLayer.java | 9 +++- 3 files changed, 45 insertions(+), 31 deletions(-) diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RouteColorize.java b/OsmAnd-java/src/main/java/net/osmand/router/RouteColorize.java index 8fb0046bb4..e224e9c679 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RouteColorize.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RouteColorize.java @@ -4,6 +4,7 @@ import net.osmand.GPXUtilities; import net.osmand.PlatformUtil; import net.osmand.osm.edit.Node; import net.osmand.osm.edit.OsmMapUtils; +import net.osmand.util.Algorithms; import net.osmand.util.MapUtils; import org.apache.commons.logging.Log; @@ -30,6 +31,8 @@ public class RouteColorize { public static final int RED = rgbaToDecimal(243, 55, 77, 255); public static final int[] colors = new int[] {GREEN, YELLOW, RED}; + private static final int MAX_SLOPE_VALUE = 25; + public enum ColorizationType { ELEVATION, SPEED, @@ -75,7 +78,7 @@ public class RouteColorize { /** * @param type ELEVATION, SPEED, SLOPE */ - public RouteColorize(int zoom, GPXUtilities.GPXFile gpxFile, ColorizationType type) { + public RouteColorize(int zoom, GPXUtilities.GPXFile gpxFile, ColorizationType type, float maxProfileSpeed) { if (!gpxFile.hasTrkPt()) { LOG.warn("GPX file is not consist of track points"); @@ -85,21 +88,27 @@ public class RouteColorize { List latList = new ArrayList<>(); List lonList = new ArrayList<>(); List valList = new ArrayList<>(); + + GPXUtilities.GPXTrackAnalysis analysis = Algorithms.isEmpty(gpxFile.path) ? + gpxFile.getAnalysis(System.currentTimeMillis()) : gpxFile.getAnalysis(gpxFile.modifiedTime); + int wptIdx = 0; for (GPXUtilities.Track t : gpxFile.tracks) { for (GPXUtilities.TrkSegment ts : t.segments) { for (GPXUtilities.WptPt p : ts.points) { latList.add(p.lat); lonList.add(p.lon); if (type == ColorizationType.SPEED) { - valList.add(p.speed); + valList.add((double) analysis.speedData.get(wptIdx).speed); } else { - valList.add(p.ele); + valList.add((double) analysis.elevationData.get(wptIdx).elevation); } + wptIdx++; } } } this.zoom = zoom; + colorizationType = type; latitudes = listToArray(latList); longitudes = listToArray(lonList); @@ -108,9 +117,8 @@ public class RouteColorize { } else { values = listToArray(valList); } - calculateMinMaxValue(); - colorizationType = type; + maxValue = getMaxValue(colorizationType, analysis, minValue, maxProfileSpeed); checkPalette(); sortPalette(); } @@ -194,7 +202,7 @@ public class RouteColorize { return rgbaToDecimal((int) resultRed, (int) resultGreen, (int) resultBlue, (int) resultAlpha); } } - return getDefaultColor(); + return getTransparentColor(); } public void setPalette(double[][] palette) { @@ -209,12 +217,12 @@ public class RouteColorize { } setPalette(new double[][] { {minValue, gradientPalette[0]}, - {colorizationType == ColorizationType.SLOPE ? 0 : (minValue + maxValue) / 2, gradientPalette[1]}, + {(minValue + maxValue) / 2, gradientPalette[1]}, {maxValue, gradientPalette[2]} }); } - private int getDefaultColor() { + private int getTransparentColor() { return rgbaToDecimal(0, 0, 0, 0); } @@ -295,7 +303,7 @@ public class RouteColorize { double[][] defaultPalette = { {minValue, GREEN}, - {colorizationType == ColorizationType.SLOPE ? 0 : (minValue + maxValue) / 2, YELLOW}, + {(minValue + maxValue) / 2, YELLOW}, {maxValue, RED} }; palette = defaultPalette; @@ -397,6 +405,20 @@ public class RouteColorize { return result; } + public static double getMinValue(ColorizationType type, GPXUtilities.GPXTrackAnalysis analysis) { + return type == ColorizationType.ELEVATION ? analysis.minElevation : 0.0; + } + + public static double getMaxValue(ColorizationType type, GPXUtilities.GPXTrackAnalysis analysis, double minValue, double maxProfileSpeed) { + if (type == ColorizationType.SPEED) { + return Math.max(analysis.maxSpeed, maxProfileSpeed); + } else if (type == ColorizationType.ELEVATION) { + return Math.max(analysis.maxElevation, minValue + 50); + } else { + return MAX_SLOPE_VALUE; + } + } + private void calculateMinMaxValue() { if (values.length == 0) return; @@ -457,5 +479,4 @@ public class RouteColorize { this.val = val; } } - -} +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/track/GradientCard.java b/OsmAnd/src/net/osmand/plus/track/GradientCard.java index 217ad2a8f1..3c34d9f68d 100644 --- a/OsmAnd/src/net/osmand/plus/track/GradientCard.java +++ b/OsmAnd/src/net/osmand/plus/track/GradientCard.java @@ -12,6 +12,7 @@ import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.helpers.AndroidUiHelper; import net.osmand.plus.routepreparationmenu.cards.BaseCard; +import net.osmand.router.RouteColorize; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -42,8 +43,9 @@ public class GradientCard extends BaseCard { AndroidUiHelper.updateVisibility(view, true); TextView minValue = view.findViewById(R.id.min_value); TextView maxValue = view.findViewById(R.id.max_value); - float min = getMinValue(); - float max = getMaxValue(min); + double min = RouteColorize.getMinValue(selectedScaleType.toColorizationType(), gpxTrackAnalysis); + double max = RouteColorize.getMaxValue(selectedScaleType.toColorizationType(), + gpxTrackAnalysis, min, app.getSettings().getApplicationMode().getMaxSpeed()); minValue.setText(formatValue(min)); maxValue.setText(formatValue(max)); } @@ -53,27 +55,13 @@ public class GradientCard extends BaseCard { updateContent(); } - private float getMinValue() { - return (float) (selectedScaleType == GradientScaleType.ALTITUDE ? gpxTrackAnalysis.minElevation : 0.0); - } - - private float getMaxValue(float minValue) { - if (selectedScaleType == GradientScaleType.SPEED) { - return (Math.max(gpxTrackAnalysis.maxSpeed, app.getSettings().getApplicationMode().getMaxSpeed())); - } else if (selectedScaleType == GradientScaleType.ALTITUDE) { - return (float) Math.max(gpxTrackAnalysis.maxElevation, minValue + 50); - } else { - return 25; - } - } - - private CharSequence formatValue(float value) { + private CharSequence formatValue(double value) { if (selectedScaleType == GradientScaleType.ALTITUDE) { return OsmAndFormatter.getFormattedAlt(value, app); } else if (selectedScaleType == GradientScaleType.SLOPE) { return (int) value + " %"; } - String speed = OsmAndFormatter.getFormattedSpeed(value, app); + String speed = OsmAndFormatter.getFormattedSpeed((float) value, app); String speedUnit = app.getSettings().SPEED_SYSTEM.get().toShortString(app); Spannable formattedSpeed = new SpannableString(speed); formattedSpeed.setSpan( diff --git a/OsmAnd/src/net/osmand/plus/views/layers/GPXLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/GPXLayer.java index c16d687614..5c757285ef 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/GPXLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/GPXLayer.java @@ -684,11 +684,16 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM List segments = selectedGpxFile.getPointsToDisplay(); GradientScaleType scaleType = getGradientScaleType(gpxFile); List colorsOfPoints = null; - if (scaleType != null) { - RouteColorize colorize = new RouteColorize(view.getZoom(), gpxFile, scaleType.toColorizationType()); + boolean needCalculateColors = scaleType != null && segments.get(0).points.get(0) + .getColor(scaleType.toColorizationType()) == 0; + + if (scaleType != null && currentTrack || needCalculateColors) { + RouteColorize colorize = new RouteColorize(view.getZoom(), gpxFile, + scaleType.toColorizationType(), view.getApplication().getSettings().getApplicationMode().getMaxSpeed()); colorize.setPalette(getColorizationPalette(gpxFile, scaleType)); colorsOfPoints = colorize.getResult(false); } + int startIdx = 0; for (TrkSegment ts : segments) { String width = getTrackWidthName(gpxFile, defaultTrackWidthPref.get());