diff --git a/brouter-core/src/main/java/btools/router/FormatCsv.java b/brouter-core/src/main/java/btools/router/FormatCsv.java index 37b740810..9f4162d39 100644 --- a/brouter-core/src/main/java/btools/router/FormatCsv.java +++ b/brouter-core/src/main/java/btools/router/FormatCsv.java @@ -23,7 +23,7 @@ public String format(OsmTrack t) { } public void writeMessages(BufferedWriter bw, OsmTrack t) throws Exception { - dumpLine(bw, MESSAGES_HEADER); + dumpLine(bw, MESSAGES_HEADER.replace("\tUserOutput", rc.expctxWay.getUserOutputHeader())); for (String m : t.aggregateMessages()) { dumpLine(bw, m); } diff --git a/brouter-core/src/main/java/btools/router/FormatJson.java b/brouter-core/src/main/java/btools/router/FormatJson.java index d84b78f4a..c6289d9c3 100644 --- a/brouter-core/src/main/java/btools/router/FormatJson.java +++ b/brouter-core/src/main/java/btools/router/FormatJson.java @@ -69,7 +69,7 @@ public String format(OsmTrack t) { // ... traditional message list { sb.append(" \"messages\": [\n"); - sb.append(" [\"").append(MESSAGES_HEADER.replaceAll("\t", "\", \"")).append("\"],\n"); + sb.append(" [\"").append(MESSAGES_HEADER.replace("\tUserOutput", rc.userOutputHeader).replaceAll("\t", "\", \"")).append("\"],\n"); for (String m : t.aggregateMessages()) { sb.append(" [\"").append(m.replaceAll("\t", "\", \"")).append("\"],\n"); } diff --git a/brouter-core/src/main/java/btools/router/Formatter.java b/brouter-core/src/main/java/btools/router/Formatter.java index 09bdb1da5..b97c752d5 100644 --- a/brouter-core/src/main/java/btools/router/Formatter.java +++ b/brouter-core/src/main/java/btools/router/Formatter.java @@ -9,7 +9,7 @@ public abstract class Formatter { - static final String MESSAGES_HEADER = "Longitude\tLatitude\tElevation\tDistance\tCostPerKm\tElevCost\tTurnCost\tNodeCost\tInitialCost\tWayTags\tNodeTags\tTime\tEnergy"; + static final String MESSAGES_HEADER = "Longitude\tLatitude\tElevation\tDistance\tCostPerKm\tElevCost\tTurnCost\tNodeCost\tUserOutput\tInitialCost\tWayTags\tNodeTags\tTime\tEnergy"; RoutingContext rc; diff --git a/brouter-core/src/main/java/btools/router/MessageData.java b/brouter-core/src/main/java/btools/router/MessageData.java index 0fde0f8db..3ef580681 100644 --- a/brouter-core/src/main/java/btools/router/MessageData.java +++ b/brouter-core/src/main/java/btools/router/MessageData.java @@ -6,6 +6,9 @@ package btools.router; +import java.util.ArrayList; +import java.util.List; + final class MessageData implements Cloneable { int linkdist = 0; int linkelevationcost = 0; @@ -35,12 +38,21 @@ final class MessageData implements Cloneable { int vnode1 = 999; int extraTime = 0; + // user output variables: + int userOutputCount = 0; + List userOutput = new ArrayList<>(); + String toMessage() { if (wayKeyValues == null) { return null; } int iCost = (int) (costfactor * 1000 + 0.5f); + String userOutputBlock=""; + for (int i=0; i userOutputNames=new ArrayList<>(); + private float[] currentVars; private int currentVarOffset; @@ -82,6 +86,17 @@ public abstract class BExpressionContext implements IByteArrayUnifier { public int[] noStartWays = new int[0]; + public int getUserOutputCount() { + return nUserOutputVars; + } + public String getUserOutputHeader() { + String header=""; + for (int i=0; i key lastAssignedExpression = null; // determine the build-in variable indices - String[] varNames = getBuildInVariableNames(); - nBuildInVars = varNames.length; + List varNames = new ArrayList<>(Arrays.asList(getBuildInVariableNames())); + nBuildInVars = varNames.size(); + // find all userOutput variables and insert them to buildInVariables: + final String userOutputKeyword="userOutput"; + for (String key : variableNumbers.keySet()) { + if (key.startsWith(userOutputKeyword)) { + varNames.add(key); + nBuildInVars++; + userOutputNames.add(key.substring(userOutputKeyword.length())); + nUserOutputVars++; + } + } + buildInVariableIdx = new int[nBuildInVars]; - for (int vi = 0; vi < varNames.length; vi++) { - buildInVariableIdx[vi] = getVariableIdx(varNames[vi], false); + for (int vi = 0; vi < varNames.size(); vi++) { + buildInVariableIdx[vi] = getVariableIdx(varNames.get(vi), false); } float[] readOnlyData = variableData; diff --git a/brouter-expressions/src/main/java/btools/expressions/BExpressionContextWay.java b/brouter-expressions/src/main/java/btools/expressions/BExpressionContextWay.java index 9726706d2..80a70fa9a 100644 --- a/brouter-expressions/src/main/java/btools/expressions/BExpressionContextWay.java +++ b/brouter-expressions/src/main/java/btools/expressions/BExpressionContextWay.java @@ -98,6 +98,12 @@ public float getDownhillmaxslopecost() { return getBuildInVariable(19); } + public float getUserOutput(int idx) { + return getBuildInVariable(20+idx); + } + + + public BExpressionContextWay(BExpressionMetaData meta) { super("way", meta); } diff --git a/docs/developers/profile_developers_guide.md b/docs/developers/profile_developers_guide.md index b1012c0a9..c5188f74f 100644 --- a/docs/developers/profile_developers_guide.md +++ b/docs/developers/profile_developers_guide.md @@ -420,6 +420,14 @@ calculations per way-section in the *Data*-tab. For profile debugging activate `assign processUnusedTags = true` to see all present OSM tags on the Data tab, not just those used in the tested profile. +It can be useful to create user variables, beginning with the keyword +"userOutput", which are shown in the data table of brouter-web, e.g. + +assign userOutputTraffic trafficcost +assign userOutputSurface surfacecost + +adds two columns "Traffic" and "Surface" with the respective values +for each sector between the "node$"- and "initial$"-column. Lookup-Table evolution and the the *major* and *minor* versions ---------------------------------------------------------------