Skip to content

Commit

Permalink
Merge branch 'master' into issue_15350
Browse files Browse the repository at this point in the history
  • Loading branch information
vshcherb committed Jul 7, 2023
2 parents 75be6d7 + 42f672b commit 1bda2a5
Show file tree
Hide file tree
Showing 339 changed files with 7,855 additions and 2,665 deletions.
12 changes: 6 additions & 6 deletions .github/ISSUE_TEMPLATE/2-bug-report.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
---
name: "🐞 Bug report"
name: "Bug report"
about: Report a bug in OsmAnd
---

### Description
## Description

### Steps to reproduce
### How to reproduce

### Actual result

### Expected result

### Your Environment
OsmAnd Version:
Android/iOS version:
**Environment**
OsmAnd Version:
Android/iOS version:
Device model:
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ public interface OsmAndCustomizationConstants {
String UNDERLAY_MAP = SHOW_ITEMS_ID_SCHEME + "underlay_map";
String CONTOUR_LINES = SHOW_ITEMS_ID_SCHEME + "contour_lines";
String TERRAIN_ID = SHOW_ITEMS_ID_SCHEME + "terrain";
String TERRAIN_CATEGORY_ID = SHOW_ITEMS_ID_SCHEME + "terrain_category";
String TERRAIN_DESCRIPTION_ID = SHOW_ITEMS_ID_SCHEME + "terrain_description";
String WEATHER_ID = SHOW_ITEMS_ID_SCHEME + "weather";
String MAP_ENABLE_3D_MAPS_ID = SHOW_ITEMS_ID_SCHEME + "enable_3d_maps";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,15 @@ private void analyze() {
} else if (t.startsWith("access") && v != null) {
type = ACCESS;
} else if (t.startsWith("maxspeed") && v != null) {
forward = t.endsWith(":forward") ? 1 : t.endsWith(":backward") ? -1 : 0;
if (t.endsWith(":forward")) {
t = t.substring(0, t.length() - ":forward".length());
forward = 1;
} else if (t.endsWith(":backward")) {
t = t.substring(0, t.length() - ":backward".length());
forward = -1;
} else {
forward = 0;
}
floatValue = RouteDataObject.parseSpeed(v, 0);
if (t.equalsIgnoreCase("maxspeed")) {
type = MAXSPEED;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,9 @@

import java.util.Arrays;

import org.apache.commons.logging.Log;

import gnu.trove.map.hash.TIntObjectHashMap;
import net.osmand.Location;
import net.osmand.PlatformUtil;
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion;
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule;
import net.osmand.data.LatLon;
Expand Down Expand Up @@ -603,8 +601,8 @@ public float getMaximumSpeed(boolean direction, int profile) {
float maxSpeed = 0, maxProfileSpeed = 0;
for (int type : types) {
RouteTypeRule r = region.quickGetEncodingRule(type);
boolean forwardDirection = r.isForward() >= 0;
if (forwardDirection == direction) {
boolean forwardDirection = r.isForward() > 0;
if (forwardDirection == direction || r.isForward() == 0) {
// priority over default
maxSpeed = r.maxSpeed(RouteTypeRule.PROFILE_NONE) > 0 ? r.maxSpeed(RouteTypeRule.PROFILE_NONE) : maxSpeed;
maxProfileSpeed = r.maxSpeed(profile) > 0 ? r.maxSpeed(profile) : maxProfileSpeed;
Expand Down
102 changes: 102 additions & 0 deletions OsmAnd-java/src/main/java/net/osmand/gpx/ElevationApproximator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
package net.osmand.gpx;

import net.osmand.data.LatLon;
import net.osmand.util.MapUtils;

import java.util.ArrayList;
import java.util.List;

public abstract class ElevationApproximator {

private static final double SLOPE_THRESHOLD = 70.0;

private double[] distances;
private double[] elevations;

public ElevationApproximator() {
}

public abstract double getPointLatitude(int index);

public abstract double getPointLongitude(int index);

public abstract double getPointElevation(int index);

public abstract int getPointsCount();

public double[] getDistances() {
return distances;
}

public double[] getElevations() {
return elevations;
}

public boolean approximate() {
int pointsCount = getPointsCount();
if (pointsCount < 4) {
return false;
}

boolean[] survived = new boolean[pointsCount];
int lastSurvived = 0;
survived[0] = true;
int survidedCount = 1;
for (int i = 1; i < pointsCount - 1; i++) {
double prevEle = getPointElevation(lastSurvived);
double ele = getPointElevation(i);
double eleNext = getPointElevation(i + 1);
if ((ele - prevEle) * (eleNext - ele) > 0 && Math.abs(ele - prevEle) > 2) {
survived[i] = true;
lastSurvived = i;
survidedCount++;
}
}
survived[pointsCount - 1] = true;
survidedCount++;
if (survidedCount < 4) {
return false;
}

lastSurvived = 0;
survidedCount = 1;
for (int i = 1; i < pointsCount; i++) {
if (!survived[i]) {
continue;
}
double ele = getPointElevation(i);
double prevEle = getPointElevation(lastSurvived);
double dist = MapUtils.getDistance(getPointLatitude(i), getPointLongitude(i),
getPointLatitude(lastSurvived), getPointLongitude(lastSurvived));
double slope = (ele - prevEle) * 100 / dist;
if (Math.abs(slope) > SLOPE_THRESHOLD) {
survived[i] = false;
continue;
}
lastSurvived = i;
survidedCount++;
}
if (survidedCount < 4) {
return false;
}

double[] distances = new double[survidedCount];
double[] elevations = new double[survidedCount];
int k = 0;
lastSurvived = 0;
for (int i = 0; i < pointsCount; i++) {
if (!survived[i] || k == survidedCount) {
continue;
}
distances[k] = lastSurvived == i ? 0 :
MapUtils.getDistance(getPointLatitude(i), getPointLongitude(i),
getPointLatitude(lastSurvived), getPointLongitude(lastSurvived));
elevations[k] = getPointElevation(i);
k++;
lastSurvived = i;
}
this.distances = distances;
this.elevations = elevations;
return true;
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package net.osmand.gpx;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import net.osmand.gpx.GPXUtilities.WptPt;
import net.osmand.util.MapUtils;

public abstract class ElevationDiffsCalculator {
Expand Down Expand Up @@ -77,14 +79,14 @@ private void findMaximumExtremumBetween(int start, int end, boolean[] points) {
int max = start;
double maxDiff = ELE_THRESHOLD;
for (int i = start + 1; i < end; i++) {
double md = getProjectionDist(getPointDistance(i), getPointElevation(i),
double md = getProjectionDist(getPointDistance(i), getPointElevation(i),
firstPointDist, firstPointEle, endPointDist, endPointEle);
if (md > maxDiff) {
max = i;
maxDiff = md;
}
}
if(max != start) {
if (max != start) {
points[max] = true;
findMaximumExtremumBetween(start, max, points);
findMaximumExtremumBetween(max, end, points);
Expand Down Expand Up @@ -119,4 +121,68 @@ public void calculateElevationDiffs() {
}
}
}

public static void main(String[] args) {
GPXFile gpxFile = GPXUtilities.loadGPXFile(new File("/Users/crimean/Downloads/2011-09-27_Mulhacen.gpx"));
List<WptPt> points = gpxFile.tracks.get(0).segments.get(0).points;
calculateDiffs(points);
int start = 200;
for (int i = start + 150; i < start + 160; i++) {
calculateDiffs(points.subList(start, i));
}
}

private static void calculateDiffs(final List<WptPt> points) {
ElevationApproximator approximator = new ElevationApproximator() {
@Override
public double getPointLatitude(int index) {
return points.get(index).lat;
}

@Override
public double getPointLongitude(int index) {
return points.get(index).lon;
}

@Override
public double getPointElevation(int index) {
return points.get(index).ele;
}

@Override
public int getPointsCount() {
return points.size();
}
};
approximator.approximate();
final double[] distances = approximator.getDistances();
final double[] elevations = approximator.getElevations();

if (distances != null && elevations != null) {
double diffElevationUp = 0;
double diffElevationDown = 0;
ElevationDiffsCalculator elevationDiffsCalc = new ElevationDiffsCalculator() {
@Override
public double getPointDistance(int index) {
return distances[index];
}

@Override
public double getPointElevation(int index) {
return elevations[index];
}

@Override
public int getPointsCount() {
return distances.length;
}
};
elevationDiffsCalc.calculateElevationDiffs();
diffElevationUp += elevationDiffsCalc.getDiffElevationUp();
diffElevationDown += elevationDiffsCalc.getDiffElevationDown();

System.out.println("GPX points=" + points.size() + " approx points=" + distances.length
+ " diffUp=" + diffElevationUp + " diffDown=" + diffElevationDown);
}
}
}
52 changes: 40 additions & 12 deletions OsmAnd-java/src/main/java/net/osmand/gpx/GPXTrackAnalysis.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.apache.commons.logging.Log;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

Expand Down Expand Up @@ -68,7 +69,7 @@ public class GPXTrackAnalysis {
public double top = 0;
public double bottom = 0;

public Map<String, PointsAttributesData> pointsAttributesData;
public Map<String, PointsAttributesData<?>> pointsAttributesData;

public boolean hasSpeedInTrack = false;

Expand Down Expand Up @@ -127,18 +128,19 @@ public PointsAttributesData<Speed> getSpeedData() {
return getAttributesData(POINT_SPEED);
}

public <T extends PointAttribute> PointsAttributesData<T> getAttributesData(String key) {
PointsAttributesData data = pointsAttributesData.get(key);
public <T extends PointAttribute<? extends Number>> PointsAttributesData<T> getAttributesData(String key) {
@SuppressWarnings("unchecked")
PointsAttributesData<T> data = (PointsAttributesData<T>) pointsAttributesData.get(key);
if (data == null) {
data = new PointsAttributesData(key);
data = new PointsAttributesData<T>(key);
pointsAttributesData.put(key, data);
}
return data;
}

public void addPointAttribute(PointAttribute attribute) {
public <T extends PointAttribute<? extends Number>> void addPointAttribute(T attribute) {
String key = attribute.getKey();
PointsAttributesData data = getAttributesData(key);
PointsAttributesData<T> data = getAttributesData(key);
data.addPointAttribute(attribute);

if (!data.hasData() && attribute.hasValidValue() && totalDistance > 0) {
Expand Down Expand Up @@ -323,10 +325,15 @@ public GPXTrackAnalysis prepareInformation(long filestamp, TrackPointsAnalyser p
}
}

ElevationDiffsCalculator elevationDiffsCalc = new ElevationDiffsCalculator() {
ElevationApproximator approximator = new ElevationApproximator() {
@Override
public double getPointDistance(int index) {
return s.get(index).distance;
public double getPointLatitude(int index) {
return s.get(index).lat;
}

@Override
public double getPointLongitude(int index) {
return s.get(index).lon;
}

@Override
Expand All @@ -339,9 +346,30 @@ public int getPointsCount() {
return s.getNumberOfPoints();
}
};
elevationDiffsCalc.calculateElevationDiffs();
diffElevationUp += elevationDiffsCalc.getDiffElevationUp();
diffElevationDown += elevationDiffsCalc.getDiffElevationDown();
approximator.approximate();
final double[] distances = approximator.getDistances();
final double[] elevations = approximator.getElevations();
if (distances != null && elevations != null) {
ElevationDiffsCalculator elevationDiffsCalc = new ElevationDiffsCalculator() {
@Override
public double getPointDistance(int index) {
return distances[index];
}

@Override
public double getPointElevation(int index) {
return elevations[index];
}

@Override
public int getPointsCount() {
return distances.length;
}
};
elevationDiffsCalc.calculateElevationDiffs();
diffElevationUp += elevationDiffsCalc.getDiffElevationUp();
diffElevationDown += elevationDiffsCalc.getDiffElevationDown();
}
}

if (totalDistance < 0) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package net.osmand.gpx;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class PointsAttributesData<T extends PointAttribute> {
public class PointsAttributesData<T extends PointAttribute<?>> {

private String key;
private List<T> attributes = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ public class GeneralRouter implements VehicleRouter {
public static final String VEHICLE_WIDTH = "width";
public static final String VEHICLE_LENGTH = "length";
public static final String MOTOR_TYPE = "motor_type";
public static final String ALLOW_VIA_FERRATA = "allow_via_ferrata";
public static final String CHECK_ALLOW_PRIVATE_NEEDED = "check_allow_private_needed";

private static boolean USE_CACHE = true;
Expand Down
Loading

0 comments on commit 1bda2a5

Please sign in to comment.