Fix route to gpx issues
This commit is contained in:
parent
f26f57f97d
commit
b7a6d89b18
3 changed files with 93 additions and 65 deletions
|
@ -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++;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue