diff --git a/brouter-core/src/main/java/btools/router/OsmTrack.java b/brouter-core/src/main/java/btools/router/OsmTrack.java index 670471ccd..aad14e16f 100644 --- a/brouter-core/src/main/java/btools/router/OsmTrack.java +++ b/brouter-core/src/main/java/btools/router/OsmTrack.java @@ -350,8 +350,10 @@ public void appendTrack(OsmTrack t) { float t0 = ourSize > 0 ? nodes.get(ourSize - 1).getTime() : 0; float e0 = ourSize > 0 ? nodes.get(ourSize - 1).getEnergy() : 0; for (i = 0; i < t.nodes.size(); i++) { + OsmPathElement e = t.nodes.get(i); + if (i == 0 && ourSize > 0 && nodes.get(ourSize - 1).getSElev() == Short.MIN_VALUE) + nodes.get(ourSize - 1).setSElev(e.getSElev()); if (i > 0 || ourSize == 0) { - OsmPathElement e = t.nodes.get(i); e.setTime(e.getTime() + t0); e.setEnergy(e.getEnergy() + e0); nodes.add(e); diff --git a/brouter-core/src/main/java/btools/router/RoutingEngine.java b/brouter-core/src/main/java/btools/router/RoutingEngine.java index 006dcbabe..b58645b2a 100644 --- a/brouter-core/src/main/java/btools/router/RoutingEngine.java +++ b/brouter-core/src/main/java/btools/router/RoutingEngine.java @@ -338,8 +338,9 @@ private void postElevationCheck(OsmTrack track) { } } else if (n.getSElev() == Short.MIN_VALUE && idx == track.nodes.size() - 1) { // fill at end + startIdx = idx; for (int i = startIdx; i < track.nodes.size(); i++) { - track.nodes.get(i).setSElev(startElev); + track.nodes.get(i).setSElev(lastElev); } } else if (n.getSElev() == Short.MIN_VALUE) { if (lastPt != null) @@ -474,6 +475,7 @@ private OsmTrack tryFindTrack(OsmTrack[] refTracks, OsmTrack[] lastTracks) { } } + OsmPath.seg = 1; // set segment counter for (int i = 0; i < matchedWaypoints.size() - 1; i++) { if (lastTracks[i] != null) { if (refTracks[i] == null) refTracks[i] = new OsmTrack(); @@ -786,9 +788,9 @@ private void recalcTrack(OsmTrack t) { float addTime = (value / (speed_min / 3.6f)); double addEnergy = 0; - if (key < ourSize - 1) { + if (key > 0) { double GRAVITY = 9.81; // in meters per second^(-2) - double incline = (t.nodes.get(key).getElev() - t.nodes.get(key + 1).getElev()) / value; + double incline = (t.nodes.get(key - 1).getSElev() == Short.MIN_VALUE || t.nodes.get(key).getSElev() == Short.MIN_VALUE ? 0 : (t.nodes.get(key - 1).getElev() - t.nodes.get(key).getElev()) / value); double f_roll = routingContext.totalMass * GRAVITY * (routingContext.defaultC_r + incline); double spd = speed_min / 3.6; addEnergy = value * (routingContext.S_C_x * spd * spd + f_roll); @@ -799,6 +801,7 @@ private void recalcTrack(OsmTrack t) { n.setEnergy(n.getEnergy() + (float) addEnergy); } } + t.energy = (int) t.nodes.get(t.nodes.size() - 1).getEnergy(); logInfo("track-length total = " + t.distance); logInfo("filtered ascend = " + t.ascend);