From 8190aaa92d647ba54241a5252114095658003a95 Mon Sep 17 00:00:00 2001 From: afischerdev Date: Sat, 22 Apr 2023 12:45:36 +0200 Subject: [PATCH 1/6] update new exports --- .../src/main/java/btools/router/OsmPath.java | 2 +- .../src/main/java/btools/router/OsmTrack.java | 49 ++++++++++++------- 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/brouter-core/src/main/java/btools/router/OsmPath.java b/brouter-core/src/main/java/btools/router/OsmPath.java index 2e50ad62..1bf318ba 100644 --- a/brouter-core/src/main/java/btools/router/OsmPath.java +++ b/brouter-core/src/main/java/btools/router/OsmPath.java @@ -138,8 +138,8 @@ protected void addAddionalPenalty(OsmTrack refTrack, boolean detailMode, OsmPath message.ele = Short.MIN_VALUE; message.linkdist = sourceNode.calcDistance(targetNode); message.wayKeyValues = "direct_segment=" + seg; + seg++; } - seg++; return; } diff --git a/brouter-core/src/main/java/btools/router/OsmTrack.java b/brouter-core/src/main/java/btools/router/OsmTrack.java index c57836ae..670471cc 100644 --- a/brouter-core/src/main/java/btools/router/OsmTrack.java +++ b/brouter-core/src/main/java/btools/router/OsmTrack.java @@ -613,7 +613,10 @@ public String formatAsGpx(BufferedWriter sb) throws IOException { } } sb.append(" \n"); - if (turnInstructionMode == 9) { // brouter style + if (turnInstructionMode == 9 + || turnInstructionMode == 2 + || turnInstructionMode == 8 + || turnInstructionMode == 4) { // Locus, comment, cruise, brouter style sb.append(" ").append(name).append("\n"); sb.append(" ").append(voiceHints.getTransportMode()).append("\n"); } else { @@ -644,14 +647,19 @@ public String formatAsGpx(BufferedWriter sb) throws IOException { if (showTime) { sele += ""; } - + if (turnInstructionMode == 8) { + if (mwpt != null && + !mwpt.name.startsWith("via") && !mwpt.name.startsWith("from") && !mwpt.name.startsWith("to")) { + sele += "" + mwpt.name + ""; + } + } boolean bNeedHeader = false; if (turnInstructionMode == 9) { // trkpt/sym style if (hint != null) { if (mwpt != null && - !mwpt.name.startsWith("via") && !mwpt.name.startsWith("from") && !mwpt.name.startsWith("end")) { + !mwpt.name.startsWith("via") && !mwpt.name.startsWith("from") && !mwpt.name.startsWith("to")) { sele += "" + mwpt.name + ""; } sele += "" + hint.getCruiserMessageString() + ""; @@ -741,17 +749,23 @@ public String formatAsGpx(BufferedWriter sb) throws IOException { if (turnInstructionMode == 2) { // locus style new if (hint != null) { if (mwpt != null) { + if (!mwpt.name.startsWith("via") && !mwpt.name.startsWith("from") && !mwpt.name.startsWith("to")) { + sele += "" + mwpt.name + ""; + } if (mwpt.direct && bNextDirect) { sele += "" + hint.getLocusSymbolString() + "pass_placeShaping"; // bNextDirect = false; } else if (mwpt.direct) { - sele += "pass_placeShaping"; + if (idx == 0) + sele += "pass_placeVia"; + else + sele += "pass_placeShaping"; bNextDirect = true; } else if (bNextDirect) { sele += "beeline" + hint.getLocusSymbolString() + "Shaping"; bNextDirect = false; } else { - sele += "" + hint.getLocusSymbolString() + ""; + sele += "" + hint.getLocusSymbolString() + "Via"; } } else { sele += "" + hint.getLocusSymbolString() + ""; @@ -787,28 +801,27 @@ public String formatAsGpx(BufferedWriter sb) throws IOException { } else { if (mwpt != null) { - if (sele.contains("sym") && - !sele.contains("name") && - !mwpt.name.startsWith("via") && - !mwpt.name.startsWith("from") && - !mwpt.name.startsWith("to")) { - int pos = sele.indexOf("" + mwpt.name + "" + sele.substring(pos) + "Via"; - } else if (sele.contains("sym") && mwpt.name.startsWith("via")) { - sele += "Via"; - } else if (mwpt.direct && bNextDirect) { + if (!mwpt.name.startsWith("via") && !mwpt.name.startsWith("from") && !mwpt.name.startsWith("to")) { + sele += "" + mwpt.name + ""; + } + if (mwpt.direct && bNextDirect) { sele += "beelinepass_placeShaping"; } else if (mwpt.direct) { - sele += "pass_placeShaping"; + if (idx == 0) + sele += "pass_placeVia"; + else + sele += "pass_placeShaping"; bNextDirect = true; + } else if (bNextDirect) { + sele += "beelinepass_placeShaping"; + bNextDirect = false; } else if (mwpt.name.startsWith("via") || mwpt.name.startsWith("from") || mwpt.name.startsWith("to")) { if (bNextDirect) { sele += "beelinepass_placeShaping"; } else { - sele += "pass_placeShaping"; + sele += "pass_placeVia"; } bNextDirect = false; } else { From d43edb311dfa2a4b3a8591bbf5797efa79d0000b Mon Sep 17 00:00:00 2001 From: afischerdev Date: Sat, 22 Apr 2023 12:46:35 +0200 Subject: [PATCH 2/6] update import of way point names --- .../java/btools/routingapp/BRouterWorker.java | 35 ++++++++++--------- .../btools/server/request/ServerHandler.java | 4 +-- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/brouter-routing-app/src/main/java/btools/routingapp/BRouterWorker.java b/brouter-routing-app/src/main/java/btools/routingapp/BRouterWorker.java index e6e37835..738b7600 100644 --- a/brouter-routing-app/src/main/java/btools/routingapp/BRouterWorker.java +++ b/brouter-routing-app/src/main/java/btools/routingapp/BRouterWorker.java @@ -101,6 +101,19 @@ public String getTrackFromParams(Bundle params) { if (waypoints == null) return "no pts "; + if (params.containsKey("straight")) { + try { + String straight = params.getString("straight"); + String[] sa = straight.split(","); + for (int i = 0; i < sa.length; i++) { + int v = Integer.valueOf(sa[i]); + if (waypoints.size() > v) waypoints.get(v).direct = true; + } + } catch (NumberFormatException e) { + } + } + + if (params.containsKey("extraParams")) { // add user params String extraParams = params.getString("extraParams"); if (rc.keyValues == null) rc.keyValues = new HashMap(); @@ -112,19 +125,7 @@ public String getTrackFromParams(Bundle params) { String key = tk2.nextToken(); if (tk2.hasMoreTokens()) { String value = tk2.nextToken(); - if (key.equals("straight")) { - try { - String[] sa = value.split(","); - for (int i = 0; i < sa.length; i++) { - int v = Integer.valueOf(sa[i]); - if (waypoints.size() > v) waypoints.get(v).direct = true; - } - } catch (Exception e) { - System.err.println("error " + e.getStackTrace()[0].getLineNumber() + " " + e.getStackTrace()[0] + "\n" + e); - } - } else { - rc.keyValues.put(key, value); - } + rc.keyValues.put(key, value); } } } @@ -217,8 +218,8 @@ private List readPositions(Bundle params) { n.ilat = (int) ((lats[i] + 90.) * 1000000. + 0.5); wplist.add(n); } - wplist.get(0).name = "from"; - wplist.get(wplist.size() - 1).name = "to"; + if (wplist.get(0).name.startsWith("via")) wplist.get(0).name = "from"; + if (wplist.get(wplist.size() - 1).name.startsWith("via")) wplist.get(wplist.size() - 1).name = "to"; return wplist; } @@ -247,8 +248,8 @@ private List readLonlats(Bundle params) { } } - wplist.get(0).name = "from"; - wplist.get(wplist.size() - 1).name = "to"; + if (wplist.get(0).name.startsWith("via")) wplist.get(0).name = "from"; + if (wplist.get(wplist.size() - 1).name.startsWith("via")) wplist.get(wplist.size() - 1).name = "to"; return wplist; } diff --git a/brouter-server/src/main/java/btools/server/request/ServerHandler.java b/brouter-server/src/main/java/btools/server/request/ServerHandler.java index 426f5bee..273c3c9e 100644 --- a/brouter-server/src/main/java/btools/server/request/ServerHandler.java +++ b/brouter-server/src/main/java/btools/server/request/ServerHandler.java @@ -109,8 +109,8 @@ public List readWayPointList() { } } - wplist.get(0).name = "from"; - wplist.get(wplist.size() - 1).name = "to"; + if (wplist.get(0).name.startsWith("via")) wplist.get(0).name = "from"; + if (wplist.get(wplist.size() - 1).name.startsWith("via")) wplist.get(wplist.size() - 1).name = "to"; return wplist; } From 1df5a468b089c8519b682bb10cc150f748f1f9c5 Mon Sep 17 00:00:00 2001 From: afischerdev Date: Sat, 22 Apr 2023 12:47:29 +0200 Subject: [PATCH 3/6] update docs for incoming params --- docs/developers/android_service.md | 36 ++++++++++++++++++++++++++++++ docs/developers/http_server.md | 2 ++ 2 files changed, 38 insertions(+) diff --git a/docs/developers/android_service.md b/docs/developers/android_service.md index f9165a52..adec8808 100644 --- a/docs/developers/android_service.md +++ b/docs/developers/android_service.md @@ -8,3 +8,39 @@ BRouter exposes an [Android Service](https://developer.android.com/guide/components/services) which can be used by other applications to calculate routes. See `IBRouterService.aidl` for the interface definition. + + +## Some words on the input rules (app and server) + +We have some parts of input: + +### lonlats + +The lonlats parameter is a list of positions where the routing should go along. It is recommended to use this instead of the two parameter lons and lats. + +When there are more than two points the 'via' points may be off the perfect route - in lower zoom level it is not always clear if a point meets the best way. + +The profile parameter 'correctMisplacedViaPoints' tries to avoid this situation. + +On the other hand, it would be fatal if this point is not reached when you want to go there. +There are to choices to manage that: +- add a poi to the 'pois' list +- name the point in lonlats list + +Another feature of BRouter is routing via beelines. +Define a straight starting point in the 'lonlats' list with a 'd' (direct). The second point needs no declaration. + +This contradicts the naming rules in 'lonlats'. If the point is to be given a name, the router parameter 'straight' can be used instead and filled with the index of the point. + +'nogos', 'polylines' and 'polygons' are also lists of positions. +Please note: when they have a parameter 'weight' the result is not an absolute nogo it is weighted to the other ways. + +### routing parameter + +This parameters are needed to tell BRouter what to do. + +### profile parameter + +Profile parameters affect the result of a profile. +For the app it is a list of params concated by '&'. E.g. extraParams=avoidferry=1&avoidsteps=0 +The server calls profile params by a prefix 'profile:'. E.g. ...&profile:avoidferry=1&profile:avoidsteps=0 diff --git a/docs/developers/http_server.md b/docs/developers/http_server.md index d00e454e..2b6df157 100644 --- a/docs/developers/http_server.md +++ b/docs/developers/http_server.md @@ -14,3 +14,5 @@ BRouter HTTP server for various platforms. The API endpoints exposed by this HTTP server are documented in the `ServerHandler.java` + +Please see also [IBRouterService.aidl](./android_service.md) for calling parameter. From 1779b1d3b5b86bdb88906dec97e6603af7834966 Mon Sep 17 00:00:00 2001 From: afischerdev Date: Sat, 22 Apr 2023 13:17:52 +0200 Subject: [PATCH 4/6] update misplace check routine for roundabouts --- .../java/btools/router/RoutingEngine.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/brouter-core/src/main/java/btools/router/RoutingEngine.java b/brouter-core/src/main/java/btools/router/RoutingEngine.java index 011a21ef..006dcbab 100644 --- a/brouter-core/src/main/java/btools/router/RoutingEngine.java +++ b/brouter-core/src/main/java/btools/router/RoutingEngine.java @@ -249,7 +249,7 @@ private void postElevationCheck(OsmTrack track) { int ourSize = track.nodes.size(); for (int idx = 0; idx < ourSize; idx++) { OsmPathElement n = track.nodes.get(idx); - if (n.getSElev() == Short.MIN_VALUE && lastElev != Short.MIN_VALUE && idx < ourSize-1) { + if (n.getSElev() == Short.MIN_VALUE && lastElev != Short.MIN_VALUE && idx < ourSize - 1) { // start one point before entry point to get better elevation results if (idx > 1) startElev = track.nodes.get(idx - 2).getSElev(); @@ -549,12 +549,6 @@ private boolean snappPathConnection(OsmTrack tt, OsmTrack t, MatchedWaypoint sta ArrayList removeBackList = new ArrayList<>(); ArrayList removeForeList = new ArrayList<>(); ArrayList removeVoiceHintList = new ArrayList<>(); - int lon0, - lat0, - lon1, - lat1, - lon2, - lat2; OsmPathElement last = null; OsmPathElement lastJunction = null; CompactLongMap lastJunctions = new CompactLongMap<>(); @@ -571,6 +565,18 @@ private boolean snappPathConnection(OsmTrack tt, OsmTrack t, MatchedWaypoint sta int junctions = 0; tmpback = tt.nodes.get(indexback); tmpfore = t.nodes.get(indexfore); + if (tmpback.message != null && tmpback.message.isRoundabout()) { + removeBackList.clear(); + removeForeList.clear(); + removeVoiceHintList.clear(); + return false; + } + if (tmpfore.message != null && tmpfore.message.isRoundabout()) { + removeBackList.clear(); + removeForeList.clear(); + removeVoiceHintList.clear(); + return false; + } int dist = tmpback.calcDistance(tmpfore); if (1 == 1) { OsmTrack.OsmPathElementHolder detours = tt.getFromDetourMap(tmpback.getIdFromPos()); From 8a6579ef4d603bae725052f4b6e464f7a08da03a Mon Sep 17 00:00:00 2001 From: afischerdev Date: Sat, 22 Apr 2023 15:09:34 +0200 Subject: [PATCH 5/6] error correction --- docs/developers/android_service.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/developers/android_service.md b/docs/developers/android_service.md index adec8808..52159a7a 100644 --- a/docs/developers/android_service.md +++ b/docs/developers/android_service.md @@ -42,5 +42,5 @@ This parameters are needed to tell BRouter what to do. ### profile parameter Profile parameters affect the result of a profile. -For the app it is a list of params concated by '&'. E.g. extraParams=avoidferry=1&avoidsteps=0 +For the app it is a list of params concatenated by '&'. E.g. extraParams=avoidferry=1&avoidsteps=0 The server calls profile params by a prefix 'profile:'. E.g. ...&profile:avoidferry=1&profile:avoidsteps=0 From b7422c0ca71d5e0dde9db715164175238f2eea07 Mon Sep 17 00:00:00 2001 From: afischerdev Date: Mon, 24 Apr 2023 13:41:29 +0200 Subject: [PATCH 6/6] smaller rework on elev and energy values --- brouter-core/src/main/java/btools/router/OsmTrack.java | 4 +++- .../src/main/java/btools/router/RoutingEngine.java | 9 ++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/brouter-core/src/main/java/btools/router/OsmTrack.java b/brouter-core/src/main/java/btools/router/OsmTrack.java index 670471cc..aad14e16 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 006dcbab..b58645b2 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);