From 16a5ebe7373d0ca1b3acfd4e69a3112ecebb8129 Mon Sep 17 00:00:00 2001 From: afischerdev Date: Sun, 26 Feb 2023 12:36:56 +0100 Subject: [PATCH 1/7] add direction on matching wpts --- .../btools/mapaccess/WaypointMatcherImpl.java | 97 +++++++++++++++++-- .../java/btools/util/CheapAngleMeter.java | 26 +++++ 2 files changed, 117 insertions(+), 6 deletions(-) diff --git a/brouter-mapaccess/src/main/java/btools/mapaccess/WaypointMatcherImpl.java b/brouter-mapaccess/src/main/java/btools/mapaccess/WaypointMatcherImpl.java index 1e917f8..85ab9b5 100644 --- a/brouter-mapaccess/src/main/java/btools/mapaccess/WaypointMatcherImpl.java +++ b/brouter-mapaccess/src/main/java/btools/mapaccess/WaypointMatcherImpl.java @@ -1,9 +1,12 @@ package btools.mapaccess; import java.util.List; +import java.util.Collections; +import java.util.Comparator; import btools.codec.WaypointMatcher; import btools.util.CheapRuler; +import btools.util.CheapAngleMeter; /** * the WaypointMatcher is feeded by the decoder with geoemtries of ways that are @@ -13,6 +16,8 @@ import btools.util.CheapRuler; * match for each waypoint */ public final class WaypointMatcherImpl implements WaypointMatcher { + private static final int MAX_POINTS = 5; + private List waypoints; private OsmNodePairSet islandPairs; @@ -24,12 +29,37 @@ public final class WaypointMatcherImpl implements WaypointMatcher { private int lonLast; private int latLast; + private Comparator comparator; + public WaypointMatcherImpl(List waypoints, double maxDistance, OsmNodePairSet islandPairs) { this.waypoints = waypoints; this.islandPairs = islandPairs; + MatchedWaypoint last = null; for (MatchedWaypoint mwp : waypoints) { mwp.radius = maxDistance; + if (last != null && mwp.directionToNext == -1) { + last.directionToNext = CheapAngleMeter.getDirection(last.waypoint.ilon, last.waypoint.ilat, mwp.waypoint.ilon, mwp.waypoint.ilat); + } + last = mwp; } + // last point has no angle so we are looking back + int lastidx = waypoints.size() - 2; + if (lastidx < 0) { + last.directionToNext = -1; + } else { + last.directionToNext = CheapAngleMeter.getDirection(last.waypoint.ilon, last.waypoint.ilat, waypoints.get(lastidx).waypoint.ilon, waypoints.get(lastidx).waypoint.ilat); + } + + // sort result list + comparator = new Comparator() { + @Override + public int compare(MatchedWaypoint mw1, MatchedWaypoint mw2) { + int cmpDist = Double.compare(mw1.radius, mw2.radius); + if (cmpDist != 0) return cmpDist; + return Double.compare(mw1.directionDiff, mw2.directionDiff); + } + }; + } private void checkSegment(int lon1, int lat1, int lon2, int lat2) { @@ -46,8 +76,8 @@ public final class WaypointMatcherImpl implements WaypointMatcher { if (d == 0.) return; - int len = waypoints.size(); - for (int i = 0; i < len; i++) { + //for ( MatchedWaypoint mwp : waypoints ) + for (int i = 0; i < waypoints.size(); i++) { MatchedWaypoint mwp = waypoints.get(i); if (mwp.direct && @@ -65,7 +95,6 @@ public final class WaypointMatcherImpl implements WaypointMatcher { } OsmNode wp = mwp.waypoint; - double x1 = (lon1 - wp.ilon) * dlon2m; double y1 = (lat1 - wp.ilat) * dlat2m; double x2 = (lon2 - wp.ilon) * dlon2m; @@ -74,7 +103,7 @@ public final class WaypointMatcherImpl implements WaypointMatcher { double r22 = x2 * x2 + y2 * y2; double radius = Math.abs(r12 < r22 ? y1 * dx - x1 * dy : y2 * dx - x2 * dy) / d; - if (radius < mwp.radius) { + if (radius <= mwp.radius) { double s1 = x1 * dx + y1 * dy; double s2 = x2 * dx + y2 * dy; @@ -141,11 +170,67 @@ public final class WaypointMatcherImpl implements WaypointMatcher { if (anyUpdate) { for (MatchedWaypoint mwp : waypoints) { if (mwp.hasUpdate) { + double angle = CheapAngleMeter.getDirection(lonStart, latStart, lonTarget, latTarget); + double diff = CheapAngleMeter.getDifferenceFromDirection(mwp.directionToNext, angle); + mwp.hasUpdate = false; - mwp.node1 = new OsmNode(lonStart, latStart); - mwp.node2 = new OsmNode(lonTarget, latTarget); + + MatchedWaypoint mw = new MatchedWaypoint(); + mw.waypoint = new OsmNode(); + mw.waypoint.ilon = mwp.waypoint.ilon; + mw.waypoint.ilat = mwp.waypoint.ilat; + mw.crosspoint = new OsmNode(); + mw.crosspoint.ilon = mwp.crosspoint.ilon; + mw.crosspoint.ilat = mwp.crosspoint.ilat; + mw.node1 = new OsmNode(lonStart, latStart); + mw.node2 = new OsmNode(lonTarget, latTarget); + mw.name = mwp.name + "_w_" + mwp.crosspoint.hashCode(); + mw.radius = mwp.radius; + mw.directionDiff = diff; + mw.directionToNext = mwp.directionToNext; + + updateWayList(mwp.wayNearest, mw); + + // revers + angle = CheapAngleMeter.getDirection(lonTarget, latTarget, lonStart, latStart); + diff = CheapAngleMeter.getDifferenceFromDirection(mwp.directionToNext, angle); + mw = new MatchedWaypoint(); + mw.waypoint = new OsmNode(); + mw.waypoint.ilon = mwp.waypoint.ilon; + mw.waypoint.ilat = mwp.waypoint.ilat; + mw.crosspoint = new OsmNode(); + mw.crosspoint.ilon = mwp.crosspoint.ilon; + mw.crosspoint.ilat = mwp.crosspoint.ilat; + mw.node1 = new OsmNode(lonTarget, latTarget); + mw.node2 = new OsmNode(lonStart, latStart); + mw.name = mwp.name + "_w2_" + mwp.crosspoint.hashCode(); + mw.radius = mwp.radius; + mw.directionDiff = diff; + mw.directionToNext = mwp.directionToNext; + + updateWayList(mwp.wayNearest, mw); + + MatchedWaypoint way = mwp.wayNearest.get(0); + mwp.crosspoint.ilon = way.crosspoint.ilon; + mwp.crosspoint.ilat = way.crosspoint.ilat; + mwp.node1 = new OsmNode(way.node1.ilon, way.node1.ilat); + mwp.node2 = new OsmNode(way.node2.ilon, way.node2.ilat); + mwp.directionDiff = way.directionDiff; + mwp.radius = way.radius; + } } } } + + // check limit of list size (avoid long runs) + void updateWayList(List ways, MatchedWaypoint mw) { + ways.add(mw); + // use only shortest distances by smallest direction difference + Collections.sort(ways, comparator); + if (ways.size() > MAX_POINTS) ways.remove(MAX_POINTS); + + } + + } diff --git a/brouter-util/src/main/java/btools/util/CheapAngleMeter.java b/brouter-util/src/main/java/btools/util/CheapAngleMeter.java index 88a4668..36b6c33 100644 --- a/brouter-util/src/main/java/btools/util/CheapAngleMeter.java +++ b/brouter-util/src/main/java/btools/util/CheapAngleMeter.java @@ -46,4 +46,30 @@ public final class CheapAngleMeter { } return offset + sinp * (57.4539 + s2 * (9.57565 + s2 * (4.30904 + s2 * 2.56491))); } + + public static double getAngle(int lon1, int lat1, int lon2, int lat2) { + double res = 0; + double xdiff = lat2 - lat1; + double ydiff = lon2 - lon1; + res = Math.toDegrees(Math.atan2(ydiff, xdiff)); + return res; + } + + public static double getDirection(int lon1, int lat1, int lon2, int lat2) { + double res = getAngle(lon1, lat1, lon2, lat2); + return normalize(res); + } + + public static double normalize(double a) { + return a >= 360 ? a - (360 * (int) (a / 360)) + : a < 0 ? a - (360 * ((int) (a / 360) - 1)) : a; + } + + public static double getDifferenceFromDirection(double b1, double b2) { + double r = (b2 - b1) % 360.0; + if (r < -180.0) r += 360.0; + if (r >= 180.0) r -= 360.0; + return Math.abs(r); + } + } From 7edc35009f9aa028efa6b4bd6b18473098f22d53 Mon Sep 17 00:00:00 2001 From: afischerdev Date: Sun, 26 Feb 2023 12:37:24 +0100 Subject: [PATCH 2/7] add direction tests --- .../java/btools/util/CheapAngleMeterTest.java | 145 ++++++++++++++++++ 1 file changed, 145 insertions(+) diff --git a/brouter-util/src/test/java/btools/util/CheapAngleMeterTest.java b/brouter-util/src/test/java/btools/util/CheapAngleMeterTest.java index 935e430..57961af 100644 --- a/brouter-util/src/test/java/btools/util/CheapAngleMeterTest.java +++ b/brouter-util/src/test/java/btools/util/CheapAngleMeterTest.java @@ -109,4 +109,149 @@ public class CheapAngleMeterTest { } } + @Test + public void testGetAngle() { + CheapAngleMeter am = new CheapAngleMeter(); + int lon1, lat1, lon2, lat2; + + lon1 = toOsmLon(10.0); + lat1 = toOsmLat(50.0); + lon2 = toOsmLon(10.0); + lat2 = toOsmLat(60.0); + + double angle = am.getAngle(lon1, lat1, lon2, lat2); + assertEquals("Angle = " + angle, 0.0, angle, 0.0); + + lon2 = toOsmLon(10.0); + lat2 = toOsmLat(40.0); + angle = am.getAngle(lon1, lat1, lon2, lat2); + assertEquals("Angle = " + angle, 180.0, angle, 0.0); + + lon2 = toOsmLon(0.0); + lat2 = toOsmLat(50.0); + angle = am.getAngle(lon1, lat1, lon2, lat2); + assertEquals("Angle = " + angle, -90.0, angle, 0.0); + + lon2 = toOsmLon(20.0); + lat2 = toOsmLat(50.0); + angle = am.getAngle(lon1, lat1, lon2, lat2); + assertEquals("Angle = " + angle, 90.0, angle, 0.0); + + lon2 = toOsmLon(20.0); + lat2 = toOsmLat(60.0); + angle = am.getAngle(lon1, lat1, lon2, lat2); + assertEquals("Angle = " + angle, 45.0, angle, 0.0); + + lon2 = toOsmLon(0.0); + lat2 = toOsmLat(60.0); + angle = am.getAngle(lon1, lat1, lon2, lat2); + assertEquals("Angle = " + angle, -45.0, angle, 0.0); + + lon1 = 1; + lat1 = 1; + lon2 = 2; + lat2 = 2; + angle = am.getAngle(lon1, lat1, lon2, lat2); + assertEquals("Angle = " + angle, 45.0, angle, 0.0); + + } + + @Test + public void testGetDirection() { + CheapAngleMeter am = new CheapAngleMeter(); + int lon1, lat1, lon2, lat2; + + lon1 = toOsmLon(10.0); + lat1 = toOsmLat(50.0); + lon2 = toOsmLon(10.0); + lat2 = toOsmLat(60.0); + + double angle = am.getDirection(lon1, lat1, lon2, lat2); + assertEquals("Direction = " + angle, 0.0, angle, 0.0); + + lon2 = toOsmLon(10.0); + lat2 = toOsmLat(40.0); + angle = am.getDirection(lon1, lat1, lon2, lat2); + assertEquals("Direction = " + angle, 180.0, angle, 0.0); + + lon2 = toOsmLon(0.0); + lat2 = toOsmLat(50.0); + angle = am.getDirection(lon1, lat1, lon2, lat2); + assertEquals("Direction = " + angle, 270.0, angle, 0.0); + + lon2 = toOsmLon(20.0); + lat2 = toOsmLat(50.0); + angle = am.getDirection(lon1, lat1, lon2, lat2); + assertEquals("Direction = " + angle, 90.0, angle, 0.0); + + lon2 = toOsmLon(20.0); + lat2 = toOsmLat(60.0); + angle = am.getDirection(lon1, lat1, lon2, lat2); + assertEquals("Direction = " + angle, 45.0, angle, 0.0); + + lon2 = toOsmLon(0.0); + lat2 = toOsmLat(60.0); + angle = am.getDirection(lon1, lat1, lon2, lat2); + assertEquals("Direction = " + angle, 315.0, angle, 0.0); + + lon1 = 1; + lat1 = 1; + lon2 = 2; + lat2 = 2; + angle = am.getDirection(lon1, lat1, lon2, lat2); + assertEquals("Direction = " + angle, 45.0, angle, 0.0); + + } + + @Test + public void testNormalize() { + CheapAngleMeter am = new CheapAngleMeter(); + + double n = 1; + assertEquals("Direction normalize = " + n, 1, am.normalize(n), 0.0); + + n = -1; + assertEquals("Direction normalize = " + n, 359, am.normalize(n), 0.0); + + n = 361; + assertEquals("Direction normalize = " + n, 1, am.normalize(n), 0.0); + + n = 0; + assertEquals("Direction normalize = " + n, 0, am.normalize(n), 0.0); + + n = 360; + assertEquals("Direction normalize = " + n, 0, am.normalize(n), 0.0); + + } + + @Test + public void testCalcAngle6() { + CheapAngleMeter am = new CheapAngleMeter(); + + double a1 = 90; + double a2 = 180; + assertEquals("Direction diff " + a1 + " " + a2 + " = ", 90, am.getDifferenceFromDirection(a1, a2), 0.0); + + a1 = 180; + a2 = 90; + assertEquals("Direction diff " + a1 + " " + a2 + " = ", 90, am.getDifferenceFromDirection(a1, a2), 0.0); + + a1 = 5; + a2 = 355; + assertEquals("Direction diff " + a1 + " " + a2 + " = ", 10, am.getDifferenceFromDirection(a1, a2), 0.0); + + a1 = 355; + a2 = 5; + assertEquals("Direction diff " + a1 + " " + a2 + " = ", 10, am.getDifferenceFromDirection(a1, a2), 0.0); + + a1 = 90; + a2 = 270; + assertEquals("Direction diff " + a1 + " " + a2 + " = ", 180, am.getDifferenceFromDirection(a1, a2), 0.0); + + a1 = 270; + a2 = 90; + assertEquals("Direction diff " + a1 + " " + a2 + " = ", 180, am.getDifferenceFromDirection(a1, a2), 0.0); + + } + } From 7434c12b3198dfce53d7050fd3ca2fe380b94630 Mon Sep 17 00:00:00 2001 From: afischerdev Date: Sun, 26 Feb 2023 13:02:39 +0100 Subject: [PATCH 3/7] change output rules --- .../src/main/java/btools/router/OsmTrack.java | 287 +++++++++++++++--- .../java/btools/router/RoutingContext.java | 2 + .../java/btools/router/RoutingEngine.java | 3 + 3 files changed, 254 insertions(+), 38 deletions(-) diff --git a/brouter-core/src/main/java/btools/router/OsmTrack.java b/brouter-core/src/main/java/btools/router/OsmTrack.java index 2896b9d..fd36362 100644 --- a/brouter-core/src/main/java/btools/router/OsmTrack.java +++ b/brouter-core/src/main/java/btools/router/OsmTrack.java @@ -21,9 +21,13 @@ import java.io.InputStreamReader; import java.io.StringWriter; import java.text.DecimalFormat; import java.text.NumberFormat; +import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Date; import java.util.List; import java.util.Locale; +import java.util.Map; +import java.util.TimeZone; import btools.mapaccess.MatchedWaypoint; import btools.mapaccess.OsmPos; @@ -45,6 +49,9 @@ public final class OsmTrack { public boolean showspeed; public boolean showSpeedProfile; + public boolean showTime; + + public Map params; public List pois = new ArrayList(); @@ -414,12 +421,14 @@ public final class OsmTrack { int turnInstructionMode = voiceHints != null ? voiceHints.turnInstructionMode : 0; sb.append("\n"); - for (int i = messageList.size() - 1; i >= 0; i--) { - String message = messageList.get(i); - if (i < messageList.size() - 1) - message = "(alt-index " + i + ": " + message + " )"; - if (message != null) - sb.append("\n"); + if (turnInstructionMode != 9) { + for (int i = messageList.size() - 1; i >= 0; i--) { + String message = messageList.get(i); + if (i < messageList.size() - 1) + message = "(alt-index " + i + ": " + message + " )"; + if (message != null) + sb.append("\n"); + } } if (turnInstructionMode == 4) // comment style @@ -436,8 +445,10 @@ public final class OsmTrack { sb.append("\n"); } - - if (turnInstructionMode == 3) // osmand style + if (turnInstructionMode == 9) { + sb.append(" \n"); + sb.append(" ").append(name).append("\n"); + sb.append(" \n"); + sb.append(" ").append(messageList.get(0)).append("\n"); + if (params != null && params.size() > 0) { + sb.append(" e : params.entrySet()) { + if (i++ != 0) sb.append("&"); + sb.append(e.getKey()).append("=").append(e.getValue()); + } + sb.append("]]>\n"); + } + sb.append(" \n"); + sb.append(" \n"); + } + if (turnInstructionMode == 3 || turnInstructionMode == 8) // osmand style, cruiser { float lastRteTime = 0; sb.append(" \n"); - sb.append(" \n") - .append(" start\n \n"); - float rteTime = getVoiceHintTime(0); - - if (rteTime != lastRteTime) // add timing only if available + StringBuffer first = new StringBuffer(); + // define start point { - double t = rteTime - lastRteTime; - sb.append(" \n"); - lastRteTime = rteTime; + first.append(" \n") + .append(" start\n \n"); + if (rteTime != lastRteTime) // add timing only if available + { + double t = rteTime - lastRteTime; + first.append(" \n"); + lastRteTime = rteTime; + } + first.append(" 0\n \n \n"); + } + if (turnInstructionMode == 8) { + if (matchedWaypoints.get(0).direct && voiceHints.list.get(0).indexInTrack == 0) { + // has a voice hint do nothing, voice hint will do + } else { + sb.append(first.toString()); + } + } else { + sb.append(first.toString()); } - sb.append(" 0\n \n \n"); for (int i = 0; i < voiceHints.list.size(); i++) { VoiceHint hint = voiceHints.list.get(i); sb.append(" \n") - .append(" ").append(hint.getMessageString()).append("\n \n"); + .append(" ") + .append(turnInstructionMode == 3 ? hint.getMessageString() : hint.getCruiserMessageString()) + .append("\n \n"); rteTime = getVoiceHintTime(i + 1); @@ -482,7 +522,9 @@ public final class OsmTrack { sb.append(" \n"); lastRteTime = rteTime; } - sb.append(" ").append(hint.getCommandString()).append("\n ").append("" + (int) hint.angle) + sb.append(" ") + .append(turnInstructionMode == 3 ? hint.getCommandString() : hint.getCruiserCommandString()) + .append("\n ").append("" + (int) hint.angle) .append("\n ").append("" + hint.indexInTrack).append("\n \n \n"); } sb.append(" \n"); } - if (turnInstructionMode == 2) // locus style + if (turnInstructionMode == 7) // old locus style { float lastRteTime = getVoiceHintTime(0); @@ -537,12 +579,12 @@ public final class OsmTrack { .append(formatILon(hint.ilon)).append("\">") .append(hint.selev == Short.MIN_VALUE ? "" : "" + (hint.selev / 4.) + "") .append("\n" + - "\n" + - "").append("" + hint.getOruxAction()) + " \n" + + " ").append("" + hint.getOruxAction()) .append("\n" + - "\n" + - "\n" + - ""); + " \n" + + " \n" + + " \n"); } } @@ -571,13 +613,14 @@ public final class OsmTrack { } } sb.append(" \n"); - sb.append(" ").append(name).append("\n"); - if (turnInstructionMode == 1) // trkpt/sym style - { + if (turnInstructionMode == 9) { // brouter style + sb.append(" ").append(name).append("\n"); sb.append(" ").append(voiceHints.getTransportMode()).append("\n"); + } else { + sb.append(" ").append(name).append("\n"); } - if (turnInstructionMode == 2) { + if (turnInstructionMode == 7) { sb.append(" \n"); sb.append(" ").append("" + voiceHints.getLocusRouteType()).append("\n"); sb.append(" 1\n"); @@ -585,20 +628,168 @@ public final class OsmTrack { } sb.append(" \n"); + String lastway = ""; + boolean bNextDirect = false; + OsmPathElement nn = null; + String aSpeed; for (int idx = 0; idx < nodes.size(); idx++) { OsmPathElement n = nodes.get(idx); String sele = n.getSElev() == Short.MIN_VALUE ? "" : "" + n.getElev() + ""; - if (turnInstructionMode == 1) // trkpt/sym style + VoiceHint hint = getVoiceHint(idx); + MatchedWaypoint mwpt = getMatchedWaypoint(idx); + + if (showTime) { + sele += ""; + } + + boolean bNeedHeader = false; + if (turnInstructionMode == 9 || turnInstructionMode == 2) // trkpt/sym style // locus style new { - for (VoiceHint hint : voiceHints.list) { - if (hint.indexInTrack == idx) { - sele += "" + hint.getCommandString() + ""; + if (hint != null) { + if (turnInstructionMode == 9) { + if (mwpt != null && !mwpt.name.startsWith("via")) { + sele += "" + mwpt.name + ""; + } + sele += "" + hint.getMessageString() + ""; + sele += "" + hint.getCommandString(hint.cmd) + ""; + sele += ""; + if (showspeed) { + double speed = 0; + if (nn != null) { + int dist = n.calcDistance(nn); + float dt = n.getTime() - nn.getTime(); + if (dt != 0.f) { + speed = ((3.6f * dist) / dt + 0.5); + } + } + sele += "" + (((int) (speed * 10)) / 10.f) + ""; + } + + sele += "" + hint.getCommandString() + ";" + (int) (hint.distanceToNext) + "," + hint.formatGeometry() + ""; + if (n.message != null && n.message.wayKeyValues != null && !n.message.wayKeyValues.equals(lastway)) { + sele += "" + n.message.wayKeyValues + ""; + lastway = n.message.wayKeyValues; + } + if (n.message != null && n.message.nodeKeyValues != null) { + sele += "" + n.message.nodeKeyValues + ""; + } + sele += ""; + } else if (turnInstructionMode == 2) { + sele += "" + hint.getLocusSymbolString() + ""; + } + } + if (idx == 0) { + if (turnInstructionMode == 2) { + int pos = sele.indexOf(""; + if (mwpt != null && mwpt.direct) { + bNextDirect = true; + } + sele += "pass_place"; + sele += "Via"; + } else { + if (mwpt != null && mwpt.direct) { + sele += "beeline"; + } else { + sele += "start"; + } + sele += "Via"; + } + } else if (idx == nodes.size() - 1) { + if (turnInstructionMode == 2) { + int pos = sele.indexOf(""; + if (bNextDirect) { + sele += "beeline"; + } + sele += "pass_place"; + sele += "Via"; + } else { + sele += "end"; + sele += "Via"; + } + } else if (turnInstructionMode == 2) { + if (mwpt != null) { + if (sele.contains("sym") && + !sele.contains("name") && + !mwpt.name.startsWith("via")) { + 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) { + sele += "beelinepass_placeShaping"; + bNextDirect = true; + } else if (mwpt.direct) { + sele += "pass_placeShaping"; + bNextDirect = true; + } else if (mwpt.name.startsWith("via")) { + if (bNextDirect) { + sele += "beelinepass_placeShaping"; + } else { + sele += "pass_placeShaping"; + } + bNextDirect = false; + } else { + sele += "" + mwpt.name + ""; + sele += "pass_placeVia"; + } + } + } else if (turnInstructionMode == 9) { + if (mwpt != null && hint == null) { + if (mwpt.direct) { + // bNextDirect = true; + sele += "beeline"; + } else { + sele += "" + mwpt.name + ""; + } + sele += "Via"; + bNextDirect = false; + } + } + + + if (turnInstructionMode == 9 && hint == null) { + bNeedHeader = (showspeed || (n.message != null && n.message.wayKeyValues != null && !n.message.wayKeyValues.equals(lastway))) || + (n.message != null && n.message.nodeKeyValues != null); + if (bNeedHeader) { + sele += ""; + if (showspeed) { + double speed = 0; + if (nn != null) { + int dist = n.calcDistance(nn); + float dt = n.getTime() - nn.getTime(); + if (dt != 0.f) { + speed = ((3.6f * dist) / dt + 0.5); + } + } + sele += "" + (((int) (speed * 10)) / 10.f) + ""; + } + if (n.message != null && n.message.wayKeyValues != null && !n.message.wayKeyValues.equals(lastway)) { + sele += "" + n.message.wayKeyValues + ""; + lastway = n.message.wayKeyValues; + } + if (n.message != null && n.message.nodeKeyValues != null) { + sele += "" + n.message.nodeKeyValues + ""; + } + sele += ""; } } } sb.append(" ").append(sele).append("\n"); + + nn = n; } sb.append(" \n"); @@ -921,6 +1112,18 @@ public final class OsmTrack { return time; } + SimpleDateFormat TIMESTAMP_FORMAT; + + public String getFormattedTime3(float time) { + if (TIMESTAMP_FORMAT == null) { + TIMESTAMP_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US); + TIMESTAMP_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC")); + } + // yyyy-mm-ddThh:mm:ss.SSSZ + Date d = new Date((long) (time * 1000f)); + return TIMESTAMP_FORMAT.format(d); + } + public String getFormattedEnergy() { return format1(energy / 3600000.) + "kwh"; } @@ -1060,6 +1263,14 @@ public final class OsmTrack { input.indexInTrack = --nodeNr; input.goodWay = node.message; input.oldWay = node.origin.message == null ? node.message : node.origin.message; + if (rc.turnInstructionMode == 8) { + MatchedWaypoint mwpt = getMatchedWaypoint(nodeNr); + if (mwpt != null && mwpt.direct) { + input.cmd = VoiceHint.BL; + input.angle = (float) node.message.turnangle; + input.distanceToNext = node.calcDistance(node.origin); + } + } OsmPathElementHolder detours = detourMap.get(node.origin.getIdFromPos()); if (nodeNr >= 0 && detours != null) { OsmPathElementHolder h = detours; @@ -1081,8 +1292,8 @@ public final class OsmTrack { List results = vproc.process(inputs); double minDistance = getMinDistance(); - List < VoiceHint > resultsLast = vproc.postProcess(results, rc.turnInstructionCatchingRange, minDistance); - for (VoiceHint hint: resultsLast) { + List resultsLast = vproc.postProcess(results, rc.turnInstructionCatchingRange, minDistance); + for (VoiceHint hint : resultsLast) { voiceHints.list.add(hint); } diff --git a/brouter-core/src/main/java/btools/router/RoutingContext.java b/brouter-core/src/main/java/btools/router/RoutingContext.java index 8af9c9f..99d564b 100644 --- a/brouter-core/src/main/java/btools/router/RoutingContext.java +++ b/brouter-core/src/main/java/btools/router/RoutingContext.java @@ -171,6 +171,7 @@ public final class RoutingContext { showspeed = 0.f != expctxGlobal.getVariableValue("showspeed", 0.f); showSpeedProfile = 0.f != expctxGlobal.getVariableValue("showSpeedProfile", 0.f); inverseRouting = 0.f != expctxGlobal.getVariableValue("inverseRouting", 0.f); + showTime = 0.f != expctxGlobal.getVariableValue("showtime", 0.f); int tiMode = (int) expctxGlobal.getVariableValue("turnInstructionMode", 0.f); if (tiMode != 1) // automatic selection from coordinate source @@ -233,6 +234,7 @@ public final class RoutingContext { public boolean showspeed; public boolean showSpeedProfile; public boolean inverseRouting; + public boolean showTime; public OsmPrePath firstPrePath; diff --git a/brouter-core/src/main/java/btools/router/RoutingEngine.java b/brouter-core/src/main/java/btools/router/RoutingEngine.java index b5a2d89..7ddc011 100644 --- a/brouter-core/src/main/java/btools/router/RoutingEngine.java +++ b/brouter-core/src/main/java/btools/router/RoutingEngine.java @@ -511,6 +511,9 @@ public class RoutingEngine extends Thread { totaltrack.processVoiceHints(routingContext); totaltrack.prepareSpeedProfile(routingContext); + totaltrack.showTime = routingContext.showTime; + totaltrack.params = routingContext.keyValues; + if (routingContext.poipoints != null) totaltrack.pois = routingContext.poipoints; totaltrack.matchedWaypoints = matchedWaypoints; From d85905035c9a3bc5bc79a0e44c2d75102077ffad Mon Sep 17 00:00:00 2001 From: afischerdev Date: Sun, 26 Feb 2023 13:04:43 +0100 Subject: [PATCH 4/7] change affected files for output rules --- .../btools/routingapp/IBRouterService.aidl | 4 +- docs/developers/profile_developers_guide.md | 2 +- misc/profiles2/car-vario.brf | 2 +- misc/profiles2/fastbike-verylowtraffic.brf | 104 +- misc/profiles2/fastbike.brf | 2 +- misc/profiles2/hiking-mountain.brf | 186 ++-- misc/profiles2/moped.brf | 2 +- misc/profiles2/shortest.brf | 2 +- misc/profiles2/trekking.brf | 2 +- misc/profiles2/vm-forum-liegerad-schnell.brf | 920 +++++++++--------- misc/profiles2/vm-forum-velomobil-schnell.brf | 920 +++++++++--------- 11 files changed, 1073 insertions(+), 1073 deletions(-) diff --git a/brouter-routing-app/src/main/aidl/btools/routingapp/IBRouterService.aidl b/brouter-routing-app/src/main/aidl/btools/routingapp/IBRouterService.aidl index 9c4039a..1b15baf 100644 --- a/brouter-routing-app/src/main/aidl/btools/routingapp/IBRouterService.aidl +++ b/brouter-routing-app/src/main/aidl/btools/routingapp/IBRouterService.aidl @@ -26,12 +26,12 @@ interface IBRouterService { // "nogos" = lon,lat,radius|... (optional, radius in meters) // "polylines" = lon,lat,lon,lat,...,weight|... (unlimited list of lon,lat and weight (optional), lists separated by |) // "polygons" = lon,lat,lon,lat,...,weight|... (unlimited list of lon,lat and weight (optional), lists separated by |) - // "profile" = profile file name without .brf + // "profile" = profile file name without .brf // "alternativeidx" = [0|1|2|3] (optional, default 0) // "exportWaypoints" = 1 to export them (optional, default is no export) // "pois" = lon,lat,name|... (optional) // "extraParams" = Bundle key=value list for a profile setup (like "profile:") - // "timode" = turnInstructionMode [0=none, 1=auto-choose, 2=locus-style, 3=osmand-style, 4=comment-style, 5=gpsies-style, 6=orux-style, 7=locus-new-style, 8=cruiser-stylem, 9=brouter-intern] default 0 + // "timode" = turnInstructionMode [0=none, 1=auto-choose, 2=locus-style, 3=osmand-style, 4=comment-style, 5=gpsies-style, 6=orux-style, 7=locus-old-style] default 0 // "heading" = angle (optional to give a route a start direction) // "direction" = angle (optional, used like "heading" on a recalculation request by Locus as start direction) diff --git a/docs/developers/profile_developers_guide.md b/docs/developers/profile_developers_guide.md index 666620e..200732c 100644 --- a/docs/developers/profile_developers_guide.md +++ b/docs/developers/profile_developers_guide.md @@ -97,7 +97,7 @@ Some variable names are pre-defined and accessed by the routing engine: - 3 variables to influence the generation of turn-instructions - `turnInstructionMode` 0=none, 1=auto-choose, 2=locus-style, - 3=osmand-style + 3=osmand-style, 4=comment-style, 5=gpsies-style, 6=orux-style, 7=locus-old-style - `turnInstructionCatchingRange` default=40m - `turnInstructionRoundabouts` default=true generate explicit roundabout hints diff --git a/misc/profiles2/car-vario.brf b/misc/profiles2/car-vario.brf index ce88b8c..34e5be1 100644 --- a/misc/profiles2/car-vario.brf +++ b/misc/profiles2/car-vario.brf @@ -27,7 +27,7 @@ assign f_recup = 400 # %f_recup% | Newton | number assign p_standby = 250 # %p_standby% | Watt | number # Turn instructions settings -assign turnInstructionMode = 1 # %turnInstructionMode% | Mode for the generated turn instructions | [0=none, 1=auto-choose, 2=locus-style, 3=osmand-style, 4=comment-style, 5=gpsies-style, 6=orux-style] +assign turnInstructionMode = 1 # %turnInstructionMode% | Mode for the generated turn instructions | [0=none, 1=auto-choose, 2=locus-style, 3=osmand-style, 4=comment-style, 5=gpsies-style, 6=orux-style, 7=locus-old-style] # Technical parameters assign pass1coefficient = 1.3 diff --git a/misc/profiles2/fastbike-verylowtraffic.brf b/misc/profiles2/fastbike-verylowtraffic.brf index 3fb7f0d..997b57e 100644 --- a/misc/profiles2/fastbike-verylowtraffic.brf +++ b/misc/profiles2/fastbike-verylowtraffic.brf @@ -1,8 +1,8 @@ -# "fastbike-verylowtraffic.brf" -- Version 23.08.2021 +# "fastbike-verylowtraffic.brf" -- Version 23.08.2021 # This profile, developed by Ess Bee, is based on the "fastbike-lowtraffic" profile # it is intended for road cyclists who ride alone and / or in the middle of the week: thus trucks and high traffic are avoided # (cyclists in group at the weekend will rather use "fastbike.brf" or "fastbike-lowprofile.brf" as groups are better respected by cars and trucks) -# +# # ==> where ever possible, choose: # - an asphalted way (with good smoothness) # - cycleways are prefered @@ -11,13 +11,13 @@ # - avoid segments with high-traffic # # The route is calculated using the taggs of the OSM map (such as highway, surface, smoothness, maxspeed, traffic_class...) -# - ----context:global # following code refers to global config -assign processUnusedTags false # set to true if you want to display all tags in the "data" +# -# to generate turn instructions, adapt the mode by need -assign turnInstructionMode = 1 # %turnInstructionMode% | Mode for the generated turn instructions | [0=none, 1=auto-choose, 2=locus-style, 3=osmand-style] +---context:global # following code refers to global config +assign processUnusedTags false # set to true if you want to display all tags in the "data" + +# to generate turn instructions, adapt the mode by need +assign turnInstructionMode = 1 # %turnInstructionMode% | Mode for the generated turn instructions | [0=none, 1=auto-choose, 2=locus-style, 3=osmand-style, 4=comment-style, 5=gpsies-style, 6=orux-style, 7=locus-old-style] # Use the following switches to change behaviour @@ -25,11 +25,11 @@ assign consider_elevation = false # %consider_elevation% | set to true to assign avoid_path = false # %avoid_path% | set to true to avoid pathes | boolean assign consider_traffic = 1 # %consider_traffic% | 0 => no cost for "traffic_class" or "maxspeed", 1 => costs are considered!: value example 0.3 | number -assign cycleway_lane_penalty = 0 # 0 => when lane, no cost for traffic or max speed, 1 => same cost as on the highway itself: example 0.3 +assign cycleway_lane_penalty = 0 # 0 => when lane, no cost for traffic or max speed, 1 => same cost as on the highway itself: example 0.3 assign turnInstructionCatchingRange = 8 # 2 turn instructions are generated only when distance > 8 m assign turnInstructionRoundabouts = false # roundabout, no "take exit N" (as "N" may be confusing compared to car) -assign considerTurnRestrictions = true # turn restrictions are considered +assign considerTurnRestrictions = true # turn restrictions are considered assign validForBikes 1 @@ -42,7 +42,7 @@ assign validForBikes 1 assign downhillcost 60 assign downhillcutoff switch consider_elevation 1.5 15 -assign uphillcost 100 +assign uphillcost 100 assign uphillcutoff switch consider_elevation 1.5 15 @@ -57,19 +57,19 @@ assign cycleway_right if reversedirection=yes then if cycleway:left=track|lane|shared_lane then 1 else 0 else if cycleway:right=track|lane|shared_lane then 1 else 0 -assign any_cycleway or cycleway=track|lane|shared_lane|shared cycleway_right -# as soon it is supported in lookup, add ==> bicycle_road=yes in any_cycleway +assign any_cycleway or cycleway=track|lane|shared_lane|shared cycleway_right +# as soon it is supported in lookup, add ==> bicycle_road=yes in any_cycleway -# in relation with "route=bicycle" ? +# in relation with "route=bicycle" ? assign any_cycleroute or route_bicycle_icn=yes or route_bicycle_ncn=yes or route_bicycle_rcn=yes route_bicycle_lcn=yes assign nodeaccessgranted or any_cycleroute lcn=yes assign ispaved or surface=paved surface=asphalt -assign isunpaved surface=unpaved|gravel|dirt|earth|ground|sand +assign isunpaved surface=unpaved|gravel|dirt|earth|ground|sand -assign isfine_gravel surface=fine_gravel|cobblestone|compacted|paving_stones -assign isconcrete surface=concrete +assign isfine_gravel surface=fine_gravel|cobblestone|compacted|paving_stones +assign isconcrete surface=concrete assign turncost = if junction=roundabout then 0 else 10 @@ -148,35 +148,35 @@ assign onewaypenalty = else 0.0 assign surfacepenalty = -# if "surface" is not defined... - switch surface= +# if "surface" is not defined... + switch surface= # then, for Primary, secondary and tertiary asphalt is very probable switch highway=primary|primary_link|secondary|secondary_link|tertiary|tertiary_link 0 -# then, for residential & Co. probably asphalt.. - switch highway=road|residential|unclassified 0.1 +# then, for residential & Co. probably asphalt.. + switch highway=road|residential|unclassified 0.1 # then, for living_street something paved .. switch highway=living_street 0.3 # then, for "service & cycleway" possibly good (but not sure!) ... - switch highway=service|cycleway 0.5 + switch highway=service|cycleway 0.5 # in some cases only smoothness is tagged but surface not! switch smoothness=intermediate|good|excellent 0 -# else, check if tracktype=grade1, then it is "something" paved, so middle penalty +# else, check if tracktype=grade1, then it is "something" paved, so middle penalty switch tracktype=grade1 0.2 -# if a cycleroute is defined, surface can not be horrible... +# if a cycleroute is defined, surface can not be horrible... switch any_cycleroute 3.5 5 switch surface=asphalt 0 switch surface=paved switch smoothness=good|excellent 0.1 0.3 # befestigte(harte)Oberfl sche switch surface=gravel|sand|pebblestone|unpaved 10 # Schotter, Sand, Kies, unbefestigt switch surface=ground|grass|dirt|earth|mud|clay 25 # naturbelassene Oberfl sche, Gras, Schutz Schlamm... - switch surface=fine_gravel|compacted switch smoothness=good|excellent 1 4 # Splitt,verdichtete Oberflaesche + switch surface=fine_gravel|compacted switch smoothness=good|excellent 1 4 # Splitt,verdichtete Oberflaesche switch surface=sett switch smoothness=good|excellent 0.1 0.3 # behauene Pflastersteine switch concrete=plates 1 # Betonplattenwege switch surface=concrete|paving_stones|wood|metal 0.8 # Beton, Pflastersteine (geschnitzt), Holz, Metall switch surface=cobblestone|sett switch smoothness=good|excellent 1 2 # Kopfsteinpflaster # switch surface=unhewn_cobblestone 3 # ungeschnitzter Pflasterstein switch concrete=lanes 3 # Betonspurplatten - switch surface=grass_paver 5 # Rasengittersteine - + switch surface=grass_paver 5 # Rasengittersteine + # surface not known and probably not paved / no asphalt... 8 @@ -189,7 +189,7 @@ assign tracktypepenalty assign trafficpenalty = -# if any_cycleway then 0 +# if any_cycleway then 0 # else if highway=primary|primary_link then ( @@ -229,12 +229,12 @@ assign smoothnesspenalty = assign maxspeedpenalty = switch or highway=primary highway=primary_link # as soon "name" is supported in lookup, replace with "switch maxspeed= switch name= 2.2 1 - switch maxspeed=50 multiply 0.2 consider_traffic + switch maxspeed=50 multiply 0.2 consider_traffic # switch any_cycleway multiply 0.2 consider_traffic switch maxspeed=60 multiply 0.7 consider_traffic switch maxspeed=70 multiply 1.2 consider_traffic - switch maxspeed=80 multiply 1.5 consider_traffic - switch maxspeed=90 multiply 2.0 consider_traffic + switch maxspeed=80 multiply 1.5 consider_traffic + switch maxspeed=90 multiply 2.0 consider_traffic switch maxspeed=100 multiply 3.0 consider_traffic switch maxspeed=110 multiply 11 consider_traffic switch maxspeed=120 multiply 12 consider_traffic @@ -275,36 +275,36 @@ assign usesidepathpenalty = # give a light advantage to highways with a relation cycleroute assign nocycleroute_penalty switch any_cycleroute 0 0.05 -assign not_bicycle_designatedpenalty switch bicycle=designated 0 0.1 +assign not_bicycle_designatedpenalty switch bicycle=designated 0 0.1 assign sum_highwaypenalty add surfacepenalty add tracktypepenalty add trafficpenalty - add smoothnesspenalty + add smoothnesspenalty add maxspeedpenalty add usesidepathpenalty add nocycleroute_penalty not_bicycle_designatedpenalty - + # penalties differ when a cycleway is associated to the highway with "cycleway=yes" -assign cycleway_surfacepenalty - switch any_cycleway - switch cycleway:surface= surfacepenalty # if not specified, same as highway +assign cycleway_surfacepenalty + switch any_cycleway + switch cycleway:surface= surfacepenalty # if not specified, same as highway switch cycleway:surface=asphalt 0 switch cycleway:surface=sett 0.3 # behauene Pflastersteine switch cycleway:surface=paved 0.3 # befestigte(harte)Oberflaesche switch cycleway:surface=concrete|paving_stones 0.8 # Beton, Pflastersteine (geschnitzt) switch cycleway:surface=cobblestone|sett 2 # Kopfsteinpflaster - switch cycleway:surface=fine_gravel|compacted 4 # Splitt,verdichtete Oberflaesche + switch cycleway:surface=fine_gravel|compacted 4 # Splitt,verdichtete Oberflaesche switch cycleway:surface=gravel 10 # Schotter 0 # unknown value... 1000 # noc cycleway -# to be activated after implementation of #241 +# to be activated after implementation of #241 #assign cycleway_smoothnesspenalty -# switch cycleway:smoothness= smoothnesspenalty # if not specified, same as highway +# switch cycleway:smoothness= smoothnesspenalty # if not specified, same as highway # switch cycleway:smoothness=intermediate 0.3 # switch cycleway:smoothness=bad 1 # switch cycleway:smoothness=very_bad 2 @@ -312,17 +312,17 @@ assign cycleway_surfacepenalty # 0 # temporary... -assign cycleway_smoothnesspenalty smoothnesspenalty # temporray same as highway +assign cycleway_smoothnesspenalty smoothnesspenalty # temporray same as highway assign sum_cyclewaypenalty switch any_cycleway # cycleway exists - add multiply maxspeedpenalty cycleway_lane_penalty - add multiply trafficpenalty cycleway_lane_penalty + add multiply maxspeedpenalty cycleway_lane_penalty + add multiply trafficpenalty cycleway_lane_penalty add cycleway_surfacepenalty - add cycleway_smoothnesspenalty + add cycleway_smoothnesspenalty usesidepathpenalty # add nocycleroute_penalty -# add not_bicycle_designatedpenalty +# add not_bicycle_designatedpenalty 10000 # no cycleway assign costfactor @@ -345,7 +345,7 @@ assign costfactor switch highway=residential switch bicycle_road=yes 1 1.4 switch highway=service switch ( or service= service=alley ) 1.1 11 switch highway=track|road 0.9 - switch highway=path switch avoid_path 2 1 + switch highway=path switch avoid_path 2 1 switch highway=footway switch bicycle=yes 1.7 4.7 19.9 @@ -368,7 +368,7 @@ assign priorityclassifier = else if ( highway=service ) then 8 else if ( highway=cycleway ) then 8 else if ( bicycle=designated ) then 8 - else if ( highway=track|road|path ) + else if ( highway=track|road|path ) then if or surface=asphalt|paved|paving_stones|concrete|wood|metal tracktype=grade1 then 8 else 6 else if ( highway=steps ) then 2 else if ( highway=pedestrian ) then 2 @@ -388,7 +388,7 @@ assign isgoodforcars = if greater priorityclassifier 6 then true # ... encoded into a bitmask -assign classifiermask +assign classifiermask # add isbadoneway # no voice hint if 1 of the 2 possibilities is badoneway add multiply isgoodoneway 2 add multiply isroundabout 4 @@ -426,12 +426,12 @@ assign footaccess 1 assign railwaypenalty switch railway= 0 155 -# assign signalpenalty switch highway=traffic_signals 99 +# assign signalpenalty switch highway=traffic_signals 99 # switch crossing=traffic_signals 49 0 # note: in case of a "left-turn" at the traffic-signal the penalty is counted twice... -assign barrierpenalty switch barrier= 0 - switch barrier=block|bollard 59 139 +assign barrierpenalty switch barrier= 0 + switch barrier=block|bollard 59 139 assign initialcost add railwaypenalty @@ -441,4 +441,4 @@ assign initialcost 0 switch footaccess 300 - 1000000 \ No newline at end of file + 1000000 diff --git a/misc/profiles2/fastbike.brf b/misc/profiles2/fastbike.brf index 8c7472e..f545094 100644 --- a/misc/profiles2/fastbike.brf +++ b/misc/profiles2/fastbike.brf @@ -47,7 +47,7 @@ assign C_r = 0.01 # %C_r% | Rolling resistance coefficient (dimensionle assign bikerPower = 100 # %bikerPower% | Average power (in W) provided by the biker, for travel time computation | number # Turn instructions settings -assign turnInstructionMode = 1 # %turnInstructionMode% | Mode for the generated turn instructions | [0=none, 1=auto-choose, 2=locus-style, 3=osmand-style, 4=comment-style, 5=gpsies-style, 6=orux-style] +assign turnInstructionMode = 1 # %turnInstructionMode% | Mode for the generated turn instructions | [0=none, 1=auto-choose, 2=locus-style, 3=osmand-style, 4=comment-style, 5=gpsies-style, 6=orux-style, 7=locus-old-style] assign turnInstructionCatchingRange = 40 # %turnInstructionCatchingRange% | Within this distance (in m) several turning instructions are combined into one and the turning angles are better approximated to the general direction | number assign turnInstructionRoundabouts = true # %turnInstructionRoundabouts% | Set to "false" to avoid generating special turning instructions for roundabouts | boolean diff --git a/misc/profiles2/hiking-mountain.brf b/misc/profiles2/hiking-mountain.brf index 9af93c6..01d3584 100644 --- a/misc/profiles2/hiking-mountain.brf +++ b/misc/profiles2/hiking-mountain.brf @@ -1,7 +1,7 @@ # Walking-Hiking-Mountain/Alpine Hiking profile TEMPLATE # 18/5/2016 v1.8.7 ! Fixed down/uphillcostfactors for shortest_way - to be really shortest # -# SAC T3 - demanding_mountain_hiking - exposed sites may be secured, possible need of hands for balance, Partly exposed with fall hazard, Well sure-footed, Good hiking shoes, Basic alpine experience +# SAC T3 - demanding_mountain_hiking - exposed sites may be secured, possible need of hands for balance, Partly exposed with fall hazard, Well sure-footed, Good hiking shoes, Basic alpine experience # # Legend above is placeholder for generated comments of final profile # See the profile bottom for changelogs and verbose *) comments @@ -13,7 +13,7 @@ assign consider_elevation 1 # 0 as default, otherwise less interesting flat roads are chosen. assign shortest_way 0 # 0 as default, duplicate shortest standard profile, SAC access limit ignored for now -assign turnInstructionMode = 1 # 0=none, 1=auto-choose, 2=locus-style, 3=osmand-style +assign turnInstructionMode = 1 # %turnInstructionMode% | Mode for the generated turn instructions | [0=none, 1=auto-choose, 2=locus-style, 3=osmand-style, 4=comment-style, 5=gpsies-style, 6=orux-style, 7=locus-old-style] assign turnInstructionCatchingRange 20 # V1.8.5 / default=40, but foot paths may be more distingushed, especially in cities. assign iswet 0 # 0 as default, 1 tries to prevent muddy boots and wet buttocks @@ -28,10 +28,10 @@ assign path_preference 0.0 # 0.0 as default, try 20.0 to penalize non assign SAC_scale_limit 3 # 0..6, 0 to avoid any SAC paths, 1 for T1 as maximum, 6 for T6 as maximum # all paths with sac_scale higher than SAC_scale_limit are forbidden. assign SAC_scale_preferred 1 # The same, but the preferred SAC scale level. Level below are slightly, above strongly penalized -assign SAC_access_penalty 9000 # costfactor 9999 means the most horrible but allowed road., +assign SAC_access_penalty 9000 # costfactor 9999 means the most horrible but allowed road., # 100000=forbidden. This makes difference if forbidden way is the only option. -assign SAC_K1 0.05 # Penalizing of SAC levels below preferred -assign SAC_K2 0.6 # Penalizing of SAC levels above preferred +assign SAC_K1 0.05 # Penalizing of SAC levels below preferred +assign SAC_K2 0.6 # Penalizing of SAC levels above preferred #orientation/decision penalties, not used for preferred hiking routes assign turncost_value 0 # not used now @@ -58,14 +58,14 @@ assign Offroad_hillcostfactor multiply -0.3333 ( max -3.0 ( multiply -1.0 ( # progressively decreases hillcosts to be 0.0 at Offroad_factor = 3.0 # if Offroad_factor = 1 , then downhillcost decreases e.g. from 60 to 40 -assign downhillcost if consider_elevation then +assign downhillcost if consider_elevation then ( multiply ( add 1.0 ( multiply Offroad_hillcostfactor -1.0 ) ) downhillcostvalue ) else 0 assign uphillcost if consider_elevation then ( multiply ( add 1.0 ( multiply Offroad_hillcostfactor -1.0 ) ) uphillcostvalue ) else 0 assign uphillcutoff if consider_elevation then uphillcutoffvalue else 1.5 -assign downhillcutoff if consider_elevation then downhillcutoffvalue else 1.5 +assign downhillcutoff if consider_elevation then downhillcutoffvalue else 1.5 assign nonhiking_route_penalty add 1.0 max 0.0 hiking_routes_preference @@ -80,7 +80,7 @@ assign validForFoot 1 #Penalty is ( 1 + SAC_K1)^(SAC_scale_preferred - SAC) -1 for SAC_scale_preferred > SAC, SAC <= SAC_scale_limit #Penalty is ( 1 + SAC_K2)^(SAC - SAC_scale_preferred) -1 for SAC_scale_preferred < SAC, SAC <= SAC_scale_limit -#extra complexity of code below, with adding +/- 1.0 +#extra complexity of code below, with adding +/- 1.0 #is to keep final penalties additive, even with multiplicative incremental penalty approach #code is run only once, being in global context @@ -109,35 +109,35 @@ assign any_hiking_route or route=hiking or route_hiking_iwn=yes or route_hiking_nwn=yes or route_hiking_rwn=yes or route_hiking_lwn=yes or route_hiking_=yes or route_foot_=yes or route_foot_nwn=yes - or route_foot_rwn=yes route_foot_lwn=yes - + or route_foot_rwn=yes route_foot_lwn=yes + assign any_cycleroute = if route_bicycle_icn=yes then true else if route_bicycle_ncn=yes then true else if route_bicycle_rcn=yes then true else if route_bicycle_lcn=yes then true - else false - + else false + assign is_ldhr and any_hiking_route not equal 0.0 hiking_routes_preference assign nodeaccessgranted any_hiking_route # ismuddy addresses potentially bad surface conditions during wet weather ( mud, slickiness of grass) -assign ismuddy and or isunpaved surface= +assign ismuddy and or isunpaved surface= and iswet - not or surface=gravel surface=pebblestone + not or surface=gravel surface=pebblestone assign issidewalk sidewalk=left|right|both|yes assign istrack highway=track|road|path|footway assign ismainroad highway=motorway|motorway_link|trunk|trunk_link|primary|primary_link|secondary|secondary_link|tertiary|tertiary_link|unclassified -#assign turncost switch or shortest_way is_ldhr 0 turncost_value #v1.5 +#assign turncost switch or shortest_way is_ldhr 0 turncost_value #v1.5 assign turncost 0 #v1.8.3 -assign initialcost - switch route=ferry 10000 - - switch or shortest_way is_ldhr 0 initialcost_value +assign initialcost + switch route=ferry 10000 + + switch or shortest_way is_ldhr 0 initialcost_value assign defaultaccess switch access= not motorroad=yes switch or access=private access=no 0 1 @@ -151,28 +151,28 @@ assign bikeaccess 1 not or bicycle=private or bicycle=no bicycle=dismount -assign footaccess or any_hiking_route - or issidewalk +assign footaccess or any_hiking_route + or issidewalk or and bikeaccess not foot=no or bicycle=dismount switch foot= defaultaccess not foot=private|no - + assign accesspenalty switch footaccess 0 switch bikeaccess 4 100000 assign badoneway = 0 assign onewaypenalty = 0 -#SAC is estimated path difficulty, +#SAC is estimated path difficulty, #integrating both MTB and SAC scales with estimated MTB/SAC difficulty matching #see http://wiki.openstreetmap.org/wiki/Key:mtb:scale # http://wiki.openstreetmap.org/wiki/Key:sac_scale -assign SAC +assign SAC if sac_scale= then ( - + if mtb:scale= then 0 - + else if mtb:scale=6|5 then 5 else if mtb:scale=4 then 4 else if mtb:scale=3 then 3 @@ -181,7 +181,7 @@ assign SAC else 0 ) else - + if sac_scale=difficult_alpine_hiking then 6 else if sac_scale=demanding_alpine_hiking then 5 else if sac_scale=alpine_hiking then 4 @@ -189,29 +189,29 @@ assign SAC else if sac_scale=mountain_hiking then 2 else if sac_scale=hiking|T1-hiking|yes then 1 else 0 - -assign SAC_scale_access # if SAC_scale_limit < SAC then true else false - if sac_scale= then true else equal ( max SAC_scale_limit SAC ) SAC_scale_limit - + +assign SAC_scale_access # if SAC_scale_limit < SAC then true else false + if sac_scale= then true else equal ( max SAC_scale_limit SAC ) SAC_scale_limit + assign SAC_scale_penalty if not SAC_scale_access then SAC_access_penalty # not allowed SAC scale - + else if equal SAC SAC_scale_preferred then 0.0 else if equal ( add SAC 1 ) SAC_scale_preferred then SAC_K1 - else if equal ( add SAC 2 ) SAC_scale_preferred then SAC_K1_2 - else if equal ( add SAC 3 ) SAC_scale_preferred then SAC_K1_3 - else if equal ( add SAC 4 ) SAC_scale_preferred then SAC_K1_4 - else if equal ( add SAC 5 ) SAC_scale_preferred then SAC_K1_5 - else if equal ( add SAC 6 ) SAC_scale_preferred then SAC_K1_6 - else if equal ( add SAC_scale_preferred 1 ) SAC then SAC_K2 + else if equal ( add SAC 2 ) SAC_scale_preferred then SAC_K1_2 + else if equal ( add SAC 3 ) SAC_scale_preferred then SAC_K1_3 + else if equal ( add SAC 4 ) SAC_scale_preferred then SAC_K1_4 + else if equal ( add SAC 5 ) SAC_scale_preferred then SAC_K1_5 + else if equal ( add SAC 6 ) SAC_scale_preferred then SAC_K1_6 + else if equal ( add SAC_scale_preferred 1 ) SAC then SAC_K2 else if equal ( add SAC_scale_preferred 2 ) SAC then SAC_K2_2 - else if equal ( add SAC_scale_preferred 3 ) SAC then SAC_K2_3 - else if equal ( add SAC_scale_preferred 4 ) SAC then SAC_K2_4 - else if equal ( add SAC_scale_preferred 5 ) SAC then SAC_K2_5 - else if equal ( add SAC_scale_preferred 6 ) SAC then SAC_K2_6 - else 1.0 - + else if equal ( add SAC_scale_preferred 3 ) SAC then SAC_K2_3 + else if equal ( add SAC_scale_preferred 4 ) SAC then SAC_K2_4 + else if equal ( add SAC_scale_preferred 5 ) SAC then SAC_K2_5 + else if equal ( add SAC_scale_preferred 6 ) SAC then SAC_K2_6 + else 1.0 + assign tracktype_penalty ( if not istrack then 0.0 else if tracktype= then 0.0 else if tracktype=grade1 then 0.1 else if tracktype=grade2 then 0.05 @@ -240,91 +240,91 @@ assign wet_penalty ( ) assign Offroad_factor_for_road - if ( equal Offroad_factor 0.0 ) then 0.0 else + if ( equal Offroad_factor 0.0 ) then 0.0 else ( - if ismainroad then Offroad_factor - else if ( or ispaved highway=residential|living_street|service|pedestrian ) then ( multiply 0.33 Offroad_factor ) - else if ( not isunpaved ) then ( multiply -0.33 Offroad_factor ) + if ismainroad then Offroad_factor + else if ( or ispaved highway=residential|living_street|service|pedestrian ) then ( multiply 0.33 Offroad_factor ) + else if ( not isunpaved ) then ( multiply -0.33 Offroad_factor ) else ( multiply -1 multiply Offroad_factor ( add 1.0 ( multiply 0.33 SAC_scale_penalty ) ) ) ) - + assign nonpath_penalty = if ( equal path_preference 0.0 ) then 0.0 # nonpath_penalty inactive else if not istrack then path_preference #istrack = highway=track/path/road/footway else if ispaved then ( multiply path_preference 0.5 ) -else if or ( and not isunpaved not highway=path ) +else if or ( and not isunpaved not highway=path ) ( tracktype=grade1|grade2 ) then ( multiply path_preference 0.25 ) -else if not ( and isunpaved - and highway=path - and tracktype=grade1|grade2 - not surface=gravel|cobblestone|pebblestone ) +else if not ( and isunpaved + and highway=path + and tracktype=grade1|grade2 + not surface=gravel|cobblestone|pebblestone ) then ( multiply path_preference 0.125 ) -else 0.0 - +else 0.0 + assign rawcostfactor # can be <1.0, is treated later if shortest_way then ( add 1 accesspenalty ) else - + add nonpath_penalty add accesspenalty ( - if ( and highway= not route=ferry ) then 100000 + if ( and highway= not route=ferry ) then 100000 else if highway=steps then ( switch allow_steps ( switch consider_elevation 1.0 3.0 ) 100000 ) else if route=ferry then ( if allow_ferries then 2.34 else 100000 ) - + # iswet=1 in global context section means wet weather, increases penalty for eventually inconvenient ways # ismuddy boolean relates in wet weather to unpaved or unclassified surface, that can have mud or get slicky in wet weather. else if highway=pedestrian then ( switch ismuddy 1.3 1.0 ) else if highway=bridleway then ( switch ismuddy 2.5 switch iswet 1.4 1.2 ) else if highway=cycleway then ( switch ismuddy 1.4 switch iswet 1.0 1.1 ) - else if highway=residential|living_street + else if highway=residential|living_street then ( switch ismuddy 1.5 switch iswet 1.0 1.1 ) else if highway=service then ( switch ismuddy 1.5 switch iswet 1.1 1.2 ) - - else if istrack then + + else if istrack then ( add 1.0 add tracktype_penalty add surface_penalty add wet_penalty SAC_scale_penalty ) else if highway=motorway|motorway_link then 100000 else if highway=proposed|abandoned|construction then ( switch ismuddy 10 switch iswet 6 4 ) - - else if highway=trunk|trunk_link then + + else if highway=trunk|trunk_link then ( switch iswet ( switch issidewalk 1.5 10 ) ( switch issidewalk 2.0 20 ) ) - else if highway=primary|primary_link then - ( switch iswet ( switch issidewalk 1.5 5 ) ( switch issidewalk 2.0 10 ) ) - else if highway=secondary|secondary_link then + else if highway=primary|primary_link then + ( switch iswet ( switch issidewalk 1.5 5 ) ( switch issidewalk 2.0 10 ) ) + else if highway=secondary|secondary_link then ( switch iswet ( switch issidewalk 1.2 2.5 ) ( switch issidewalk 1.5 4.0 ) ) else if highway=tertiary|tertiary_link then ( if iswet then ( switch issidewalk 1.1 1.5 ) else ( switch issidewalk 1.2 2.5 ) ) else if highway=unclassified then - ( if ismuddy then 3.0 else if iswet then ( switch issidewalk 1.0 1.3 ) else ( switch issidewalk 1.1 1.5 ) ) - + ( if ismuddy then 3.0 else if iswet then ( switch issidewalk 1.0 1.3 ) else ( switch issidewalk 1.1 1.5 ) ) + else add cost_of_unknown switch ismuddy 0.5 0.0 ) - -assign rawcostfactor2 - + +assign rawcostfactor2 + if equal hiking_routes_preference 0.0 then rawcostfactor # Not preferring hiking routes else if is_ldhr then rawcostfactor # is hiking route - else multiply rawcostfactor nonhiking_route_penalty - -assign costfactor if shortest_way then ( add 1 accesspenalty ) - else max 1.0 add rawcostfactor2 Offroad_factor_for_road + else multiply rawcostfactor nonhiking_route_penalty + +assign costfactor if shortest_way then ( add 1 accesspenalty ) + else max 1.0 add rawcostfactor2 Offroad_factor_for_road assign downhillcostfactor if shortest_way then ( add 1 accesspenalty ) else - max 1.0 + max 1.0 add rawcostfactor2 - add Offroad_factor_for_road + add Offroad_factor_for_road if ismuddy then 0.5 # slicky else if surface=grass then -0.2 # soft impact else if ispaved then 0.2 # hard impact else if surface=gravel|pebblestone|fine_gravel then 0.3 # slides else 0.0 -assign uphillcostfactor +assign uphillcostfactor if shortest_way then ( add 1 accesspenalty ) else - max 1.0 + max 1.0 add rawcostfactor2 add Offroad_factor_for_road if ismuddy then 0.3 # slicky @@ -332,9 +332,9 @@ assign uphillcostfactor else if ispaved then -0.1 # sure foot else if surface=gravel|pebblestone|fine_gravel then 0.2 # slides else 0.0 - + # way priorities used for voice hint generation - + assign priorityclassifier = if ( highway=motorway ) then 30 @@ -350,12 +350,12 @@ assign priorityclassifier = else if ( highway=unclassified ) then 20 else if ( highway=residential|living_street ) then 18 else if ( highway=steps|pedestrian ) then 16 - else if ( highway=service|cycleway ) then if ( or tracktype=grade1 ispaved ) then 14 else 12 - else if ( highway=track|road|bridleway ) then if ( or tracktype=grade1 ispaved ) then 10 else 8 + else if ( highway=service|cycleway ) then if ( or tracktype=grade1 ispaved ) then 14 else 12 + else if ( highway=track|road|bridleway ) then if ( or tracktype=grade1 ispaved ) then 10 else 8 else if ( highway=path|footway ) then ( if ( or tracktype=grade1 ispaved ) then 6 else if tracktype=grade2 then 4 else if not surface=grass|gravel then 3 - else 2 ) + else 2 ) else 0 # some more classifying bits used for voice hint generation... @@ -375,8 +375,8 @@ assign classifiermask add isbadoneway add multiply isgoodoneway 2 add multiply isroundabout 4 add multiply islinktype 8 - multiply isgoodforcars 16 - + multiply isgoodforcars 16 + ---context:node # following code refers to node tags @@ -436,9 +436,9 @@ assign initialcost switch or bikeaccess footaccess 0 1000000 # - 0.33 * MTB_factor for not paved/not unpaved roads, # - MTB_factor * ( 1 + 0.33 * smoothnesspenalty ) for unpaved roads. - at MTB_factor 3.0 smootheness is ignored # -# Default is 0.0 = no effect. +# Default is 0.0 = no effect. # Recommended -0.5 - +1.0 -# Reasonable -2.0 .. +3.0, +# Reasonable -2.0 .. +3.0, # # Final costfactor is kept >= 1 for final costfacto values. ############################################################################################# @@ -453,13 +453,13 @@ assign initialcost switch or bikeaccess footaccess 0 1000000 # # 2014-10-10 v1.1 - changed hiking route preference logic # 1.2 - fixed preference counting bug -# 2014-10-11 1.3 - adding foot route to hiking routes, +# 2014-10-11 1.3 - adding foot route to hiking routes, # fixed ferry cost to respect initial cost triggerring. # added bikeaccess, added shortest way mode, code cleanup # 2014-10-12: v1.4 - involving turncosts and way/node initial costs as orientation/decision penalties, # but turning them off for sticking to hiking routes as extra preference, # tweaking cost preferences -# 2014-10-13 v1.5 +# 2014-10-13 v1.5 # redesigned route preference policy - turncost turned off even for nonsticky but preferred hiking routes # cost tweaking. # removed uniform cost=1 for sticky hiking routes, to distinguish quality @@ -467,14 +467,14 @@ assign initialcost switch or bikeaccess footaccess 0 1000000 # used not round costs to often trigger initial cost calculation #v1.51 - bugfix of redundant routing penalty #v 1.6 - initialcost penalty only for sticking routes, decreased way penalties for preferring routes -# 31/5/2015 v 1.7 ALFA + sac_scale + sac_scale_limit implemented +# 31/5/2015 v 1.7 ALFA + sac_scale + sac_scale_limit implemented # 10/6/2015 v1.7.1 ALFA * sac_scale improved # + MTB scale integrated to SAC scale # + sac_scale_preferred implemented, with progressive penalizing for SAC <> SAC preferred # 10/6/2015 v1.7.2 BETA ! Fixed general way access penalties # 15/6/2015 v1.7.3 BETA * SAC-MTB scale integration reevaluated, increased MTB scale penalty # * MTB scale penalty used as fallback if no SAC rating -# 16/6/2015 v1.7.4 ALFA * Optimized SAC logic +# 16/6/2015 v1.7.4 ALFA * Optimized SAC logic # 17/6/2015 v1.7.5 BETA + Track penalty system # 20/6/2015 v1.7.6 RELEASE * Modified and simplified route preferencing # 01/12/2015 v1.8.1 ALFA +ported MTB_factor from bicycle Trekking template, renamed for hiking context to Offroad_factor diff --git a/misc/profiles2/moped.brf b/misc/profiles2/moped.brf index 82a7ed5..50304de 100644 --- a/misc/profiles2/moped.brf +++ b/misc/profiles2/moped.brf @@ -16,7 +16,7 @@ assign uphillcutoff 0 assign validForBikes 1 assign validForCars 1 -assign turnInstructionMode = 1 # 0=none, 1=auto-choose, 2=locus-style, 3=osmand-style, 4=comment-style, 5=gpsies-style, 6=orux-style +assign turnInstructionMode = 1 # %turnInstructionMode% | Mode for the generated turn instructions | [0=none, 1=auto-choose, 2=locus-style, 3=osmand-style, 4=comment-style, 5=gpsies-style, 6=orux-style, 7=locus-old-style] ---context:way # following code refers to way-tags diff --git a/misc/profiles2/shortest.brf b/misc/profiles2/shortest.brf index a4cc7f3..f4e66db 100644 --- a/misc/profiles2/shortest.brf +++ b/misc/profiles2/shortest.brf @@ -7,7 +7,7 @@ assign downhillcutoff 1.5 assign uphillcost 0 assign uphillcutoff 1.5 -assign turnInstructionMode = 1 # 0=none, 1=auto-choose, 2=locus-style, 3=osmand-style, 4=comment-style, 5=gpsies-style, 6=orux-style +assign turnInstructionMode = 1 # %turnInstructionMode% | Mode for the generated turn instructions | [0=none, 1=auto-choose, 2=locus-style, 3=osmand-style, 4=comment-style, 5=gpsies-style, 6=orux-style, 7=locus-old-style] assign validForFoot 1 ---context:way # following code refers to way-tags diff --git a/misc/profiles2/trekking.brf b/misc/profiles2/trekking.brf index 8a4b94d..b074aaf 100644 --- a/misc/profiles2/trekking.brf +++ b/misc/profiles2/trekking.brf @@ -35,7 +35,7 @@ assign C_r = 0.01 # %C_r% | Rolling resistance coefficient (dimensionle assign bikerPower = 100 # %bikerPower% | Average power (in W) provided by the biker, for travel time computation | number # Turn instructions settings -assign turnInstructionMode = 1 # %turnInstructionMode% | Mode for the generated turn instructions | [0=none, 1=auto-choose, 2=locus-style, 3=osmand-style, 4=comment-style, 5=gpsies-style, 6=orux-style] +assign turnInstructionMode = 1 # %turnInstructionMode% | Mode for the generated turn instructions | [0=none, 1=auto-choose, 2=locus-style, 3=osmand-style, 4=comment-style, 5=gpsies-style, 6=orux-style, 7=locus-old-style] assign turnInstructionCatchingRange = 40 # %turnInstructionCatchingRange% | Within this distance (in m) several turning instructions are combined into one and the turning angles are better approximated to the general direction | number assign turnInstructionRoundabouts = true # %turnInstructionRoundabouts% | Set to "false" to avoid generating special turning instructions for roundabouts | boolean diff --git a/misc/profiles2/vm-forum-liegerad-schnell.brf b/misc/profiles2/vm-forum-liegerad-schnell.brf index 91efd23..fa2197c 100644 --- a/misc/profiles2/vm-forum-liegerad-schnell.brf +++ b/misc/profiles2/vm-forum-liegerad-schnell.brf @@ -1,460 +1,460 @@ -# -# Profile for fast recumbent bikes, contributed by http://www.velomobilforum.de - ----context:global - -assign no_steps = false # %no_steps% | keine Stufen, das Liegerad soll nicht getragen werden müssen | boolean -assign no_wrong_oneway = false # %no_wrong oneway% | keine Einbahnstrasse in falsche Richtung, auch nicht schiebend | boolean - -assign dismount_cost = 1000 # %dismount_cost% | Umweg in Meter der in Kauf genommen wird bevor eine Strecke genommen wird bei der man austeigen muss, ab 1 000 000 wird keine Schiebestrecke mehr genommen | number -assign avoid_main_roads = 5 # %avoid_main_roads% | große Straße vermeiden(0-10): 0 = nicht vermeiden, 1 = leicht vermeiden, 3 = Standard, 10 = stark vermeiden | number -assign avoid_small_roads = 5 # %avoid_small_roads% | kleine Straße vermeiden(0-10): 0 = nicht vermeiden, 1 = leicht vermeiden, 5 = Standard, 10 = stark vermeiden | number -assign avoid_cycleways = 3 # %avoid_cycleways% | Radwege vermeiden(0-10): 0 = nicht vermeiden, 1 = leicht vermeiden, 3 = Standard, 10 = stark vermeiden | number -assign avoid_elevation = 5 # %avoid_elevation% | Hohenmeter vermeiden(0-10): 0 = nicht vermeiden, 1 = leicht vermeiden, 5 = Standard, 10 = stark vermeiden | number -assign avoid_bad_ways = 8 # %avoid_bad_ways% | Schlechte Wege vermeiden(0-10): 0 = nicht vermeiden, 1 = leicht vermeiden, 8 = Standard, 10 = stark vermeiden | number - -assign totalMass = 90 # %totalMass% | Gesamtmasse des Fahrzeugs (Fahrzeug, Fahrer, Gepäck...) in kg, für Fahrtzeitschätzung | number -assign maxSpeed = 60 # Maximale Geschwindigkeit ab der der Fahrer bremst in km/h -assign S_C_x = 0.23 # Effektive Stirnfläche in m² -assign C_r = 0.004 # Rollwiderstand -assign bikerPower = 125 # %bikerPower% | Dauerleistung in Watt, für Fahrtzeitschätzung| number - - -assign ignore_bicycle_no = false # %ignore_bicycle_no% | für Regionen mit falschen bicyle=no tags können sie mit "true" ignoriert werden. Auch Shuttletransporte (bicycle=dismount + foot=no) werden geroutet | boolean - - -assign turnInstructionMode = 1 # %turnInstructionMode% | Modus für die Abbiegehinweise | [0=keine, 1=automatische Wahl, 2=locus-Style, 3=osmand-Style, 4=comment-Style, 5=gpsies-Style, 6=orux-Style] -assign turnInstructionCatchingRange 20 # innerhalb dieser Strecke werden mehrere Abiegehinweise zu einem zusammengefasst und die Abiegewinkel werden besser an die generelle Richtung angenähert -assign turnInstructionRoundabouts true # mit "false" werden keine speziellen Abiegehinweise für den Kreisverkehr generiert - -assign avoidmr2 multiply 0.04 multiply avoid_main_roads avoid_main_roads -assign avoidsr multiply 0.2 avoid_small_roads -assign avoidbw multiply 0.125 avoid_bad_ways -assign avoid_ele multiply avoid_elevation 0.2 - -assign downhillcost multiply avoid_ele 80 # Kosten für die Höhenmeter bergab -assign downhillcutoff 0.1 # Gefälle unter diesem Wert in Prozent werden nicht gewertet -assign uphillcost multiply avoid_ele 80 # Kosten für die Höhenmeter bergauf -assign uphillcutoff 1 # Steigungen unter diesem Wert in Prozent werden nicht gewertet - -assign validForBikes true # bei true werden die Außnahmen bei den Abbiegebeschränkungen für Fahrräder aktiviert -assign considerTurnRestrictions true # bei false werden die Abbiegebeschränkungen ignoriert - -assign pass1coefficient 2.5 # Berechnugskoeffizient für erste schnelle Berechnung -assign pass2coefficient 0 # Berechnugskoeffizient für zweite exakte Berechnung -# sinnvolle Werte für den ersten Koeffizienten: -# 1 exakte Berechnung beim ersten Durchlauf -# umso größer die Werte umso schneller und ungenauer die erste Berechnung -# sinnvolle Werte für den zweiten Koeffizienten: -# 0 exakte Berechnung mit Beschränkung des Suchgebiets über die Kosten der ersten Berechnung -# -1 keine zweite Berechnung, nur sinnvoll bei 1 im ersten Durchlauf - -# Um die ungenauen SRTM Höhendaten zu filtern werden für jeweils für Anstiege und Gefälle Puffer verwendet. Erst wenn diese überschritten werden die Segmente als Anstiege oder Gefälle gewertet. - -assign elevationpenaltybuffer 7 # Höhenpuffer (in Meter) ab dem die Höhenstrafen beginnen und das Segment als Anstieg und Gefälle gewertet wird -assign elevationmaxbuffer 13 # Maximale Puffergröße (in Meter), alles darüberhinausgehende wird voll bestraft -assign elevationbufferreduce 1 # im Bereich zwischen elevationpenaltybuffer und elevationmaxbuffer wird eine Höhenstrafe, die einer Steigung oder Gefälle dieses Wertes (in Prozent) entspricht, verhängt und diese Höhenmeter vom Puffer abgezogen. - ----context:way - -# Parameter für die Wege -#zusätzliche Kosten in Meter für jeden Streckenabschnitt - -assign any_cycleroute or route_bicycle_icn=yes or route_bicycle_ncn=yes or route_bicycle_rcn=yes route_bicycle_lcn=yes -assign nodeaccessgranted or any_cycleroute lcn=yes - -assign cycleway - or highway=cycleway and highway=path|footway|pedestrian bicycle=designated|yes - -assign footway - or highway=footway|pedestrian and highway=path foot=designated|yes - -assign turncost - switch junction=roundabout 0 - 150 # Kosten die für eine 90 Grad Abbiegung berechnet werden. Für kleinere Winkel werden sie mit turncost*cos(Winkel) berechnet, bei Kreisverkehr keine weitere Kosten - -assign initialclassifier # hier wird bestimmten Wegen ein Wert zugeordnet und wenn er sich vom vorherigen unterscheidet die initalcost hinzugerechnet - switch route=ferry 2 - switch highway=steps 3 - switch cycleway 4 - switch footway 5 - 1 - -assign initialcost - switch route=ferry 10000 # Kosten wenn eine Fähre verwendet wird - switch highway=steps switch no_steps 1000000 dismount_cost # Kosten für Stufen - switch cycleway multiply 11.1111112 multiply avoid_cycleways avoid_cycleways # Kosten für Radwege - switch footway dismount_cost # Kosten für Fußwege - 0 - -# Kosten ab hier als Meter für jeden tatsächlichen Meter - -assign oneway - switch oneway= - junction=roundabout - or oneway=yes or oneway=true oneway=1 - -assign onewaypenalty - switch switch reversedirection=yes oneway oneway=-1 - switch or cycleway=opposite or cycleway=opposite_lane or cycleway=opposite_track oneway:bicycle=no 0 #zusätzliche Kosten für in Gegenrichtung für Radfahrer freigegebene Einbahnstraßen in Gegenrichtung - switch no_wrong_oneway 10000 - switch or highway=primary highway=primary_link 50 #zusätzliche Kosten für Bundesstraßen Einbahnstraßen in Gegenrichtung - switch or highway=secondary highway=secondary_link 30 #zusätzliche Kosten für Landstraßen Einbahnstraßen in Gegenrichtung - switch or highway=tertiary highway=tertiary_link 25 #zusätzliche Kosten für Kreisstraßen Einbahnstraßen in Gegenrichtung - 20.0 #zusätzliche Kosten für sonstige Einbahnstraßen in Gegenrichtung - 0.0 - -assign defaultaccess - switch access= - not motorroad=yes - switch or access=private access=no - 0 - 1 - -assign bikeaccess - or any_cycleroute - switch bicycle= - switch vehicle= - defaultaccess - switch or vehicle=private vehicle=no - 0 - 1 - not or bicycle=private or and not ignore_bicycle_no bicycle=no bicycle=dismount - - -assign footaccess - or bikeaccess - or and bicycle=dismount ignore_bicycle_no - switch foot= - defaultaccess - not or foot=private foot=no - -assign accesspenalty - switch bikeaccess - 0 - switch footaccess - 10 #Zusatzkosten fürs Schieben - 10000 #Zusatzkosten für gesperrte oder private Wege - -assign maxspeed_forward - switch maxspeed:forward=50 50 - switch maxspeed:forward=30 30 - switch maxspeed:forward=10 10 - switch maxspeed:forward=20 20 - switch maxspeed:forward=40 40 - switch maxspeed:forward=60 60 - switch maxspeed:forward=70 70 - switch maxspeed:forward=80 80 - switch maxspeed:forward=90 90 - switch maxspeed:forward=100 100 - switch maxspeed:forward=110 110 - switch maxspeed:forward=120 120 - switch maxspeed:forward=130 130 - switch maxspeed:forward=urban 50 - switch maxspeed:forward=rural 100 - 0 - -assign maxspeed_backward - switch maxspeed:backward=50 50 - switch maxspeed:backward=30 30 - switch maxspeed:backward=10 10 - switch maxspeed:backward=20 20 - switch maxspeed:backward=40 40 - switch maxspeed:backward=60 60 - switch maxspeed:backward=70 70 - switch maxspeed:backward=80 80 - switch maxspeed:backward=90 90 - switch maxspeed:backward=100 100 - switch maxspeed:backward=110 110 - switch maxspeed:backward=120 120 - switch maxspeed:backward=130 130 - switch maxspeed:backward=urban 50 - switch maxspeed:backward=rural 100 - 0 - -assign maxspeed - switch and reversedirection=yes maxspeed_backward maxspeed_backward - switch and not reversedirection=yes maxspeed_forward maxspeed_forward - switch maxspeed=50 50 - switch maxspeed=30 30 - switch maxspeed=10 10 - switch maxspeed=20 20 - switch maxspeed=40 40 - switch maxspeed=60 60 - switch maxspeed=70 70 - switch maxspeed=80 80 - switch maxspeed=90 90 - switch maxspeed=100 100 - switch maxspeed=110 110 - switch maxspeed=120 120 - switch maxspeed=130 130 - switch maxspeed=urban 50 - switch maxspeed=rural 100 - 999 - - -assign downspeedpenalty - switch equal maxspeed 10 4 # Zusatzkosten für Geschwindigkeitsbegrenzung 10 km/h bei Gefälle - switch equal maxspeed 20 1.5 # Zusatzkosten für Geschwindigkeitsbegrenzung 20 km/h bei Gefälle - switch equal maxspeed 30 0.7 # Zusatzkosten für Geschwindigkeitsbegrenzung 30 km/h bei Gefälle - switch equal maxspeed 40 0.4 # Zusatzkosten für Geschwindigkeitsbegrenzung 40 km/h bei Gefälle - switch equal maxspeed 50 0.2 # Zusatzkosten für Geschwindigkeitsbegrenzung 50 km/h bei Gefälle - 0 - -assign flatspeedpenalty - switch equal maxspeed 10 2 # Zusatzkosten für Geschwindigkeitsbegrenzung 10 km/h in der Ebene - switch equal maxspeed 20 0.5 # Zusatzkosten für Geschwindigkeitsbegrenzung 20 km/h in der Ebene - switch equal maxspeed 30 0.15 # Zusatzkosten für Geschwindigkeitsbegrenzung 30 km/h in der Ebene - switch equal maxspeed 40 0.12 # Zusatzkosten für Geschwindigkeitsbegrenzung 40 km/h in der Ebene - switch equal maxspeed 50 0.1 # Zusatzkosten für Geschwindigkeitsbegrenzung 50 km/h in der Ebene - 0 - -assign upspeedpenalty - switch equal maxspeed 10 1.5 # Zusatzkosten für Geschwindigkeitsbegrenzung 10 km/h bei Anstiegen - switch equal maxspeed 20 0.4 # Zusatzkosten für Geschwindigkeitsbegrenzung 20 km/h bei Anstiegen - switch equal maxspeed 30 0.1 # Zusatzkosten für Geschwindigkeitsbegrenzung 30 km/h bei Anstiegen - 0 - - -assign surfacepenalty - add switch embedded_rails=tram|yes|rail 10 # Zusatzkosten bei Schienen in der Fahrbahn - 0 - multiply avoidbw - switch surface=asphalt|paved 0 #Zusatzkosten für Teer oder versiegelte Flächen - switch concrete=plates 1 # Zusatzkosten für Betonplattenwege - switch concrete=lanes 2 # Zusatzkosten für Betonspurplatten - switch surface=concrete|paving_stones|wood|metal 0.4 #Zusatzkosten für Beton, Pflastersteine, Holz oder Metall - switch surface=cobblestone|fine_gravel|compacted|sett|grass_paver 4 #Zusatzkosten für Kopfsteinpflaster, Splitt, verdichtete Deckschicht, behauene Pflastersteine oder Rasengittersteine - switch surface=gravel|sand|pebblestone 10 #Zusatzkosten für Schotter, Sand oder Kies - switch surface=ground|grass|unpaved|dirt|earth|mud|clay 50 #Zusatzkosten für naturbelassene Wege, Grasswege, unbefestigte Wege, Schmutzwege, erdige Wege, schlammige Wege oder Lehmwege - 0 - -assign smoothnesspenalty - multiply avoidbw - switch smoothness=excellent|good|very_good 0 #Zusatzkosten für excellente, gute, oder sehr gute Oberflächen - switch smoothness=intermediate|medium 0.7 #Zusatzkosten für mittelmäßige Oberflächen - switch smoothness=rough|poor 2 #Zusatzkosten für raue oder schlechte Oberflächen - switch smoothness=robust_wheels|bad 10 #Zusatzkosten für Oberflächen die robuste Reifen benötigen oder schlechte Oberflächen - switch smoothness=high_clearance|off_road_wheels|very_bad|horrible|very_horrible|impassable 100 #Zusatzkosten für Oberflächen die eine erhöhte Bodenfreiheit oder Geländebereifung benötigen, schrecklich, sehr schrecklich oder unpasierbar sind - 0 - - -assign costfactor - -# dieser Abschnitt ist für die Kosten in der Ebene - - switch and highway= not route=ferry 10000 # Kosten für alles ohne higway tag außer Fähren - switch or highway=proposed highway=abandoned 10000 # Kosten für geplante oder Wege im Bau - - min 9999 - max 1 - - add onewaypenalty - add accesspenalty - add max surfacepenalty smoothnesspenalty - add flatspeedpenalty - - max 1 - switch highway=motorway|motorway_link 10000 # Kosten für Autobahnen - switch route=ferry 10.67 # Kosten für Fähren - switch highway=trunk|trunk_link add 1 multiply avoidmr2 4 # Kosten für eine autobahnänliche Straße - switch highway=primary|primary_link add 0.7 multiply avoidmr2 1.3 # Kosten für Bundesstraßen - switch highway=secondary|secondary_link 1 # Kosten für Landstraßen - switch highway=tertiary|tertiary_link add 0.7 multiply avoidsr 0.3 # Kosten für Kreisstraßen - switch highway=unclassified add 0.7 multiply avoidsr 0.3 # Kosten für Verbindungsstraßen - switch highway=residential|service add 0.7 multiply avoidsr 0.5 # Kosten für Wohn- und Zufahrtsstraßen - switch highway=track - switch tracktype=grade1 add 0.7 multiply avoidsr 0.5 # Kosten für geteerte, betonierte oder gepflasterte Feldwege - switch tracktype=grade2 multiply avoidbw add 1 multiply avoidsr 6 # Kosten für geschotterte Feldwege - switch tracktype=grade3 multiply avoidbw 40 # Kosten für Feldwege mit weichem Untergrund - switch tracktype=grade4 multiply avoidbw 50 # Kosten für unbefestigte Feldwege - switch tracktype=grade5 multiply avoidbw 50 # Kosten für kaum erkennbare Feldwege - switch surface= multiply avoidbw 20 # Kosten für Feldwege ohne Oberflächenangabe - add 0.7 multiply avoidsr 0.5 # Kosten für Feldwege mit Oberflächenangabe - switch cycleway add 0.58 multiply avoid_cycleways 0.24 # Kosten für Fahrradwege - switch highway=living_street add 2 multiply avoidsr 2 # Kosten für Spielstraßen - switch highway=road add 3 multiply avoidsr 4 # Kosten für noch nicht genauer beschriebene Straße - switch footway 20 # Kosten für Fußwege - switch highway=steps 30 # Kosten für Stufen - switch highway=path - switch surface= multiply avoidbw 40 # Kosten für Pfade ohne Oberflächenangabe - multiply avoidsr add 0.58 multiply avoid_cycleways 0.24 # Kosten für Pfade mit Oberflächenangabe - switch highway=bridleway multiply avoidbw 80 # Kosten für Reitwege - 20 # Kosten für sonstige Wege - -assign uphillcostfactor - -# dieser Abschnitt ist für die Kosten bei Anstiegen -# da er von der Struktur identisch wie der vorherige Abschnitt werde ich die Beschreibung hier nicht wiederholen - - switch and highway= not route=ferry 10000 - switch or highway=proposed highway=abandoned 10000 - - min 9999 - max 1 - - add onewaypenalty - add accesspenalty - add max surfacepenalty smoothnesspenalty - add upspeedpenalty - max 1 - switch highway=motorway|motorway_link 10000 - switch route=ferry 10.67 - switch highway=trunk|trunk_link add 1 multiply avoidmr2 6 - switch highway=primary|primary_link add 0.7 multiply avoidmr2 2.3 - switch highway=secondary|secondary_link add 0.7 multiply avoidmr2 0.5 - switch highway=tertiary|tertiary_link 1 - switch highway=unclassified 1 - switch highway=residential|service add 0.7 multiply avoidsr 0.3 - switch highway=track - switch tracktype=grade1 add 0.7 multiply avoidsr 0.3 - switch tracktype=grade2 multiply avoidbw add 1 multiply avoidsr 2 - switch tracktype=grade3 multiply avoidbw 40 - switch tracktype=grade4 multiply avoidbw 50 - switch tracktype=grade5 multiply avoidbw 50 - switch surface= multiply avoidbw 20 - add 0.7 multiply avoidsr 0.3 - switch cycleway add 0.28 multiply avoid_cycleways 0.24 - switch highway=living_street add 1 multiply avoidsr 1.5 - switch highway=road add 4 multiply avoidsr 6 - switch footway 30 - switch highway=steps 40 - switch highway=path - switch surface= multiply avoidbw 40 - multiply avoidsr add 0.28 multiply avoid_cycleways 0.24 - switch highway=bridleway multiply avoidbw 80 - 20 - -assign downhillcostfactor - -# dieser Abschnitt ist für die Kosten bei Gefälle -# da er von der Struktur identisch wie der vorvorherige Abschnitt werde ich die Beschreibung hier auch nicht wiederholen - - switch and highway= not route=ferry 10000 - switch or highway=proposed highway=abandoned 10000 - - min 9999 - max 1 - - add downspeedpenalty - add onewaypenalty - add accesspenalty - add max smoothnesspenalty surfacepenalty - max 1 - switch highway=motorway|motorway_link 10000 - switch route=ferry 10.67 - switch highway=trunk|trunk_link add 1 multiply avoidmr2 2 - switch highway=primary|primary_link add 0.7 multiply avoidmr2 1.3 - switch highway=secondary|secondary_link 1 - switch highway=tertiary|tertiary_link add 0.5 multiply avoidsr 0.5 - switch highway=unclassified add 0.6 multiply avoidsr 0.6 - switch highway=residential|service add 1 multiply avoidsr 1 - switch highway=track - switch tracktype=grade1 add 1 multiply avoidsr 1 - switch tracktype=grade2 multiply avoidbw add 4 multiply avoidsr 4 - switch tracktype=grade3 multiply avoidbw 40 - switch tracktype=grade4 multiply avoidbw 50 - switch tracktype=grade5 multiply avoidbw 50 - switch surface= multiply avoidbw 20 - add 1 multiply avoidsr 1 - switch cycleway add 0.5 multiply avoid_cycleways 0.5 - switch highway=living_street add 2 multiply avoidsr 6 - switch highway=road add 4 multiply avoidsr 6 - switch footway 30 - switch highway=steps 40 - switch highway=path - switch surface= multiply avoidbw 40 - multiply avoidsr add 0.5 multiply avoid_cycleways 0.5 - switch highway=bridleway multiply avoidbw 80 - 20 - - -# hier kommen Variablen die zur Generierung der Abbiegehinweise benötigt werden - -assign priorityclassifier = - - if ( highway=motorway ) then 30 - else if ( highway=motorway_link ) then 29 - else if ( highway=trunk ) then 28 - else if ( highway=trunk_link ) then 27 - else if ( highway=primary ) then 26 - else if ( highway=primary_link ) then 25 - else if ( highway=secondary ) then 24 - else if ( highway=secondary_link ) then 23 - else if ( highway=tertiary ) then 22 - else if ( highway=tertiary_link ) then 21 - else if ( highway=unclassified ) then 20 - else if ( highway=residential|living_street ) then 6 - else if ( highway=service ) then 6 - else if ( highway=cycleway ) then 6 - else if ( bicycle=designated ) then 6 - else if ( highway=track ) then if tracktype=grade1 then 6 else 4 - else if ( highway=bridleway|road|path|footway ) then 4 - else if ( highway=steps ) then 2 - else if ( highway=pedestrian ) then 2 - else 0 - - - -assign isbadoneway = not equal onewaypenalty 0 -assign isgoodoneway = if reversedirection=yes then oneway=-1 - else if oneway= then junction=roundabout else oneway=yes|true|1 -assign isroundabout = junction=roundabout -assign islinktype = highway=motorway_link|trunk_link|primary_link|secondary_link|tertiary_link -assign isgoodforcars = if greater priorityclassifier 6 then true - else if highway=residential|living_street|service then true - else if ( and highway=track tracktype=grade1 ) then true - else false - -assign classifiermask add isbadoneway - add multiply isgoodoneway 2 - add multiply isroundabout 4 - add multiply islinktype 8 - multiply isgoodforcars 16 - - - ----context:node # following code refers to node tags - -# Parameter für Knotenpunkte -# Kosten an Knotenpunkten in Meter - - -assign defaultaccess - switch access= - 1 # add default barrier restrictions here! - switch or access=private access=no - 0 - 1 - -assign bikeaccess - or nodeaccessgranted=yes - switch bicycle= - switch vehicle= - defaultaccess - switch or vehicle=private vehicle=no - 0 - 1 - switch or bicycle=private and not or highway=crossing ignore_bicycle_no or bicycle=no bicycle=dismount - 0 - 1 - -assign footaccess - or bicycle=dismount - switch foot= - defaultaccess - switch or foot=private foot=no - 0 - 1 - -assign initialcost - add switch highway=traffic_signals 200 # Kosten für Ampel - switch highway=stop 150 # Kosten für Stoppschild - switch railway=crossing|level_crossing 200 # Kosten für Bahnübergang - switch highway=steps switch no_steps 1000000 dismount_cost #Kosten für Stufe - 0 - switch bikeaccess - 0 - switch footaccess - dismount_cost # Kosten fürs Aussteigen - 1000000 #Kosten für verbotene oder private Wege \ No newline at end of file +# +# Profile for fast recumbent bikes, contributed by http://www.velomobilforum.de + +---context:global + +assign no_steps = false # %no_steps% | keine Stufen, das Liegerad soll nicht getragen werden müssen | boolean +assign no_wrong_oneway = false # %no_wrong oneway% | keine Einbahnstrasse in falsche Richtung, auch nicht schiebend | boolean + +assign dismount_cost = 1000 # %dismount_cost% | Umweg in Meter der in Kauf genommen wird bevor eine Strecke genommen wird bei der man austeigen muss, ab 1 000 000 wird keine Schiebestrecke mehr genommen | number +assign avoid_main_roads = 5 # %avoid_main_roads% | große Straße vermeiden(0-10): 0 = nicht vermeiden, 1 = leicht vermeiden, 3 = Standard, 10 = stark vermeiden | number +assign avoid_small_roads = 5 # %avoid_small_roads% | kleine Straße vermeiden(0-10): 0 = nicht vermeiden, 1 = leicht vermeiden, 5 = Standard, 10 = stark vermeiden | number +assign avoid_cycleways = 3 # %avoid_cycleways% | Radwege vermeiden(0-10): 0 = nicht vermeiden, 1 = leicht vermeiden, 3 = Standard, 10 = stark vermeiden | number +assign avoid_elevation = 5 # %avoid_elevation% | Hohenmeter vermeiden(0-10): 0 = nicht vermeiden, 1 = leicht vermeiden, 5 = Standard, 10 = stark vermeiden | number +assign avoid_bad_ways = 8 # %avoid_bad_ways% | Schlechte Wege vermeiden(0-10): 0 = nicht vermeiden, 1 = leicht vermeiden, 8 = Standard, 10 = stark vermeiden | number + +assign totalMass = 90 # %totalMass% | Gesamtmasse des Fahrzeugs (Fahrzeug, Fahrer, Gepäck...) in kg, für Fahrtzeitschätzung | number +assign maxSpeed = 60 # Maximale Geschwindigkeit ab der der Fahrer bremst in km/h +assign S_C_x = 0.23 # Effektive Stirnfläche in m² +assign C_r = 0.004 # Rollwiderstand +assign bikerPower = 125 # %bikerPower% | Dauerleistung in Watt, für Fahrtzeitschätzung| number + + +assign ignore_bicycle_no = false # %ignore_bicycle_no% | für Regionen mit falschen bicyle=no tags können sie mit "true" ignoriert werden. Auch Shuttletransporte (bicycle=dismount + foot=no) werden geroutet | boolean + + +assign turnInstructionMode = 1 # %turnInstructionMode% | Modus für die Abbiegehinweise | [0=keine, 1=automatische Wahl, 2=locus-Style, 3=osmand-Style, 4=comment-Style, 5=gpsies-Style, 6=orux-Style, 7=locus-old-Style] +assign turnInstructionCatchingRange 20 # innerhalb dieser Strecke werden mehrere Abiegehinweise zu einem zusammengefasst und die Abiegewinkel werden besser an die generelle Richtung angenähert +assign turnInstructionRoundabouts true # mit "false" werden keine speziellen Abiegehinweise für den Kreisverkehr generiert + +assign avoidmr2 multiply 0.04 multiply avoid_main_roads avoid_main_roads +assign avoidsr multiply 0.2 avoid_small_roads +assign avoidbw multiply 0.125 avoid_bad_ways +assign avoid_ele multiply avoid_elevation 0.2 + +assign downhillcost multiply avoid_ele 80 # Kosten für die Höhenmeter bergab +assign downhillcutoff 0.1 # Gefälle unter diesem Wert in Prozent werden nicht gewertet +assign uphillcost multiply avoid_ele 80 # Kosten für die Höhenmeter bergauf +assign uphillcutoff 1 # Steigungen unter diesem Wert in Prozent werden nicht gewertet + +assign validForBikes true # bei true werden die Außnahmen bei den Abbiegebeschränkungen für Fahrräder aktiviert +assign considerTurnRestrictions true # bei false werden die Abbiegebeschränkungen ignoriert + +assign pass1coefficient 2.5 # Berechnugskoeffizient für erste schnelle Berechnung +assign pass2coefficient 0 # Berechnugskoeffizient für zweite exakte Berechnung +# sinnvolle Werte für den ersten Koeffizienten: +# 1 exakte Berechnung beim ersten Durchlauf +# umso größer die Werte umso schneller und ungenauer die erste Berechnung +# sinnvolle Werte für den zweiten Koeffizienten: +# 0 exakte Berechnung mit Beschränkung des Suchgebiets über die Kosten der ersten Berechnung +# -1 keine zweite Berechnung, nur sinnvoll bei 1 im ersten Durchlauf + +# Um die ungenauen SRTM Höhendaten zu filtern werden für jeweils für Anstiege und Gefälle Puffer verwendet. Erst wenn diese überschritten werden die Segmente als Anstiege oder Gefälle gewertet. + +assign elevationpenaltybuffer 7 # Höhenpuffer (in Meter) ab dem die Höhenstrafen beginnen und das Segment als Anstieg und Gefälle gewertet wird +assign elevationmaxbuffer 13 # Maximale Puffergröße (in Meter), alles darüberhinausgehende wird voll bestraft +assign elevationbufferreduce 1 # im Bereich zwischen elevationpenaltybuffer und elevationmaxbuffer wird eine Höhenstrafe, die einer Steigung oder Gefälle dieses Wertes (in Prozent) entspricht, verhängt und diese Höhenmeter vom Puffer abgezogen. + +---context:way + +# Parameter für die Wege +#zusätzliche Kosten in Meter für jeden Streckenabschnitt + +assign any_cycleroute or route_bicycle_icn=yes or route_bicycle_ncn=yes or route_bicycle_rcn=yes route_bicycle_lcn=yes +assign nodeaccessgranted or any_cycleroute lcn=yes + +assign cycleway + or highway=cycleway and highway=path|footway|pedestrian bicycle=designated|yes + +assign footway + or highway=footway|pedestrian and highway=path foot=designated|yes + +assign turncost + switch junction=roundabout 0 + 150 # Kosten die für eine 90 Grad Abbiegung berechnet werden. Für kleinere Winkel werden sie mit turncost*cos(Winkel) berechnet, bei Kreisverkehr keine weitere Kosten + +assign initialclassifier # hier wird bestimmten Wegen ein Wert zugeordnet und wenn er sich vom vorherigen unterscheidet die initalcost hinzugerechnet + switch route=ferry 2 + switch highway=steps 3 + switch cycleway 4 + switch footway 5 + 1 + +assign initialcost + switch route=ferry 10000 # Kosten wenn eine Fähre verwendet wird + switch highway=steps switch no_steps 1000000 dismount_cost # Kosten für Stufen + switch cycleway multiply 11.1111112 multiply avoid_cycleways avoid_cycleways # Kosten für Radwege + switch footway dismount_cost # Kosten für Fußwege + 0 + +# Kosten ab hier als Meter für jeden tatsächlichen Meter + +assign oneway + switch oneway= + junction=roundabout + or oneway=yes or oneway=true oneway=1 + +assign onewaypenalty + switch switch reversedirection=yes oneway oneway=-1 + switch or cycleway=opposite or cycleway=opposite_lane or cycleway=opposite_track oneway:bicycle=no 0 #zusätzliche Kosten für in Gegenrichtung für Radfahrer freigegebene Einbahnstraßen in Gegenrichtung + switch no_wrong_oneway 10000 + switch or highway=primary highway=primary_link 50 #zusätzliche Kosten für Bundesstraßen Einbahnstraßen in Gegenrichtung + switch or highway=secondary highway=secondary_link 30 #zusätzliche Kosten für Landstraßen Einbahnstraßen in Gegenrichtung + switch or highway=tertiary highway=tertiary_link 25 #zusätzliche Kosten für Kreisstraßen Einbahnstraßen in Gegenrichtung + 20.0 #zusätzliche Kosten für sonstige Einbahnstraßen in Gegenrichtung + 0.0 + +assign defaultaccess + switch access= + not motorroad=yes + switch or access=private access=no + 0 + 1 + +assign bikeaccess + or any_cycleroute + switch bicycle= + switch vehicle= + defaultaccess + switch or vehicle=private vehicle=no + 0 + 1 + not or bicycle=private or and not ignore_bicycle_no bicycle=no bicycle=dismount + + +assign footaccess + or bikeaccess + or and bicycle=dismount ignore_bicycle_no + switch foot= + defaultaccess + not or foot=private foot=no + +assign accesspenalty + switch bikeaccess + 0 + switch footaccess + 10 #Zusatzkosten fürs Schieben + 10000 #Zusatzkosten für gesperrte oder private Wege + +assign maxspeed_forward + switch maxspeed:forward=50 50 + switch maxspeed:forward=30 30 + switch maxspeed:forward=10 10 + switch maxspeed:forward=20 20 + switch maxspeed:forward=40 40 + switch maxspeed:forward=60 60 + switch maxspeed:forward=70 70 + switch maxspeed:forward=80 80 + switch maxspeed:forward=90 90 + switch maxspeed:forward=100 100 + switch maxspeed:forward=110 110 + switch maxspeed:forward=120 120 + switch maxspeed:forward=130 130 + switch maxspeed:forward=urban 50 + switch maxspeed:forward=rural 100 + 0 + +assign maxspeed_backward + switch maxspeed:backward=50 50 + switch maxspeed:backward=30 30 + switch maxspeed:backward=10 10 + switch maxspeed:backward=20 20 + switch maxspeed:backward=40 40 + switch maxspeed:backward=60 60 + switch maxspeed:backward=70 70 + switch maxspeed:backward=80 80 + switch maxspeed:backward=90 90 + switch maxspeed:backward=100 100 + switch maxspeed:backward=110 110 + switch maxspeed:backward=120 120 + switch maxspeed:backward=130 130 + switch maxspeed:backward=urban 50 + switch maxspeed:backward=rural 100 + 0 + +assign maxspeed + switch and reversedirection=yes maxspeed_backward maxspeed_backward + switch and not reversedirection=yes maxspeed_forward maxspeed_forward + switch maxspeed=50 50 + switch maxspeed=30 30 + switch maxspeed=10 10 + switch maxspeed=20 20 + switch maxspeed=40 40 + switch maxspeed=60 60 + switch maxspeed=70 70 + switch maxspeed=80 80 + switch maxspeed=90 90 + switch maxspeed=100 100 + switch maxspeed=110 110 + switch maxspeed=120 120 + switch maxspeed=130 130 + switch maxspeed=urban 50 + switch maxspeed=rural 100 + 999 + + +assign downspeedpenalty + switch equal maxspeed 10 4 # Zusatzkosten für Geschwindigkeitsbegrenzung 10 km/h bei Gefälle + switch equal maxspeed 20 1.5 # Zusatzkosten für Geschwindigkeitsbegrenzung 20 km/h bei Gefälle + switch equal maxspeed 30 0.7 # Zusatzkosten für Geschwindigkeitsbegrenzung 30 km/h bei Gefälle + switch equal maxspeed 40 0.4 # Zusatzkosten für Geschwindigkeitsbegrenzung 40 km/h bei Gefälle + switch equal maxspeed 50 0.2 # Zusatzkosten für Geschwindigkeitsbegrenzung 50 km/h bei Gefälle + 0 + +assign flatspeedpenalty + switch equal maxspeed 10 2 # Zusatzkosten für Geschwindigkeitsbegrenzung 10 km/h in der Ebene + switch equal maxspeed 20 0.5 # Zusatzkosten für Geschwindigkeitsbegrenzung 20 km/h in der Ebene + switch equal maxspeed 30 0.15 # Zusatzkosten für Geschwindigkeitsbegrenzung 30 km/h in der Ebene + switch equal maxspeed 40 0.12 # Zusatzkosten für Geschwindigkeitsbegrenzung 40 km/h in der Ebene + switch equal maxspeed 50 0.1 # Zusatzkosten für Geschwindigkeitsbegrenzung 50 km/h in der Ebene + 0 + +assign upspeedpenalty + switch equal maxspeed 10 1.5 # Zusatzkosten für Geschwindigkeitsbegrenzung 10 km/h bei Anstiegen + switch equal maxspeed 20 0.4 # Zusatzkosten für Geschwindigkeitsbegrenzung 20 km/h bei Anstiegen + switch equal maxspeed 30 0.1 # Zusatzkosten für Geschwindigkeitsbegrenzung 30 km/h bei Anstiegen + 0 + + +assign surfacepenalty + add switch embedded_rails=tram|yes|rail 10 # Zusatzkosten bei Schienen in der Fahrbahn + 0 + multiply avoidbw + switch surface=asphalt|paved 0 #Zusatzkosten für Teer oder versiegelte Flächen + switch concrete=plates 1 # Zusatzkosten für Betonplattenwege + switch concrete=lanes 2 # Zusatzkosten für Betonspurplatten + switch surface=concrete|paving_stones|wood|metal 0.4 #Zusatzkosten für Beton, Pflastersteine, Holz oder Metall + switch surface=cobblestone|fine_gravel|compacted|sett|grass_paver 4 #Zusatzkosten für Kopfsteinpflaster, Splitt, verdichtete Deckschicht, behauene Pflastersteine oder Rasengittersteine + switch surface=gravel|sand|pebblestone 10 #Zusatzkosten für Schotter, Sand oder Kies + switch surface=ground|grass|unpaved|dirt|earth|mud|clay 50 #Zusatzkosten für naturbelassene Wege, Grasswege, unbefestigte Wege, Schmutzwege, erdige Wege, schlammige Wege oder Lehmwege + 0 + +assign smoothnesspenalty + multiply avoidbw + switch smoothness=excellent|good|very_good 0 #Zusatzkosten für excellente, gute, oder sehr gute Oberflächen + switch smoothness=intermediate|medium 0.7 #Zusatzkosten für mittelmäßige Oberflächen + switch smoothness=rough|poor 2 #Zusatzkosten für raue oder schlechte Oberflächen + switch smoothness=robust_wheels|bad 10 #Zusatzkosten für Oberflächen die robuste Reifen benötigen oder schlechte Oberflächen + switch smoothness=high_clearance|off_road_wheels|very_bad|horrible|very_horrible|impassable 100 #Zusatzkosten für Oberflächen die eine erhöhte Bodenfreiheit oder Geländebereifung benötigen, schrecklich, sehr schrecklich oder unpasierbar sind + 0 + + +assign costfactor + +# dieser Abschnitt ist für die Kosten in der Ebene + + switch and highway= not route=ferry 10000 # Kosten für alles ohne higway tag außer Fähren + switch or highway=proposed highway=abandoned 10000 # Kosten für geplante oder Wege im Bau + + min 9999 + max 1 + + add onewaypenalty + add accesspenalty + add max surfacepenalty smoothnesspenalty + add flatspeedpenalty + + max 1 + switch highway=motorway|motorway_link 10000 # Kosten für Autobahnen + switch route=ferry 10.67 # Kosten für Fähren + switch highway=trunk|trunk_link add 1 multiply avoidmr2 4 # Kosten für eine autobahnänliche Straße + switch highway=primary|primary_link add 0.7 multiply avoidmr2 1.3 # Kosten für Bundesstraßen + switch highway=secondary|secondary_link 1 # Kosten für Landstraßen + switch highway=tertiary|tertiary_link add 0.7 multiply avoidsr 0.3 # Kosten für Kreisstraßen + switch highway=unclassified add 0.7 multiply avoidsr 0.3 # Kosten für Verbindungsstraßen + switch highway=residential|service add 0.7 multiply avoidsr 0.5 # Kosten für Wohn- und Zufahrtsstraßen + switch highway=track + switch tracktype=grade1 add 0.7 multiply avoidsr 0.5 # Kosten für geteerte, betonierte oder gepflasterte Feldwege + switch tracktype=grade2 multiply avoidbw add 1 multiply avoidsr 6 # Kosten für geschotterte Feldwege + switch tracktype=grade3 multiply avoidbw 40 # Kosten für Feldwege mit weichem Untergrund + switch tracktype=grade4 multiply avoidbw 50 # Kosten für unbefestigte Feldwege + switch tracktype=grade5 multiply avoidbw 50 # Kosten für kaum erkennbare Feldwege + switch surface= multiply avoidbw 20 # Kosten für Feldwege ohne Oberflächenangabe + add 0.7 multiply avoidsr 0.5 # Kosten für Feldwege mit Oberflächenangabe + switch cycleway add 0.58 multiply avoid_cycleways 0.24 # Kosten für Fahrradwege + switch highway=living_street add 2 multiply avoidsr 2 # Kosten für Spielstraßen + switch highway=road add 3 multiply avoidsr 4 # Kosten für noch nicht genauer beschriebene Straße + switch footway 20 # Kosten für Fußwege + switch highway=steps 30 # Kosten für Stufen + switch highway=path + switch surface= multiply avoidbw 40 # Kosten für Pfade ohne Oberflächenangabe + multiply avoidsr add 0.58 multiply avoid_cycleways 0.24 # Kosten für Pfade mit Oberflächenangabe + switch highway=bridleway multiply avoidbw 80 # Kosten für Reitwege + 20 # Kosten für sonstige Wege + +assign uphillcostfactor + +# dieser Abschnitt ist für die Kosten bei Anstiegen +# da er von der Struktur identisch wie der vorherige Abschnitt werde ich die Beschreibung hier nicht wiederholen + + switch and highway= not route=ferry 10000 + switch or highway=proposed highway=abandoned 10000 + + min 9999 + max 1 + + add onewaypenalty + add accesspenalty + add max surfacepenalty smoothnesspenalty + add upspeedpenalty + max 1 + switch highway=motorway|motorway_link 10000 + switch route=ferry 10.67 + switch highway=trunk|trunk_link add 1 multiply avoidmr2 6 + switch highway=primary|primary_link add 0.7 multiply avoidmr2 2.3 + switch highway=secondary|secondary_link add 0.7 multiply avoidmr2 0.5 + switch highway=tertiary|tertiary_link 1 + switch highway=unclassified 1 + switch highway=residential|service add 0.7 multiply avoidsr 0.3 + switch highway=track + switch tracktype=grade1 add 0.7 multiply avoidsr 0.3 + switch tracktype=grade2 multiply avoidbw add 1 multiply avoidsr 2 + switch tracktype=grade3 multiply avoidbw 40 + switch tracktype=grade4 multiply avoidbw 50 + switch tracktype=grade5 multiply avoidbw 50 + switch surface= multiply avoidbw 20 + add 0.7 multiply avoidsr 0.3 + switch cycleway add 0.28 multiply avoid_cycleways 0.24 + switch highway=living_street add 1 multiply avoidsr 1.5 + switch highway=road add 4 multiply avoidsr 6 + switch footway 30 + switch highway=steps 40 + switch highway=path + switch surface= multiply avoidbw 40 + multiply avoidsr add 0.28 multiply avoid_cycleways 0.24 + switch highway=bridleway multiply avoidbw 80 + 20 + +assign downhillcostfactor + +# dieser Abschnitt ist für die Kosten bei Gefälle +# da er von der Struktur identisch wie der vorvorherige Abschnitt werde ich die Beschreibung hier auch nicht wiederholen + + switch and highway= not route=ferry 10000 + switch or highway=proposed highway=abandoned 10000 + + min 9999 + max 1 + + add downspeedpenalty + add onewaypenalty + add accesspenalty + add max smoothnesspenalty surfacepenalty + max 1 + switch highway=motorway|motorway_link 10000 + switch route=ferry 10.67 + switch highway=trunk|trunk_link add 1 multiply avoidmr2 2 + switch highway=primary|primary_link add 0.7 multiply avoidmr2 1.3 + switch highway=secondary|secondary_link 1 + switch highway=tertiary|tertiary_link add 0.5 multiply avoidsr 0.5 + switch highway=unclassified add 0.6 multiply avoidsr 0.6 + switch highway=residential|service add 1 multiply avoidsr 1 + switch highway=track + switch tracktype=grade1 add 1 multiply avoidsr 1 + switch tracktype=grade2 multiply avoidbw add 4 multiply avoidsr 4 + switch tracktype=grade3 multiply avoidbw 40 + switch tracktype=grade4 multiply avoidbw 50 + switch tracktype=grade5 multiply avoidbw 50 + switch surface= multiply avoidbw 20 + add 1 multiply avoidsr 1 + switch cycleway add 0.5 multiply avoid_cycleways 0.5 + switch highway=living_street add 2 multiply avoidsr 6 + switch highway=road add 4 multiply avoidsr 6 + switch footway 30 + switch highway=steps 40 + switch highway=path + switch surface= multiply avoidbw 40 + multiply avoidsr add 0.5 multiply avoid_cycleways 0.5 + switch highway=bridleway multiply avoidbw 80 + 20 + + +# hier kommen Variablen die zur Generierung der Abbiegehinweise benötigt werden + +assign priorityclassifier = + + if ( highway=motorway ) then 30 + else if ( highway=motorway_link ) then 29 + else if ( highway=trunk ) then 28 + else if ( highway=trunk_link ) then 27 + else if ( highway=primary ) then 26 + else if ( highway=primary_link ) then 25 + else if ( highway=secondary ) then 24 + else if ( highway=secondary_link ) then 23 + else if ( highway=tertiary ) then 22 + else if ( highway=tertiary_link ) then 21 + else if ( highway=unclassified ) then 20 + else if ( highway=residential|living_street ) then 6 + else if ( highway=service ) then 6 + else if ( highway=cycleway ) then 6 + else if ( bicycle=designated ) then 6 + else if ( highway=track ) then if tracktype=grade1 then 6 else 4 + else if ( highway=bridleway|road|path|footway ) then 4 + else if ( highway=steps ) then 2 + else if ( highway=pedestrian ) then 2 + else 0 + + + +assign isbadoneway = not equal onewaypenalty 0 +assign isgoodoneway = if reversedirection=yes then oneway=-1 + else if oneway= then junction=roundabout else oneway=yes|true|1 +assign isroundabout = junction=roundabout +assign islinktype = highway=motorway_link|trunk_link|primary_link|secondary_link|tertiary_link +assign isgoodforcars = if greater priorityclassifier 6 then true + else if highway=residential|living_street|service then true + else if ( and highway=track tracktype=grade1 ) then true + else false + +assign classifiermask add isbadoneway + add multiply isgoodoneway 2 + add multiply isroundabout 4 + add multiply islinktype 8 + multiply isgoodforcars 16 + + + +---context:node # following code refers to node tags + +# Parameter für Knotenpunkte +# Kosten an Knotenpunkten in Meter + + +assign defaultaccess + switch access= + 1 # add default barrier restrictions here! + switch or access=private access=no + 0 + 1 + +assign bikeaccess + or nodeaccessgranted=yes + switch bicycle= + switch vehicle= + defaultaccess + switch or vehicle=private vehicle=no + 0 + 1 + switch or bicycle=private and not or highway=crossing ignore_bicycle_no or bicycle=no bicycle=dismount + 0 + 1 + +assign footaccess + or bicycle=dismount + switch foot= + defaultaccess + switch or foot=private foot=no + 0 + 1 + +assign initialcost + add switch highway=traffic_signals 200 # Kosten für Ampel + switch highway=stop 150 # Kosten für Stoppschild + switch railway=crossing|level_crossing 200 # Kosten für Bahnübergang + switch highway=steps switch no_steps 1000000 dismount_cost #Kosten für Stufe + 0 + switch bikeaccess + 0 + switch footaccess + dismount_cost # Kosten fürs Aussteigen + 1000000 #Kosten für verbotene oder private Wege diff --git a/misc/profiles2/vm-forum-velomobil-schnell.brf b/misc/profiles2/vm-forum-velomobil-schnell.brf index 953a3ad..780a5b9 100644 --- a/misc/profiles2/vm-forum-velomobil-schnell.brf +++ b/misc/profiles2/vm-forum-velomobil-schnell.brf @@ -1,460 +1,460 @@ -# -# Profile for fast velomobiles, contributed by http://www.velomobilforum.de - ----context:global - -assign no_steps = true # %no_steps% | keine Stufen, das Velomobil soll nicht getragen werden müssen | boolean -assign no_wrong_oneway = false # %no_wrong oneway% | keine Einbahnstrasse in falsche Richtung, auch nicht schiebend | boolean - -assign dismount_cost = 1000 # %dismount_cost% | Umweg in Meter der in Kauf genommen wird bevor eine Strecke genommen wird bei der man austeigen muss, ab 1 000 000 wird keine Schiebestrecke mehr genommen | number -assign avoid_main_roads = 3 # %avoid_main_roads% | große Straße vermeiden(0-10): 0 = nicht vermeiden, 1 = leicht vermeiden, 3 = Standard, 10 = stark vermeiden | number -assign avoid_small_roads = 5 # %avoid_small_roads% | kleine Straße vermeiden(0-10): 0 = nicht vermeiden, 1 = leicht vermeiden, 5 = Standard, 10 = stark vermeiden | number -assign avoid_cycleways = 8 # %avoid_cycleways% | Radwege vermeiden(0-10): 0 = nicht vermeiden, 1 = leicht vermeiden, 8 = Standard, 10 = stark vermeiden | number -assign avoid_elevation = 5 # %avoid_elevation% | Hohenmeter vermeiden(0-10): 0 = nicht vermeiden, 1 = leicht vermeiden, 5 = Standard, 10 = stark vermeiden | number -assign avoid_bad_ways = 8 # %avoid_bad_ways% | Schlechte Wege vermeiden(0-10): 0 = nicht vermeiden, 1 = leicht vermeiden, 8 = Standard, 10 = stark vermeiden | number - -assign totalMass = 110 # %totalMass% | Gesamtmasse des Fahrzeugs (Fahrzeug, Fahrer, Gepäck...) in kg, für Fahrtzeitschätzung | number -assign maxSpeed = 60 # Maximale Geschwindigkeit ab der der Fahrer bremst in km/h -assign S_C_x = 0.05 # Effektive Stirnfläche in m² -assign C_r = 0.005 # Rollwiderstand -assign bikerPower = 125 # %bikerPower% | Dauerleistung in Watt, für Fahrtzeitschätzung| number - - -assign ignore_bicycle_no = false # %ignore_bicycle_no% | für Regionen mit falschen bicyle=no tags können sie mit "true" ignoriert werden. Auch Shuttletransporte (bicycle=dismount + foot=no) werden geroutet | boolean - - -assign turnInstructionMode = 1 # %turnInstructionMode% | Modus für die Abbiegehinweise | [0=keine, 1=automatische Wahl, 2=locus-Style, 3=osmand-Style, 4=comment-Style, 5=gpsies-Style, 6=orux-Style] -assign turnInstructionCatchingRange 20 # innerhalb dieser Strecke werden mehrere Abiegehinweise zu einem zusammengefasst und die Abiegewinkel werden besser an die generelle Richtung angenähert -assign turnInstructionRoundabouts true # mit "false" werden keine speziellen Abiegehinweise für den Kreisverkehr generiert - -assign avoidmr2 multiply 0.11111111 multiply avoid_main_roads avoid_main_roads -assign avoidsr multiply 0.2 avoid_small_roads -assign avoidbw multiply 0.125 avoid_bad_ways -assign avoid_ele multiply avoid_elevation 0.2 - -assign downhillcost multiply avoid_ele 80 # Kosten für die Höhenmeter bergab -assign downhillcutoff 0.1 # Gefälle unter diesem Wert in Prozent werden nicht gewertet -assign uphillcost multiply avoid_ele 80 # Kosten für die Höhenmeter bergauf -assign uphillcutoff 1 # Steigungen unter diesem Wert in Prozent werden nicht gewertet - -assign validForBikes true # bei true werden die Außnahmen bei den Abbiegebeschränkungen für Fahrräder aktiviert -assign considerTurnRestrictions true # bei false werden die Abbiegebeschränkungen ignoriert - -assign pass1coefficient 3 # Berechnugskoeffizient für erste schnelle Berechnung -assign pass2coefficient 0 # Berechnugskoeffizient für zweite exakte Berechnung -# sinnvolle Werte für den ersten Koeffizienten: -# 1 exakte Berechnung beim ersten Durchlauf -# umso größer die Werte umso schneller und ungenauer die erste Berechnung -# sinnvolle Werte für den zweiten Koeffizienten: -# 0 exakte Berechnung mit Beschränkung des Suchgebiets über die Kosten der ersten Berechnung -# -1 keine zweite Berechnung, nur sinnvoll bei 1 im ersten Durchlauf - -# Um die ungenauen SRTM Höhendaten zu filtern werden für jeweils für Anstiege und Gefälle Puffer verwendet. Erst wenn diese überschritten werden die Segmente als Anstiege oder Gefälle gewertet. - -assign elevationpenaltybuffer 7 # Höhenpuffer (in Meter) ab dem die Höhenstrafen beginnen und das Segment als Anstieg und Gefälle gewertet wird -assign elevationmaxbuffer 13 # Maximale Puffergröße (in Meter), alles darüberhinausgehende wird voll bestraft -assign elevationbufferreduce 1 # im Bereich zwischen elevationpenaltybuffer und elevationmaxbuffer wird eine Höhenstrafe, die einer Steigung oder Gefälle dieses Wertes (in Prozent) entspricht, verhängt und diese Höhenmeter vom Puffer abgezogen. - ----context:way - -# Parameter für die Wege -#zusätzliche Kosten in Meter für jeden Streckenabschnitt - -assign any_cycleroute or route_bicycle_icn=yes or route_bicycle_ncn=yes or route_bicycle_rcn=yes route_bicycle_lcn=yes -assign nodeaccessgranted or any_cycleroute lcn=yes - -assign cycleway - or highway=cycleway and highway=path|footway|pedestrian bicycle=designated|yes - -assign footway - or highway=footway|pedestrian and highway=path foot=designated|yes - -assign turncost - switch junction=roundabout 0 - 150 # Kosten die für eine 90 Grad Abbiegung berechnet werden. Für kleinere Winkel werden sie mit turncost*cos(Winkel) berechnet, bei Kreisverkehr keine weitere Kosten - -assign initialclassifier # hier wird bestimmten Wegen ein Wert zugeordnet und wenn er sich vom vorherigen unterscheidet die initalcost hinzugerechnet - switch route=ferry 2 - switch highway=steps 3 - switch cycleway 4 - switch footway 5 - 1 - -assign initialcost - switch route=ferry 15000 # Kosten wenn eine Fähre verwendet wird - switch highway=steps switch no_steps 1000000 dismount_cost # Kosten für Stufen - switch cycleway multiply 12.5 multiply avoid_cycleways avoid_cycleways # Kosten für Radwege - switch footway dismount_cost # Kosten für Fußwege - 0 - -# Kosten ab hier als Meter für jeden tatsächlichen Meter - -assign oneway - switch oneway= - junction=roundabout - or oneway=yes or oneway=true oneway=1 - -assign onewaypenalty - switch switch reversedirection=yes oneway oneway=-1 - switch or cycleway=opposite or cycleway=opposite_lane or cycleway=opposite_track oneway:bicycle=no 0 #zusätzliche Kosten für in Gegenrichtung für Radfahrer freigegebene Einbahnstraßen in Gegenrichtung - switch no_wrong_oneway 10000 - switch or highway=primary highway=primary_link 50 #zusätzliche Kosten für Bundesstraßen Einbahnstraßen in Gegenrichtung - switch or highway=secondary highway=secondary_link 30 #zusätzliche Kosten für Landstraßen Einbahnstraßen in Gegenrichtung - switch or highway=tertiary highway=tertiary_link 25 #zusätzliche Kosten für Kreisstraßen Einbahnstraßen in Gegenrichtung - 20.0 #zusätzliche Kosten für sonstige Einbahnstraßen in Gegenrichtung - 0.0 - -assign defaultaccess - switch access= - not motorroad=yes - switch or access=private access=no - 0 - 1 - -assign bikeaccess - or any_cycleroute - switch bicycle= - switch vehicle= - defaultaccess - switch or vehicle=private vehicle=no - 0 - 1 - not or bicycle=private or and not ignore_bicycle_no bicycle=no bicycle=dismount - - -assign footaccess - or bikeaccess - or and bicycle=dismount ignore_bicycle_no - switch foot= - defaultaccess - not or foot=private foot=no - -assign accesspenalty - switch bikeaccess - 0 - switch footaccess - 15 #Zusatzkosten fürs Schieben - 10000 #Zusatzkosten für gesperrte oder private Wege - -assign maxspeed_forward - switch maxspeed:forward=50 50 - switch maxspeed:forward=30 30 - switch maxspeed:forward=10 10 - switch maxspeed:forward=20 20 - switch maxspeed:forward=40 40 - switch maxspeed:forward=60 60 - switch maxspeed:forward=70 70 - switch maxspeed:forward=80 80 - switch maxspeed:forward=90 90 - switch maxspeed:forward=100 100 - switch maxspeed:forward=110 110 - switch maxspeed:forward=120 120 - switch maxspeed:forward=130 130 - switch maxspeed:forward=urban 50 - switch maxspeed:forward=rural 100 - 0 - -assign maxspeed_backward - switch maxspeed:backward=50 50 - switch maxspeed:backward=30 30 - switch maxspeed:backward=10 10 - switch maxspeed:backward=20 20 - switch maxspeed:backward=40 40 - switch maxspeed:backward=60 60 - switch maxspeed:backward=70 70 - switch maxspeed:backward=80 80 - switch maxspeed:backward=90 90 - switch maxspeed:backward=100 100 - switch maxspeed:backward=110 110 - switch maxspeed:backward=120 120 - switch maxspeed:backward=130 130 - switch maxspeed:backward=urban 50 - switch maxspeed:backward=rural 100 - 0 - -assign maxspeed - switch and reversedirection=yes maxspeed_backward maxspeed_backward - switch and not reversedirection=yes maxspeed_forward maxspeed_forward - switch maxspeed=50 50 - switch maxspeed=30 30 - switch maxspeed=10 10 - switch maxspeed=20 20 - switch maxspeed=40 40 - switch maxspeed=60 60 - switch maxspeed=70 70 - switch maxspeed=80 80 - switch maxspeed=90 90 - switch maxspeed=100 100 - switch maxspeed=110 110 - switch maxspeed=120 120 - switch maxspeed=130 130 - switch maxspeed=urban 50 - switch maxspeed=rural 100 - 999 - - -assign downspeedpenalty - switch equal maxspeed 10 5 # Zusatzkosten für Geschwindigkeitsbegrenzung 10 km/h bei Gefälle - switch equal maxspeed 20 2 # Zusatzkosten für Geschwindigkeitsbegrenzung 20 km/h bei Gefälle - switch equal maxspeed 30 1 # Zusatzkosten für Geschwindigkeitsbegrenzung 30 km/h bei Gefälle - switch equal maxspeed 40 0.8 # Zusatzkosten für Geschwindigkeitsbegrenzung 40 km/h bei Gefälle - switch equal maxspeed 50 0.5 # Zusatzkosten für Geschwindigkeitsbegrenzung 50 km/h bei Gefälle - 0 - -assign flatspeedpenalty - switch equal maxspeed 10 3 # Zusatzkosten für Geschwindigkeitsbegrenzung 10 km/h in der Ebene - switch equal maxspeed 20 1 # Zusatzkosten für Geschwindigkeitsbegrenzung 20 km/h in der Ebene - switch equal maxspeed 30 0.5 # Zusatzkosten für Geschwindigkeitsbegrenzung 30 km/h in der Ebene - switch equal maxspeed 40 0.3 # Zusatzkosten für Geschwindigkeitsbegrenzung 40 km/h in der Ebene - switch equal maxspeed 50 0.1 # Zusatzkosten für Geschwindigkeitsbegrenzung 50 km/h in der Ebene - 0 - -assign upspeedpenalty - switch equal maxspeed 10 1.5 # Zusatzkosten für Geschwindigkeitsbegrenzung 10 km/h bei Anstiegen - switch equal maxspeed 20 0.4 # Zusatzkosten für Geschwindigkeitsbegrenzung 20 km/h bei Anstiegen - switch equal maxspeed 30 0.1 # Zusatzkosten für Geschwindigkeitsbegrenzung 30 km/h bei Anstiegen - 0 - - -assign surfacepenalty - add switch embedded_rails=tram|yes|rail 20 # Zusatzkosten bei Schienen in der Fahrbahn - 0 - multiply avoidbw - switch surface=asphalt|paved 0 #Zusatzkosten für Teer oder versiegelte Flächen - switch concrete=plates 1 # Zusatzkosten für Betonplattenwege - switch concrete=lanes 5 # Zusatzkosten für Betonspurplatten - switch surface=concrete|paving_stones|wood|metal 0.5 #Zusatzkosten für Beton, Pflastersteine, Holz oder Metall - switch surface=cobblestone|fine_gravel|compacted|sett|grass_paver 5 #Zusatzkosten für Kopfsteinpflaster, Splitt, verdichtete Deckschicht, behauene Pflastersteine oder Rasengittersteine - switch surface=gravel|sand|pebblestone 10 #Zusatzkosten für Schotter, Sand oder Kies - switch surface=ground|grass|unpaved|dirt|earth|mud|clay 50 #Zusatzkosten für naturbelassene Wege, Grasswege, unbefestigte Wege, Schmutzwege, erdige Wege, schlammige Wege oder Lehmwege - 0 - -assign smoothnesspenalty - multiply avoidbw - switch smoothness=excellent|good|very_good 0 #Zusatzkosten für excellente, gute, oder sehr gute Oberflächen - switch smoothness=intermediate|medium 1 #Zusatzkosten für mittelmäßige Oberflächen - switch smoothness=rough|poor 2 #Zusatzkosten für raue oder schlechte Oberflächen - switch smoothness=robust_wheels|bad 10 #Zusatzkosten für Oberflächen die robuste Reifen benötigen oder schlechte Oberflächen - switch smoothness=high_clearance|off_road_wheels|very_bad|horrible|very_horrible|impassable 100 #Zusatzkosten für Oberflächen die eine erhöhte Bodenfreiheit oder Geländebereifung benötigen, schrecklich, sehr schrecklich oder unpasierbar sind - 0 - - -assign costfactor - -# dieser Abschnitt ist für die Kosten in der Ebene - - switch and highway= not route=ferry 10000 # Kosten für alles ohne higway tag außer Fähren - switch or highway=proposed highway=abandoned 10000 # Kosten für geplante oder Wege im Bau - - min 9999 - max 1 - - add onewaypenalty - add accesspenalty - add max surfacepenalty smoothnesspenalty - add flatspeedpenalty - - max 1 - switch highway=motorway|motorway_link 10000 # Kosten für Autobahnen - switch route=ferry 10.67 # Kosten für Fähren - switch highway=trunk|trunk_link add 1 multiply avoidmr2 1.5 # Kosten für eine autobahnänliche Straße - switch highway=primary|primary_link add 0.5 multiply avoidmr2 0.7 # Kosten für Bundesstraßen - switch highway=secondary|secondary_link 1 # Kosten für Landstraßen - switch highway=tertiary|tertiary_link add 0.5 multiply avoidsr 0.6 # Kosten für Kreisstraßen - switch highway=unclassified add 0.5 multiply avoidsr 0.7 # Kosten für Verbindungsstraßen - switch highway=residential|service add 0.7 multiply avoidsr 1 # Kosten für Wohn- und Zufahrtsstraßen - switch highway=track - switch tracktype=grade1 add 1 multiply avoidsr 1.5 # Kosten für geteerte, betonierte oder gepflasterte Feldwege - switch tracktype=grade2 multiply avoidbw add 4 multiply avoidsr 6 # Kosten für geschotterte Feldwege - switch tracktype=grade3 multiply avoidbw 40 # Kosten für Feldwege mit weichem Untergrund - switch tracktype=grade4 multiply avoidbw 50 # Kosten für unbefestigte Feldwege - switch tracktype=grade5 multiply avoidbw 50 # Kosten für kaum erkennbare Feldwege - switch surface= multiply avoidbw 20 # Kosten für Feldwege ohne Oberflächenangabe - add 1 multiply avoidsr 1.5 # Kosten für Feldwege mit Oberflächenangabe - switch cycleway add 0.58 multiply avoid_cycleways 0.24 # Kosten für Fahrradwege - switch highway=living_street add 2 multiply avoidsr 3 # Kosten für Spielstraßen - switch highway=road add 4 multiply avoidsr 6 # Kosten für noch nicht genauer beschriebene Straße - switch footway 30 # Kosten für Fußwege - switch highway=steps 40 # Kosten für Stufen - switch highway=path - switch surface= multiply avoidbw 40 # Kosten für Pfade ohne Oberflächenangabe - add 4 multiply avoidsr 6 # Kosten für Pfade mit Oberflächenangabe - switch highway=bridleway multiply avoidbw 80 # Kosten für Reitwege - 20 # Kosten für sonstige Wege - -assign uphillcostfactor - -# dieser Abschnitt ist für die Kosten bei Anstiegen -# da er von der Struktur identisch wie der vorherige Abschnitt werde ich die Beschreibung hier nicht wiederholen - - switch and highway= not route=ferry 10000 - switch or highway=proposed highway=abandoned 10000 - - min 9999 - max 1 - - add onewaypenalty - add accesspenalty - add max surfacepenalty smoothnesspenalty - add upspeedpenalty - max 1 - switch highway=motorway|motorway_link 10000 - switch route=ferry 10.67 - switch highway=trunk|trunk_link add 1 multiply avoidmr2 5.5 - switch highway=primary|primary_link add 0.5 multiply avoidmr2 2.5 - switch highway=secondary|secondary_link add 0.5 multiply avoidmr2 0.7 - switch highway=tertiary|tertiary_link 1 - switch highway=unclassified 1 - switch highway=residential|service add 0.6 multiply avoidsr 0.9 - switch highway=track - switch tracktype=grade1 add 0.8 multiply avoidsr 1.2 - switch tracktype=grade2 multiply avoidbw add 4 multiply avoidsr 6 - switch tracktype=grade3 multiply avoidbw 40 - switch tracktype=grade4 multiply avoidbw 50 - switch tracktype=grade5 multiply avoidbw 50 - switch surface= multiply avoidbw 20 - add 1 multiply avoidsr 1.5 - switch cycleway add 0.24 multiply avoid_cycleways 0.22 - switch highway=living_street add 2 multiply avoidsr 3 - switch highway=road add 4 multiply avoidsr 6 - switch footway 30 - switch highway=steps 40 - switch highway=path - switch surface= multiply avoidbw 40 - add 4 multiply avoidsr 6 - switch highway=bridleway multiply avoidbw 80 - 20 - -assign downhillcostfactor - -# dieser Abschnitt ist für die Kosten bei Gefälle -# da er von der Struktur identisch wie der vorvorherige Abschnitt werde ich die Beschreibung hier auch nicht wiederholen - - switch and highway= not route=ferry 10000 - switch or highway=proposed highway=abandoned 10000 - - min 9999 - max 1 - - add downspeedpenalty - add onewaypenalty - add accesspenalty - add max smoothnesspenalty surfacepenalty - max 1 - switch highway=motorway|motorway_link 10000 - switch route=ferry 10.67 - switch highway=trunk|trunk_link add 0.5 multiply avoidmr2 1 - switch highway=primary|primary_link add 0.5 multiply avoidmr2 0.5 - switch highway=secondary|secondary_link 1 - switch highway=tertiary|tertiary_link add 0.6 multiply avoidsr 0.9 - switch highway=unclassified add 0.6 multiply avoidsr 1.1 - switch highway=residential|service add 1 multiply avoidsr 1.5 - switch highway=track - switch tracktype=grade1 add 1.8 multiply avoidsr 1.2 - switch tracktype=grade2 multiply avoidbw add 4 multiply avoidsr 6 - switch tracktype=grade3 multiply avoidbw 40 - switch tracktype=grade4 multiply avoidbw 50 - switch tracktype=grade5 multiply avoidbw 50 - switch surface= multiply avoidbw 20 - add 1.8 multiply avoidsr 1.2 - switch cycleway add 0.2 multiply avoid_cycleways 0.6 - switch highway=living_street add 2 multiply avoidsr 6 - switch highway=road add 4 multiply avoidsr 6 - switch footway 30 - switch highway=steps 40 - switch highway=path - switch surface= multiply avoidbw 40 - add 4 multiply avoidsr 6 - switch highway=bridleway multiply avoidbw 80 - 20 - - -# hier kommen Variablen die zur Generierung der Abbiegehinweise benötigt werden - -assign priorityclassifier = - - if ( highway=motorway ) then 30 - else if ( highway=motorway_link ) then 29 - else if ( highway=trunk ) then 28 - else if ( highway=trunk_link ) then 27 - else if ( highway=primary ) then 26 - else if ( highway=primary_link ) then 25 - else if ( highway=secondary ) then 24 - else if ( highway=secondary_link ) then 23 - else if ( highway=tertiary ) then 22 - else if ( highway=tertiary_link ) then 21 - else if ( highway=unclassified ) then 20 - else if ( highway=residential|living_street ) then 6 - else if ( highway=service ) then 6 - else if ( highway=cycleway ) then 6 - else if ( bicycle=designated ) then 6 - else if ( highway=track ) then if tracktype=grade1 then 6 else 4 - else if ( highway=bridleway|road|path|footway ) then 4 - else if ( highway=steps ) then 2 - else if ( highway=pedestrian ) then 2 - else 0 - - - -assign isbadoneway = not equal onewaypenalty 0 -assign isgoodoneway = if reversedirection=yes then oneway=-1 - else if oneway= then junction=roundabout else oneway=yes|true|1 -assign isroundabout = junction=roundabout -assign islinktype = highway=motorway_link|trunk_link|primary_link|secondary_link|tertiary_link -assign isgoodforcars = if greater priorityclassifier 6 then true - else if highway=residential|living_street|service then true - else if ( and highway=track tracktype=grade1 ) then true - else false - -assign classifiermask add isbadoneway - add multiply isgoodoneway 2 - add multiply isroundabout 4 - add multiply islinktype 8 - multiply isgoodforcars 16 - - - ----context:node # following code refers to node tags - -# Parameter für Knotenpunkte -# Kosten an Knotenpunkten in Meter - - -assign defaultaccess - switch access= - 1 # add default barrier restrictions here! - switch or access=private access=no - 0 - 1 - -assign bikeaccess - or nodeaccessgranted=yes - switch bicycle= - switch vehicle= - defaultaccess - switch or vehicle=private vehicle=no - 0 - 1 - switch or bicycle=private and not or highway=crossing ignore_bicycle_no or bicycle=no bicycle=dismount - 0 - 1 - -assign footaccess - or bicycle=dismount - switch foot= - defaultaccess - switch or foot=private foot=no - 0 - 1 - -assign initialcost - add switch highway=traffic_signals 250 # Kosten für Ampel - switch highway=stop 250 # Kosten für Stoppschild - switch railway=crossing|level_crossing 350 # Kosten für Bahnübergang - switch highway=steps switch no_steps 1000000 dismount_cost #Kosten für Stufe - 0 - switch bikeaccess - 0 - switch footaccess - dismount_cost # Kosten fürs Aussteigen - 1000000 #Kosten für verbotene oder private Wege \ No newline at end of file +# +# Profile for fast velomobiles, contributed by http://www.velomobilforum.de + +---context:global + +assign no_steps = true # %no_steps% | keine Stufen, das Velomobil soll nicht getragen werden müssen | boolean +assign no_wrong_oneway = false # %no_wrong oneway% | keine Einbahnstrasse in falsche Richtung, auch nicht schiebend | boolean + +assign dismount_cost = 1000 # %dismount_cost% | Umweg in Meter der in Kauf genommen wird bevor eine Strecke genommen wird bei der man austeigen muss, ab 1 000 000 wird keine Schiebestrecke mehr genommen | number +assign avoid_main_roads = 3 # %avoid_main_roads% | große Straße vermeiden(0-10): 0 = nicht vermeiden, 1 = leicht vermeiden, 3 = Standard, 10 = stark vermeiden | number +assign avoid_small_roads = 5 # %avoid_small_roads% | kleine Straße vermeiden(0-10): 0 = nicht vermeiden, 1 = leicht vermeiden, 5 = Standard, 10 = stark vermeiden | number +assign avoid_cycleways = 8 # %avoid_cycleways% | Radwege vermeiden(0-10): 0 = nicht vermeiden, 1 = leicht vermeiden, 8 = Standard, 10 = stark vermeiden | number +assign avoid_elevation = 5 # %avoid_elevation% | Hohenmeter vermeiden(0-10): 0 = nicht vermeiden, 1 = leicht vermeiden, 5 = Standard, 10 = stark vermeiden | number +assign avoid_bad_ways = 8 # %avoid_bad_ways% | Schlechte Wege vermeiden(0-10): 0 = nicht vermeiden, 1 = leicht vermeiden, 8 = Standard, 10 = stark vermeiden | number + +assign totalMass = 110 # %totalMass% | Gesamtmasse des Fahrzeugs (Fahrzeug, Fahrer, Gepäck...) in kg, für Fahrtzeitschätzung | number +assign maxSpeed = 60 # Maximale Geschwindigkeit ab der der Fahrer bremst in km/h +assign S_C_x = 0.05 # Effektive Stirnfläche in m² +assign C_r = 0.005 # Rollwiderstand +assign bikerPower = 125 # %bikerPower% | Dauerleistung in Watt, für Fahrtzeitschätzung| number + + +assign ignore_bicycle_no = false # %ignore_bicycle_no% | für Regionen mit falschen bicyle=no tags können sie mit "true" ignoriert werden. Auch Shuttletransporte (bicycle=dismount + foot=no) werden geroutet | boolean + + +assign turnInstructionMode = 1 # %turnInstructionMode% | Modus für die Abbiegehinweise | [0=keine, 1=automatische Wahl, 2=locus-Style, 3=osmand-Style, 4=comment-Style, 5=gpsies-Style, 6=orux-Style, 7=locus-old-Style] +assign turnInstructionCatchingRange 20 # innerhalb dieser Strecke werden mehrere Abiegehinweise zu einem zusammengefasst und die Abiegewinkel werden besser an die generelle Richtung angenähert +assign turnInstructionRoundabouts true # mit "false" werden keine speziellen Abiegehinweise für den Kreisverkehr generiert + +assign avoidmr2 multiply 0.11111111 multiply avoid_main_roads avoid_main_roads +assign avoidsr multiply 0.2 avoid_small_roads +assign avoidbw multiply 0.125 avoid_bad_ways +assign avoid_ele multiply avoid_elevation 0.2 + +assign downhillcost multiply avoid_ele 80 # Kosten für die Höhenmeter bergab +assign downhillcutoff 0.1 # Gefälle unter diesem Wert in Prozent werden nicht gewertet +assign uphillcost multiply avoid_ele 80 # Kosten für die Höhenmeter bergauf +assign uphillcutoff 1 # Steigungen unter diesem Wert in Prozent werden nicht gewertet + +assign validForBikes true # bei true werden die Außnahmen bei den Abbiegebeschränkungen für Fahrräder aktiviert +assign considerTurnRestrictions true # bei false werden die Abbiegebeschränkungen ignoriert + +assign pass1coefficient 3 # Berechnugskoeffizient für erste schnelle Berechnung +assign pass2coefficient 0 # Berechnugskoeffizient für zweite exakte Berechnung +# sinnvolle Werte für den ersten Koeffizienten: +# 1 exakte Berechnung beim ersten Durchlauf +# umso größer die Werte umso schneller und ungenauer die erste Berechnung +# sinnvolle Werte für den zweiten Koeffizienten: +# 0 exakte Berechnung mit Beschränkung des Suchgebiets über die Kosten der ersten Berechnung +# -1 keine zweite Berechnung, nur sinnvoll bei 1 im ersten Durchlauf + +# Um die ungenauen SRTM Höhendaten zu filtern werden für jeweils für Anstiege und Gefälle Puffer verwendet. Erst wenn diese überschritten werden die Segmente als Anstiege oder Gefälle gewertet. + +assign elevationpenaltybuffer 7 # Höhenpuffer (in Meter) ab dem die Höhenstrafen beginnen und das Segment als Anstieg und Gefälle gewertet wird +assign elevationmaxbuffer 13 # Maximale Puffergröße (in Meter), alles darüberhinausgehende wird voll bestraft +assign elevationbufferreduce 1 # im Bereich zwischen elevationpenaltybuffer und elevationmaxbuffer wird eine Höhenstrafe, die einer Steigung oder Gefälle dieses Wertes (in Prozent) entspricht, verhängt und diese Höhenmeter vom Puffer abgezogen. + +---context:way + +# Parameter für die Wege +#zusätzliche Kosten in Meter für jeden Streckenabschnitt + +assign any_cycleroute or route_bicycle_icn=yes or route_bicycle_ncn=yes or route_bicycle_rcn=yes route_bicycle_lcn=yes +assign nodeaccessgranted or any_cycleroute lcn=yes + +assign cycleway + or highway=cycleway and highway=path|footway|pedestrian bicycle=designated|yes + +assign footway + or highway=footway|pedestrian and highway=path foot=designated|yes + +assign turncost + switch junction=roundabout 0 + 150 # Kosten die für eine 90 Grad Abbiegung berechnet werden. Für kleinere Winkel werden sie mit turncost*cos(Winkel) berechnet, bei Kreisverkehr keine weitere Kosten + +assign initialclassifier # hier wird bestimmten Wegen ein Wert zugeordnet und wenn er sich vom vorherigen unterscheidet die initalcost hinzugerechnet + switch route=ferry 2 + switch highway=steps 3 + switch cycleway 4 + switch footway 5 + 1 + +assign initialcost + switch route=ferry 15000 # Kosten wenn eine Fähre verwendet wird + switch highway=steps switch no_steps 1000000 dismount_cost # Kosten für Stufen + switch cycleway multiply 12.5 multiply avoid_cycleways avoid_cycleways # Kosten für Radwege + switch footway dismount_cost # Kosten für Fußwege + 0 + +# Kosten ab hier als Meter für jeden tatsächlichen Meter + +assign oneway + switch oneway= + junction=roundabout + or oneway=yes or oneway=true oneway=1 + +assign onewaypenalty + switch switch reversedirection=yes oneway oneway=-1 + switch or cycleway=opposite or cycleway=opposite_lane or cycleway=opposite_track oneway:bicycle=no 0 #zusätzliche Kosten für in Gegenrichtung für Radfahrer freigegebene Einbahnstraßen in Gegenrichtung + switch no_wrong_oneway 10000 + switch or highway=primary highway=primary_link 50 #zusätzliche Kosten für Bundesstraßen Einbahnstraßen in Gegenrichtung + switch or highway=secondary highway=secondary_link 30 #zusätzliche Kosten für Landstraßen Einbahnstraßen in Gegenrichtung + switch or highway=tertiary highway=tertiary_link 25 #zusätzliche Kosten für Kreisstraßen Einbahnstraßen in Gegenrichtung + 20.0 #zusätzliche Kosten für sonstige Einbahnstraßen in Gegenrichtung + 0.0 + +assign defaultaccess + switch access= + not motorroad=yes + switch or access=private access=no + 0 + 1 + +assign bikeaccess + or any_cycleroute + switch bicycle= + switch vehicle= + defaultaccess + switch or vehicle=private vehicle=no + 0 + 1 + not or bicycle=private or and not ignore_bicycle_no bicycle=no bicycle=dismount + + +assign footaccess + or bikeaccess + or and bicycle=dismount ignore_bicycle_no + switch foot= + defaultaccess + not or foot=private foot=no + +assign accesspenalty + switch bikeaccess + 0 + switch footaccess + 15 #Zusatzkosten fürs Schieben + 10000 #Zusatzkosten für gesperrte oder private Wege + +assign maxspeed_forward + switch maxspeed:forward=50 50 + switch maxspeed:forward=30 30 + switch maxspeed:forward=10 10 + switch maxspeed:forward=20 20 + switch maxspeed:forward=40 40 + switch maxspeed:forward=60 60 + switch maxspeed:forward=70 70 + switch maxspeed:forward=80 80 + switch maxspeed:forward=90 90 + switch maxspeed:forward=100 100 + switch maxspeed:forward=110 110 + switch maxspeed:forward=120 120 + switch maxspeed:forward=130 130 + switch maxspeed:forward=urban 50 + switch maxspeed:forward=rural 100 + 0 + +assign maxspeed_backward + switch maxspeed:backward=50 50 + switch maxspeed:backward=30 30 + switch maxspeed:backward=10 10 + switch maxspeed:backward=20 20 + switch maxspeed:backward=40 40 + switch maxspeed:backward=60 60 + switch maxspeed:backward=70 70 + switch maxspeed:backward=80 80 + switch maxspeed:backward=90 90 + switch maxspeed:backward=100 100 + switch maxspeed:backward=110 110 + switch maxspeed:backward=120 120 + switch maxspeed:backward=130 130 + switch maxspeed:backward=urban 50 + switch maxspeed:backward=rural 100 + 0 + +assign maxspeed + switch and reversedirection=yes maxspeed_backward maxspeed_backward + switch and not reversedirection=yes maxspeed_forward maxspeed_forward + switch maxspeed=50 50 + switch maxspeed=30 30 + switch maxspeed=10 10 + switch maxspeed=20 20 + switch maxspeed=40 40 + switch maxspeed=60 60 + switch maxspeed=70 70 + switch maxspeed=80 80 + switch maxspeed=90 90 + switch maxspeed=100 100 + switch maxspeed=110 110 + switch maxspeed=120 120 + switch maxspeed=130 130 + switch maxspeed=urban 50 + switch maxspeed=rural 100 + 999 + + +assign downspeedpenalty + switch equal maxspeed 10 5 # Zusatzkosten für Geschwindigkeitsbegrenzung 10 km/h bei Gefälle + switch equal maxspeed 20 2 # Zusatzkosten für Geschwindigkeitsbegrenzung 20 km/h bei Gefälle + switch equal maxspeed 30 1 # Zusatzkosten für Geschwindigkeitsbegrenzung 30 km/h bei Gefälle + switch equal maxspeed 40 0.8 # Zusatzkosten für Geschwindigkeitsbegrenzung 40 km/h bei Gefälle + switch equal maxspeed 50 0.5 # Zusatzkosten für Geschwindigkeitsbegrenzung 50 km/h bei Gefälle + 0 + +assign flatspeedpenalty + switch equal maxspeed 10 3 # Zusatzkosten für Geschwindigkeitsbegrenzung 10 km/h in der Ebene + switch equal maxspeed 20 1 # Zusatzkosten für Geschwindigkeitsbegrenzung 20 km/h in der Ebene + switch equal maxspeed 30 0.5 # Zusatzkosten für Geschwindigkeitsbegrenzung 30 km/h in der Ebene + switch equal maxspeed 40 0.3 # Zusatzkosten für Geschwindigkeitsbegrenzung 40 km/h in der Ebene + switch equal maxspeed 50 0.1 # Zusatzkosten für Geschwindigkeitsbegrenzung 50 km/h in der Ebene + 0 + +assign upspeedpenalty + switch equal maxspeed 10 1.5 # Zusatzkosten für Geschwindigkeitsbegrenzung 10 km/h bei Anstiegen + switch equal maxspeed 20 0.4 # Zusatzkosten für Geschwindigkeitsbegrenzung 20 km/h bei Anstiegen + switch equal maxspeed 30 0.1 # Zusatzkosten für Geschwindigkeitsbegrenzung 30 km/h bei Anstiegen + 0 + + +assign surfacepenalty + add switch embedded_rails=tram|yes|rail 20 # Zusatzkosten bei Schienen in der Fahrbahn + 0 + multiply avoidbw + switch surface=asphalt|paved 0 #Zusatzkosten für Teer oder versiegelte Flächen + switch concrete=plates 1 # Zusatzkosten für Betonplattenwege + switch concrete=lanes 5 # Zusatzkosten für Betonspurplatten + switch surface=concrete|paving_stones|wood|metal 0.5 #Zusatzkosten für Beton, Pflastersteine, Holz oder Metall + switch surface=cobblestone|fine_gravel|compacted|sett|grass_paver 5 #Zusatzkosten für Kopfsteinpflaster, Splitt, verdichtete Deckschicht, behauene Pflastersteine oder Rasengittersteine + switch surface=gravel|sand|pebblestone 10 #Zusatzkosten für Schotter, Sand oder Kies + switch surface=ground|grass|unpaved|dirt|earth|mud|clay 50 #Zusatzkosten für naturbelassene Wege, Grasswege, unbefestigte Wege, Schmutzwege, erdige Wege, schlammige Wege oder Lehmwege + 0 + +assign smoothnesspenalty + multiply avoidbw + switch smoothness=excellent|good|very_good 0 #Zusatzkosten für excellente, gute, oder sehr gute Oberflächen + switch smoothness=intermediate|medium 1 #Zusatzkosten für mittelmäßige Oberflächen + switch smoothness=rough|poor 2 #Zusatzkosten für raue oder schlechte Oberflächen + switch smoothness=robust_wheels|bad 10 #Zusatzkosten für Oberflächen die robuste Reifen benötigen oder schlechte Oberflächen + switch smoothness=high_clearance|off_road_wheels|very_bad|horrible|very_horrible|impassable 100 #Zusatzkosten für Oberflächen die eine erhöhte Bodenfreiheit oder Geländebereifung benötigen, schrecklich, sehr schrecklich oder unpasierbar sind + 0 + + +assign costfactor + +# dieser Abschnitt ist für die Kosten in der Ebene + + switch and highway= not route=ferry 10000 # Kosten für alles ohne higway tag außer Fähren + switch or highway=proposed highway=abandoned 10000 # Kosten für geplante oder Wege im Bau + + min 9999 + max 1 + + add onewaypenalty + add accesspenalty + add max surfacepenalty smoothnesspenalty + add flatspeedpenalty + + max 1 + switch highway=motorway|motorway_link 10000 # Kosten für Autobahnen + switch route=ferry 10.67 # Kosten für Fähren + switch highway=trunk|trunk_link add 1 multiply avoidmr2 1.5 # Kosten für eine autobahnänliche Straße + switch highway=primary|primary_link add 0.5 multiply avoidmr2 0.7 # Kosten für Bundesstraßen + switch highway=secondary|secondary_link 1 # Kosten für Landstraßen + switch highway=tertiary|tertiary_link add 0.5 multiply avoidsr 0.6 # Kosten für Kreisstraßen + switch highway=unclassified add 0.5 multiply avoidsr 0.7 # Kosten für Verbindungsstraßen + switch highway=residential|service add 0.7 multiply avoidsr 1 # Kosten für Wohn- und Zufahrtsstraßen + switch highway=track + switch tracktype=grade1 add 1 multiply avoidsr 1.5 # Kosten für geteerte, betonierte oder gepflasterte Feldwege + switch tracktype=grade2 multiply avoidbw add 4 multiply avoidsr 6 # Kosten für geschotterte Feldwege + switch tracktype=grade3 multiply avoidbw 40 # Kosten für Feldwege mit weichem Untergrund + switch tracktype=grade4 multiply avoidbw 50 # Kosten für unbefestigte Feldwege + switch tracktype=grade5 multiply avoidbw 50 # Kosten für kaum erkennbare Feldwege + switch surface= multiply avoidbw 20 # Kosten für Feldwege ohne Oberflächenangabe + add 1 multiply avoidsr 1.5 # Kosten für Feldwege mit Oberflächenangabe + switch cycleway add 0.58 multiply avoid_cycleways 0.24 # Kosten für Fahrradwege + switch highway=living_street add 2 multiply avoidsr 3 # Kosten für Spielstraßen + switch highway=road add 4 multiply avoidsr 6 # Kosten für noch nicht genauer beschriebene Straße + switch footway 30 # Kosten für Fußwege + switch highway=steps 40 # Kosten für Stufen + switch highway=path + switch surface= multiply avoidbw 40 # Kosten für Pfade ohne Oberflächenangabe + add 4 multiply avoidsr 6 # Kosten für Pfade mit Oberflächenangabe + switch highway=bridleway multiply avoidbw 80 # Kosten für Reitwege + 20 # Kosten für sonstige Wege + +assign uphillcostfactor + +# dieser Abschnitt ist für die Kosten bei Anstiegen +# da er von der Struktur identisch wie der vorherige Abschnitt werde ich die Beschreibung hier nicht wiederholen + + switch and highway= not route=ferry 10000 + switch or highway=proposed highway=abandoned 10000 + + min 9999 + max 1 + + add onewaypenalty + add accesspenalty + add max surfacepenalty smoothnesspenalty + add upspeedpenalty + max 1 + switch highway=motorway|motorway_link 10000 + switch route=ferry 10.67 + switch highway=trunk|trunk_link add 1 multiply avoidmr2 5.5 + switch highway=primary|primary_link add 0.5 multiply avoidmr2 2.5 + switch highway=secondary|secondary_link add 0.5 multiply avoidmr2 0.7 + switch highway=tertiary|tertiary_link 1 + switch highway=unclassified 1 + switch highway=residential|service add 0.6 multiply avoidsr 0.9 + switch highway=track + switch tracktype=grade1 add 0.8 multiply avoidsr 1.2 + switch tracktype=grade2 multiply avoidbw add 4 multiply avoidsr 6 + switch tracktype=grade3 multiply avoidbw 40 + switch tracktype=grade4 multiply avoidbw 50 + switch tracktype=grade5 multiply avoidbw 50 + switch surface= multiply avoidbw 20 + add 1 multiply avoidsr 1.5 + switch cycleway add 0.24 multiply avoid_cycleways 0.22 + switch highway=living_street add 2 multiply avoidsr 3 + switch highway=road add 4 multiply avoidsr 6 + switch footway 30 + switch highway=steps 40 + switch highway=path + switch surface= multiply avoidbw 40 + add 4 multiply avoidsr 6 + switch highway=bridleway multiply avoidbw 80 + 20 + +assign downhillcostfactor + +# dieser Abschnitt ist für die Kosten bei Gefälle +# da er von der Struktur identisch wie der vorvorherige Abschnitt werde ich die Beschreibung hier auch nicht wiederholen + + switch and highway= not route=ferry 10000 + switch or highway=proposed highway=abandoned 10000 + + min 9999 + max 1 + + add downspeedpenalty + add onewaypenalty + add accesspenalty + add max smoothnesspenalty surfacepenalty + max 1 + switch highway=motorway|motorway_link 10000 + switch route=ferry 10.67 + switch highway=trunk|trunk_link add 0.5 multiply avoidmr2 1 + switch highway=primary|primary_link add 0.5 multiply avoidmr2 0.5 + switch highway=secondary|secondary_link 1 + switch highway=tertiary|tertiary_link add 0.6 multiply avoidsr 0.9 + switch highway=unclassified add 0.6 multiply avoidsr 1.1 + switch highway=residential|service add 1 multiply avoidsr 1.5 + switch highway=track + switch tracktype=grade1 add 1.8 multiply avoidsr 1.2 + switch tracktype=grade2 multiply avoidbw add 4 multiply avoidsr 6 + switch tracktype=grade3 multiply avoidbw 40 + switch tracktype=grade4 multiply avoidbw 50 + switch tracktype=grade5 multiply avoidbw 50 + switch surface= multiply avoidbw 20 + add 1.8 multiply avoidsr 1.2 + switch cycleway add 0.2 multiply avoid_cycleways 0.6 + switch highway=living_street add 2 multiply avoidsr 6 + switch highway=road add 4 multiply avoidsr 6 + switch footway 30 + switch highway=steps 40 + switch highway=path + switch surface= multiply avoidbw 40 + add 4 multiply avoidsr 6 + switch highway=bridleway multiply avoidbw 80 + 20 + + +# hier kommen Variablen die zur Generierung der Abbiegehinweise benötigt werden + +assign priorityclassifier = + + if ( highway=motorway ) then 30 + else if ( highway=motorway_link ) then 29 + else if ( highway=trunk ) then 28 + else if ( highway=trunk_link ) then 27 + else if ( highway=primary ) then 26 + else if ( highway=primary_link ) then 25 + else if ( highway=secondary ) then 24 + else if ( highway=secondary_link ) then 23 + else if ( highway=tertiary ) then 22 + else if ( highway=tertiary_link ) then 21 + else if ( highway=unclassified ) then 20 + else if ( highway=residential|living_street ) then 6 + else if ( highway=service ) then 6 + else if ( highway=cycleway ) then 6 + else if ( bicycle=designated ) then 6 + else if ( highway=track ) then if tracktype=grade1 then 6 else 4 + else if ( highway=bridleway|road|path|footway ) then 4 + else if ( highway=steps ) then 2 + else if ( highway=pedestrian ) then 2 + else 0 + + + +assign isbadoneway = not equal onewaypenalty 0 +assign isgoodoneway = if reversedirection=yes then oneway=-1 + else if oneway= then junction=roundabout else oneway=yes|true|1 +assign isroundabout = junction=roundabout +assign islinktype = highway=motorway_link|trunk_link|primary_link|secondary_link|tertiary_link +assign isgoodforcars = if greater priorityclassifier 6 then true + else if highway=residential|living_street|service then true + else if ( and highway=track tracktype=grade1 ) then true + else false + +assign classifiermask add isbadoneway + add multiply isgoodoneway 2 + add multiply isroundabout 4 + add multiply islinktype 8 + multiply isgoodforcars 16 + + + +---context:node # following code refers to node tags + +# Parameter für Knotenpunkte +# Kosten an Knotenpunkten in Meter + + +assign defaultaccess + switch access= + 1 # add default barrier restrictions here! + switch or access=private access=no + 0 + 1 + +assign bikeaccess + or nodeaccessgranted=yes + switch bicycle= + switch vehicle= + defaultaccess + switch or vehicle=private vehicle=no + 0 + 1 + switch or bicycle=private and not or highway=crossing ignore_bicycle_no or bicycle=no bicycle=dismount + 0 + 1 + +assign footaccess + or bicycle=dismount + switch foot= + defaultaccess + switch or foot=private foot=no + 0 + 1 + +assign initialcost + add switch highway=traffic_signals 250 # Kosten für Ampel + switch highway=stop 250 # Kosten für Stoppschild + switch railway=crossing|level_crossing 350 # Kosten für Bahnübergang + switch highway=steps switch no_steps 1000000 dismount_cost #Kosten für Stufe + 0 + switch bikeaccess + 0 + switch footaccess + dismount_cost # Kosten fürs Aussteigen + 1000000 #Kosten für verbotene oder private Wege From 7e581ccb9e154ad967914a86a06a12a1a6c77124 Mon Sep 17 00:00:00 2001 From: afischerdev Date: Mon, 6 Mar 2023 18:29:40 +0100 Subject: [PATCH 5/7] fix elev at last pt --- brouter-core/src/main/java/btools/router/RoutingEngine.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/brouter-core/src/main/java/btools/router/RoutingEngine.java b/brouter-core/src/main/java/btools/router/RoutingEngine.java index 7ddc011..125aa4b 100644 --- a/brouter-core/src/main/java/btools/router/RoutingEngine.java +++ b/brouter-core/src/main/java/btools/router/RoutingEngine.java @@ -246,9 +246,10 @@ public class RoutingEngine extends Thread { int startIdx = 0; int endIdx = -1; int dist = 0; - for (int idx = 0; idx < track.nodes.size(); idx++) { + 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) { + 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(); From 59199d73398e7f4dcc073557a3b69eef4b57c65e Mon Sep 17 00:00:00 2001 From: afischerdev Date: Mon, 6 Mar 2023 18:33:20 +0100 Subject: [PATCH 6/7] add new vh tags for output --- .../main/java/btools/router/VoiceHint.java | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/brouter-core/src/main/java/btools/router/VoiceHint.java b/brouter-core/src/main/java/btools/router/VoiceHint.java index 5c8386d..90b34c1 100644 --- a/brouter-core/src/main/java/btools/router/VoiceHint.java +++ b/brouter-core/src/main/java/btools/router/VoiceHint.java @@ -102,6 +102,10 @@ public class VoiceHint { return "RNDB" + roundaboutExit; case RNLB: return "RNLB" + (-roundaboutExit); + case BL: + return "BL"; + case OFFR: + return "OFFR"; default: throw new IllegalArgumentException("unknown command: " + cmd); } @@ -140,6 +144,10 @@ public class VoiceHint { return "RNDB" + roundaboutExit; case RNLB: return "RNLB" + (-roundaboutExit); + case BL: + return "BL"; + case OFFR: + return "OFFR"; default: return "unknown command: " + c; } @@ -178,6 +186,10 @@ public class VoiceHint { return "RNDB" + roundaboutExit; case RNLB: return "RNLB" + (-roundaboutExit); + case BL: + return "BL"; + case OFFR: + return "OFFR"; default: throw new IllegalArgumentException("unknown command: " + cmd); } @@ -372,6 +384,8 @@ public class VoiceHint { return "RNLB" + (-roundaboutExit); case BL: return "BL"; + case OFFR: + return "OFFR"; default: throw new IllegalArgumentException("unknown command: " + cmd); } @@ -407,11 +421,13 @@ public class VoiceHint { case TRU: return "u-turn right"; case RNDB: - return "Take exit " + roundaboutExit; + return "take exit " + roundaboutExit; case RNLB: - return "Take exit " + (-roundaboutExit); + return "take exit " + (-roundaboutExit); case BL: - return "Beeline"; + return "beeline"; + case OFFR: + return "offroad"; default: throw new IllegalArgumentException("unknown command: " + cmd); } From e49e039d735a8f80e7cf3969f8c94854da1735bc Mon Sep 17 00:00:00 2001 From: afischerdev Date: Mon, 6 Mar 2023 18:39:35 +0100 Subject: [PATCH 7/7] clean up gpx outputs --- .../src/main/java/btools/router/OsmTrack.java | 238 ++++++++++-------- 1 file changed, 137 insertions(+), 101 deletions(-) diff --git a/brouter-core/src/main/java/btools/router/OsmTrack.java b/brouter-core/src/main/java/btools/router/OsmTrack.java index fd36362..c57836a 100644 --- a/brouter-core/src/main/java/btools/router/OsmTrack.java +++ b/brouter-core/src/main/java/btools/router/OsmTrack.java @@ -627,6 +627,8 @@ public final class OsmTrack { sb.append(" \n"); } + + // all points sb.append(" \n"); String lastway = ""; boolean bNextDirect = false; @@ -644,108 +646,57 @@ public final class OsmTrack { } boolean bNeedHeader = false; - if (turnInstructionMode == 9 || turnInstructionMode == 2) // trkpt/sym style // locus style new - { - if (hint != null) { - if (turnInstructionMode == 9) { - if (mwpt != null && !mwpt.name.startsWith("via")) { - sele += "" + mwpt.name + ""; - } - sele += "" + hint.getMessageString() + ""; - sele += "" + hint.getCommandString(hint.cmd) + ""; - sele += ""; - if (showspeed) { - double speed = 0; - if (nn != null) { - int dist = n.calcDistance(nn); - float dt = n.getTime() - nn.getTime(); - if (dt != 0.f) { - speed = ((3.6f * dist) / dt + 0.5); - } - } - sele += "" + (((int) (speed * 10)) / 10.f) + ""; - } + if (turnInstructionMode == 9) { // trkpt/sym style - sele += "" + hint.getCommandString() + ";" + (int) (hint.distanceToNext) + "," + hint.formatGeometry() + ""; - if (n.message != null && n.message.wayKeyValues != null && !n.message.wayKeyValues.equals(lastway)) { - sele += "" + n.message.wayKeyValues + ""; - lastway = n.message.wayKeyValues; - } - if (n.message != null && n.message.nodeKeyValues != null) { - sele += "" + n.message.nodeKeyValues + ""; - } - sele += ""; - } else if (turnInstructionMode == 2) { - sele += "" + hint.getLocusSymbolString() + ""; + if (hint != null) { + + if (mwpt != null && + !mwpt.name.startsWith("via") && !mwpt.name.startsWith("from") && !mwpt.name.startsWith("end")) { + sele += "" + mwpt.name + ""; } - } - if (idx == 0) { - if (turnInstructionMode == 2) { - int pos = sele.indexOf(""; - if (mwpt != null && mwpt.direct) { - bNextDirect = true; - } - sele += "pass_place"; - sele += "Via"; - } else { - if (mwpt != null && mwpt.direct) { - sele += "beeline"; - } else { - sele += "start"; - } - sele += "Via"; - } - } else if (idx == nodes.size() - 1) { - if (turnInstructionMode == 2) { - int pos = sele.indexOf(""; - if (bNextDirect) { - sele += "beeline"; - } - sele += "pass_place"; - sele += "Via"; - } else { - sele += "end"; - sele += "Via"; - } - } else if (turnInstructionMode == 2) { + sele += "" + hint.getCruiserMessageString() + ""; + sele += "" + hint.getCommandString(hint.cmd) + ""; if (mwpt != null) { - if (sele.contains("sym") && - !sele.contains("name") && - !mwpt.name.startsWith("via")) { - 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) { - sele += "beelinepass_placeShaping"; - bNextDirect = true; - } else if (mwpt.direct) { - sele += "pass_placeShaping"; - bNextDirect = true; - } else if (mwpt.name.startsWith("via")) { - if (bNextDirect) { - sele += "beelinepass_placeShaping"; - } else { - sele += "pass_placeShaping"; - } - bNextDirect = false; - } else { - sele += "" + mwpt.name + ""; - sele += "pass_placeVia"; - } + sele += "Via"; } - } else if (turnInstructionMode == 9) { + sele += ""; + if (showspeed) { + double speed = 0; + if (nn != null) { + int dist = n.calcDistance(nn); + float dt = n.getTime() - nn.getTime(); + if (dt != 0.f) { + speed = ((3.6f * dist) / dt + 0.5); + } + } + sele += "" + (((int) (speed * 10)) / 10.f) + ""; + } + + sele += "" + hint.getCommandString() + ";" + (int) (hint.distanceToNext) + "," + hint.formatGeometry() + ""; + if (n.message != null && n.message.wayKeyValues != null && !n.message.wayKeyValues.equals(lastway)) { + sele += "" + n.message.wayKeyValues + ""; + lastway = n.message.wayKeyValues; + } + if (n.message != null && n.message.nodeKeyValues != null) { + sele += "" + n.message.nodeKeyValues + ""; + } + sele += ""; + + } + if (idx == 0 && hint == null) { + if (mwpt != null && mwpt.direct) { + sele += "beeline"; + } else { + sele += "start"; + } + sele += "Via"; + + } else if (idx == nodes.size() - 1 && hint == null) { + + sele += "end"; + sele += "Via"; + + } else { if (mwpt != null && hint == null) { if (mwpt.direct) { // bNextDirect = true; @@ -759,7 +710,7 @@ public final class OsmTrack { } - if (turnInstructionMode == 9 && hint == null) { + if (hint == null) { bNeedHeader = (showspeed || (n.message != null && n.message.wayKeyValues != null && !n.message.wayKeyValues.equals(lastway))) || (n.message != null && n.message.nodeKeyValues != null); if (bNeedHeader) { @@ -786,6 +737,88 @@ public final class OsmTrack { } } } + + if (turnInstructionMode == 2) { // locus style new + if (hint != null) { + if (mwpt != null) { + if (mwpt.direct && bNextDirect) { + sele += "" + hint.getLocusSymbolString() + "pass_placeShaping"; + // bNextDirect = false; + } else if (mwpt.direct) { + sele += "pass_placeShaping"; + bNextDirect = true; + } else if (bNextDirect) { + sele += "beeline" + hint.getLocusSymbolString() + "Shaping"; + bNextDirect = false; + } else { + sele += "" + hint.getLocusSymbolString() + ""; + } + } else { + sele += "" + hint.getLocusSymbolString() + ""; + } + } else { + if (idx == 0 && hint == null) { + + int pos = sele.indexOf(""; + if (mwpt != null && mwpt.direct) { + bNextDirect = true; + } + sele += "pass_place"; + sele += "Via"; + + } else if (idx == nodes.size() - 1 && hint == null) { + + int pos = sele.indexOf(""; + if (bNextDirect) { + sele += "beeline"; + } + sele += "pass_place"; + sele += "Via"; + + } 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) { + sele += "beelinepass_placeShaping"; + } else if (mwpt.direct) { + sele += "pass_placeShaping"; + bNextDirect = true; + } else if (mwpt.name.startsWith("via") || + mwpt.name.startsWith("from") || + mwpt.name.startsWith("to")) { + if (bNextDirect) { + sele += "beelinepass_placeShaping"; + } else { + sele += "pass_placeShaping"; + } + bNextDirect = false; + } else { + sele += "" + mwpt.name + ""; + sele += "pass_placeVia"; + } + } + } + } + } sb.append(" ").append(sele).append("\n"); @@ -1263,11 +1296,14 @@ public final class OsmTrack { input.indexInTrack = --nodeNr; input.goodWay = node.message; input.oldWay = node.origin.message == null ? node.message : node.origin.message; - if (rc.turnInstructionMode == 8) { + if (rc.turnInstructionMode == 8 || + rc.turnInstructionMode == 4 || + rc.turnInstructionMode == 2 || + rc.turnInstructionMode == 9) { MatchedWaypoint mwpt = getMatchedWaypoint(nodeNr); if (mwpt != null && mwpt.direct) { input.cmd = VoiceHint.BL; - input.angle = (float) node.message.turnangle; + input.angle = (float) (nodeNr == 0 ? node.origin.message.turnangle : node.message.turnangle); input.distanceToNext = node.calcDistance(node.origin); } }