Merge pull request #538 from afischerdev/lib-update-export
Lib update export
This commit is contained in:
commit
242a1d7b93
7 changed files with 112 additions and 49 deletions
|
@ -138,8 +138,8 @@ abstract class OsmPath implements OsmLinkHolder {
|
|||
message.ele = Short.MIN_VALUE;
|
||||
message.linkdist = sourceNode.calcDistance(targetNode);
|
||||
message.wayKeyValues = "direct_segment=" + seg;
|
||||
}
|
||||
seg++;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -350,8 +350,10 @@ public final class OsmTrack {
|
|||
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++) {
|
||||
if (i > 0 || ourSize == 0) {
|
||||
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) {
|
||||
e.setTime(e.getTime() + t0);
|
||||
e.setEnergy(e.getEnergy() + e0);
|
||||
nodes.add(e);
|
||||
|
@ -613,7 +615,10 @@ public final class OsmTrack {
|
|||
}
|
||||
}
|
||||
sb.append(" <trk>\n");
|
||||
if (turnInstructionMode == 9) { // brouter style
|
||||
if (turnInstructionMode == 9
|
||||
|| turnInstructionMode == 2
|
||||
|| turnInstructionMode == 8
|
||||
|| turnInstructionMode == 4) { // Locus, comment, cruise, brouter style
|
||||
sb.append(" <src>").append(name).append("</src>\n");
|
||||
sb.append(" <type>").append(voiceHints.getTransportMode()).append("</type>\n");
|
||||
} else {
|
||||
|
@ -644,14 +649,19 @@ public final class OsmTrack {
|
|||
if (showTime) {
|
||||
sele += "<time>" + getFormattedTime3(n.getTime()) + "</time>";
|
||||
}
|
||||
|
||||
if (turnInstructionMode == 8) {
|
||||
if (mwpt != null &&
|
||||
!mwpt.name.startsWith("via") && !mwpt.name.startsWith("from") && !mwpt.name.startsWith("to")) {
|
||||
sele += "<name>" + mwpt.name + "</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 += "<name>" + mwpt.name + "</name>";
|
||||
}
|
||||
sele += "<desc>" + hint.getCruiserMessageString() + "</desc>";
|
||||
|
@ -741,17 +751,23 @@ public final class OsmTrack {
|
|||
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 += "<name>" + mwpt.name + "</name>";
|
||||
}
|
||||
if (mwpt.direct && bNextDirect) {
|
||||
sele += "<src>" + hint.getLocusSymbolString() + "</src><sym>pass_place</sym><type>Shaping</type>";
|
||||
// bNextDirect = false;
|
||||
} else if (mwpt.direct) {
|
||||
if (idx == 0)
|
||||
sele += "<sym>pass_place</sym><type>Via</type>";
|
||||
else
|
||||
sele += "<sym>pass_place</sym><type>Shaping</type>";
|
||||
bNextDirect = true;
|
||||
} else if (bNextDirect) {
|
||||
sele += "<src>beeline</src><sym>" + hint.getLocusSymbolString() + "</sym><type>Shaping</type>";
|
||||
bNextDirect = false;
|
||||
} else {
|
||||
sele += "<sym>" + hint.getLocusSymbolString() + "</sym>";
|
||||
sele += "<sym>" + hint.getLocusSymbolString() + "</sym><type>Via</type>";
|
||||
}
|
||||
} else {
|
||||
sele += "<sym>" + hint.getLocusSymbolString() + "</sym>";
|
||||
|
@ -787,28 +803,27 @@ public final class OsmTrack {
|
|||
|
||||
} 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("<sym");
|
||||
if (pos != -1)
|
||||
sele = sele.substring(0, pos) + "<name>" + mwpt.name + "</name>" + sele.substring(pos) + "<type>Via</type>";
|
||||
} else if (sele.contains("sym") && mwpt.name.startsWith("via")) {
|
||||
sele += "<type>Via</type>";
|
||||
} else if (mwpt.direct && bNextDirect) {
|
||||
if (!mwpt.name.startsWith("via") && !mwpt.name.startsWith("from") && !mwpt.name.startsWith("to")) {
|
||||
sele += "<name>" + mwpt.name + "</name>";
|
||||
}
|
||||
if (mwpt.direct && bNextDirect) {
|
||||
sele += "<src>beeline</src><sym>pass_place</sym><type>Shaping</type>";
|
||||
} else if (mwpt.direct) {
|
||||
if (idx == 0)
|
||||
sele += "<sym>pass_place</sym><type>Via</type>";
|
||||
else
|
||||
sele += "<sym>pass_place</sym><type>Shaping</type>";
|
||||
bNextDirect = true;
|
||||
} else if (bNextDirect) {
|
||||
sele += "<src>beeline</src><sym>pass_place</sym><type>Shaping</type>";
|
||||
bNextDirect = false;
|
||||
} else if (mwpt.name.startsWith("via") ||
|
||||
mwpt.name.startsWith("from") ||
|
||||
mwpt.name.startsWith("to")) {
|
||||
if (bNextDirect) {
|
||||
sele += "<src>beeline</src><sym>pass_place</sym><type>Shaping</type>";
|
||||
} else {
|
||||
sele += "<sym>pass_place</sym><type>Shaping</type>";
|
||||
sele += "<sym>pass_place</sym><type>Via</type>";
|
||||
}
|
||||
bNextDirect = false;
|
||||
} else {
|
||||
|
|
|
@ -338,8 +338,9 @@ public class RoutingEngine extends Thread {
|
|||
}
|
||||
} 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 @@ public class RoutingEngine extends Thread {
|
|||
}
|
||||
}
|
||||
|
||||
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();
|
||||
|
@ -549,12 +551,6 @@ public class RoutingEngine extends Thread {
|
|||
ArrayList<OsmPathElement> removeBackList = new ArrayList<>();
|
||||
ArrayList<OsmPathElement> removeForeList = new ArrayList<>();
|
||||
ArrayList<Integer> removeVoiceHintList = new ArrayList<>();
|
||||
int lon0,
|
||||
lat0,
|
||||
lon1,
|
||||
lat1,
|
||||
lon2,
|
||||
lat2;
|
||||
OsmPathElement last = null;
|
||||
OsmPathElement lastJunction = null;
|
||||
CompactLongMap<OsmTrack.OsmPathElementHolder> lastJunctions = new CompactLongMap<>();
|
||||
|
@ -571,6 +567,18 @@ public class RoutingEngine extends Thread {
|
|||
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());
|
||||
|
@ -780,9 +788,9 @@ public class RoutingEngine extends Thread {
|
|||
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);
|
||||
|
@ -793,6 +801,7 @@ public class RoutingEngine extends Thread {
|
|||
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);
|
||||
|
|
|
@ -101,6 +101,19 @@ public class BRouterWorker {
|
|||
|
||||
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<String, String>();
|
||||
|
@ -112,23 +125,11 @@ public class BRouterWorker {
|
|||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
try {
|
||||
|
@ -217,8 +218,8 @@ public class BRouterWorker {
|
|||
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 @@ public class BRouterWorker {
|
|||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -109,8 +109,8 @@ public class ServerHandler extends RequestHandler {
|
|||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -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 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
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in a new issue