Fix route to gpx issues

This commit is contained in:
max-klaus 2020-09-19 19:18:22 +03:00
parent f26f57f97d
commit b7a6d89b18
3 changed files with 93 additions and 65 deletions

View file

@ -271,7 +271,7 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
bundle.putString("turnLanes", TurnType.lanesToString(turnLanes)); bundle.putString("turnLanes", TurnType.lanesToString(turnLanes));
} }
} }
bundle.putLong("id", object.id); bundle.putLong("id", object.id >> 6); // OsmAnd ID to OSM ID
bundle.putArray("types", convertTypes(object.types, rules)); bundle.putArray("types", convertTypes(object.types, rules));
int start = Math.min(startPointIndex, endPointIndex); int start = Math.min(startPointIndex, endPointIndex);
@ -327,22 +327,21 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
Location prevLocation = null; Location prevLocation = null;
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
Location location = resources.getLocation(index); Location location = resources.getLocation(index);
if (location == null) { if (location != null) {
continue; double dist = 0;
} if (prevLocation != null) {
double dist = 0; dist = MapUtils.getDistance(prevLocation.getLatitude(), prevLocation.getLongitude(), location.getLatitude(), location.getLongitude());
if (prevLocation != null) { distance += dist;
dist = MapUtils.getDistance(prevLocation.getLatitude(), prevLocation.getLongitude(), location.getLatitude(), location.getLongitude()); }
distance += dist; prevLocation = location;
} object.pointsX[i] = MapUtils.get31TileNumberX(location.getLongitude());
prevLocation = location; object.pointsY[i] = MapUtils.get31TileNumberY(location.getLatitude());
object.pointsX[i] = MapUtils.get31TileNumberX(location.getLongitude()); if (location.hasAltitude() && object.heightDistanceArray.length > 0) {
object.pointsY[i] = MapUtils.get31TileNumberY(location.getLatitude()); object.heightDistanceArray[i * 2] = (float) dist;
if (location.hasAltitude() && object.heightDistanceArray.length > 0) { object.heightDistanceArray[i * 2 + 1] = (float) location.getAltitude();
object.heightDistanceArray[i * 2] = (float) dist; } else {
object.heightDistanceArray[i * 2 + 1] = (float) location.getAltitude(); object.heightDistanceArray = new float[0];
} else { }
object.heightDistanceArray = new float[0];
} }
if (plus) { if (plus) {
index++; index++;

View file

@ -517,47 +517,90 @@ public class MeasurementEditingContext {
roadSegmentData.clear(); roadSegmentData.clear();
List<WptPt> routePoints = new ArrayList<>(); List<WptPt> routePoints = new ArrayList<>();
List<GpxPoint> gpxPoints = gpxApproximation.finalPoints; List<GpxPoint> gpxPoints = gpxApproximation.finalPoints;
for (int i = 0; i < gpxPoints.size() - 1; i++) { for (int i = 0; i < gpxPoints.size(); i++) {
GpxPoint rp1 = gpxPoints.get(i); GpxPoint gp1 = gpxPoints.get(i);
GpxPoint rp2 = gpxPoints.get(i + 1); boolean lastGpxPoint = isLastGpxPoint(gpxPoints, i);
WptPt p1 = new WptPt();
p1.lat = rp1.loc.getLatitude();
p1.lon = rp1.loc.getLongitude();
p1.setProfileType(mode.getStringKey());
if (i == 0) {
routePoints.add(p1);
}
WptPt p2 = new WptPt();
p2.lat = rp2.loc.getLatitude();
p2.lon = rp2.loc.getLongitude();
p2.setProfileType(mode.getStringKey());
routePoints.add(p2);
Pair<WptPt, WptPt> pair = new Pair<>(p1, p2);
List<WptPt> points = new ArrayList<>(); List<WptPt> points = new ArrayList<>();
List<RouteSegmentResult> segments = new ArrayList<>(); List<RouteSegmentResult> segments = new ArrayList<>();
for (RouteSegmentResult seg : rp1.routeToTarget) { for (int k = 0; k < gp1.routeToTarget.size(); k++) {
segments.add(seg); RouteSegmentResult seg = gp1.routeToTarget.get(k);
int ind = seg.getStartPointIndex(); if (seg.getStartPointIndex() != seg.getEndPointIndex()) {
boolean plus = seg.isForwardDirection(); segments.add(seg);
float[] pf = seg.getObject().calculateHeightArray();
while (ind != seg.getEndPointIndex()) {
LatLon l = seg.getPoint(ind);
WptPt pt = new WptPt();
if (pf != null && pf.length > ind * 2 + 1) {
pt.ele = pf[ind * 2 + 1];
}
pt.lat = l.getLatitude();
pt.lon = l.getLongitude();
points.add(pt);
ind = plus ? ind + 1 : ind - 1;
} }
} }
roadSegmentData.put(pair, new RoadSegmentData(appMode, pair.first, pair.second, points, segments)); for (int k = 0; k < segments.size(); k++) {
RouteSegmentResult seg = segments.get(k);
fillPointsArray(points, seg, lastGpxPoint && k == segments.size() - 1);
}
if (!points.isEmpty()) {
WptPt wp1 = new WptPt();
wp1.lat = gp1.loc.getLatitude();
wp1.lon = gp1.loc.getLongitude();
wp1.setProfileType(mode.getStringKey());
routePoints.add(wp1);
WptPt wp2 = new WptPt();
if (lastGpxPoint) {
wp2.lat = points.get(points.size() - 1).getLatitude();
wp2.lon = points.get(points.size() - 1).getLongitude();
routePoints.add(wp2);
} else {
GpxPoint gp2 = gpxPoints.get(i + 1);
wp2.lat = gp2.loc.getLatitude();
wp2.lon = gp2.loc.getLongitude();
}
wp2.setProfileType(mode.getStringKey());
Pair<WptPt, WptPt> pair = new Pair<>(wp1, wp2);
roadSegmentData.put(pair, new RoadSegmentData(appMode, pair.first, pair.second, points, segments));
}
if (lastGpxPoint) {
break;
}
} }
addPoints(routePoints); addPoints(routePoints);
} }
private boolean isLastGpxPoint(List<GpxPoint> gpxPoints, int index) {
if (index == gpxPoints.size() - 1) {
return true;
} else {
for (int i = index + 1; i < gpxPoints.size(); i++) {
GpxPoint gp = gpxPoints.get(i);
for (int k = 0; k < gp.routeToTarget.size(); k++) {
RouteSegmentResult seg = gp.routeToTarget.get(k);
if (seg.getStartPointIndex() != seg.getEndPointIndex()) {
return false;
}
}
}
}
return true;
}
private void fillPointsArray(List<WptPt> points, RouteSegmentResult seg, boolean includeEndPoint) {
int ind = seg.getStartPointIndex();
boolean plus = seg.isForwardDirection();
float[] heightArray = seg.getObject().calculateHeightArray();
while (ind != seg.getEndPointIndex()) {
addPointToArray(points, seg, ind, heightArray);
ind = plus ? ind + 1 : ind - 1;
}
if (includeEndPoint) {
addPointToArray(points, seg, ind, heightArray);
}
}
private void addPointToArray(List<WptPt> points, RouteSegmentResult seg, int index, float[] heightArray) {
LatLon l = seg.getPoint(index);
WptPt pt = new WptPt();
if (heightArray != null && heightArray.length > index * 2 + 1) {
pt.ele = heightArray[index * 2 + 1];
}
pt.lat = l.getLatitude();
pt.lon = l.getLongitude();
points.add(pt);
}
private int findPointIndex(WptPt point, List<WptPt> points, int firstIndex) { private int findPointIndex(WptPt point, List<WptPt> points, int firstIndex) {
double minDistance = Double.MAX_VALUE; double minDistance = Double.MAX_VALUE;
int index = 0; int index = 0;
@ -740,10 +783,7 @@ public class MeasurementEditingContext {
} }
locations.add(l); locations.add(l);
} }
pair.second.setTrkPtIndex(locations.size() - 1); pair.second.setTrkPtIndex(i < size - 1 ? locations.size() : locations.size() - 1);
if (i < size - 2 && !locations.isEmpty()) {
locations.remove(locations.size() - 1);
}
route.addAll(data.segments); route.addAll(data.segments);
} }
} }

View file

@ -356,17 +356,6 @@ public class RouteCalculationResult {
} }
lastHeight = h; lastHeight = h;
} }
// FIXME: investigate gpx file
if (s.getObject().getPoint31XTile(i) == 0 && s.getObject().getPoint31YTile(i) == 0) {
if (locations.size() > 0) {
Location prev = locations.get(locations.size() - 1);
n.setLatitude(prev.getLatitude());
n.setLongitude(prev.getLongitude());
if (prev.hasAltitude()) {
n.setAltitude(prev.getAltitude());
}
}
}
locations.add(n); locations.add(n);
attachAlarmInfo(alarms, s, i, locations.size()); attachAlarmInfo(alarms, s, i, locations.size());
segmentsToPopulate.add(s); segmentsToPopulate.add(s);