From 22f27f89d4b4aeeca419e632d77a100bf9840c89 Mon Sep 17 00:00:00 2001 From: Arndt Brenschede Date: Sat, 10 Mar 2018 10:32:59 +0100 Subject: [PATCH 01/12] extraParams in addition to routing-profile --- brouter-core/src/main/java/btools/router/KinematicModel.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/brouter-core/src/main/java/btools/router/KinematicModel.java b/brouter-core/src/main/java/btools/router/KinematicModel.java index 5631eaa..0968b43 100644 --- a/brouter-core/src/main/java/btools/router/KinematicModel.java +++ b/brouter-core/src/main/java/btools/router/KinematicModel.java @@ -89,7 +89,10 @@ class KinematicModel extends OsmPathModel return Float.parseFloat( sval ); } float v = ctxWay.getVariableValue( name, defaultValue ); - params.put( name, "" + v ); + if ( params != null ) + { + params.put( name, "" + v ); + } return v; } From fc1656dd7bfcd71db98705f95cbc1834b959e183 Mon Sep 17 00:00:00 2001 From: Arndt Brenschede Date: Sun, 11 Mar 2018 08:34:57 +0100 Subject: [PATCH 02/12] energy along the track --- .../src/main/java/btools/router/OsmPathElement.java | 13 +++++++++++++ .../src/main/java/btools/router/OsmTrack.java | 2 ++ .../src/main/java/btools/router/RoutingEngine.java | 2 ++ 3 files changed, 17 insertions(+) diff --git a/brouter-core/src/main/java/btools/router/OsmPathElement.java b/brouter-core/src/main/java/btools/router/OsmPathElement.java index 34807d8..388140d 100644 --- a/brouter-core/src/main/java/btools/router/OsmPathElement.java +++ b/brouter-core/src/main/java/btools/router/OsmPathElement.java @@ -57,6 +57,19 @@ public class OsmPathElement implements OsmPos } } + public final float getEnergy() + { + return message == null ? 0.f : message.energy; + } + + public final void setEnergy( float e ) + { + if ( message != null ) + { + message.energy = e; + } + } + public final long getIdFromPos() { return ((long)ilon)<<32 | ilat; diff --git a/brouter-core/src/main/java/btools/router/OsmTrack.java b/brouter-core/src/main/java/btools/router/OsmTrack.java index 08025a8..ccc42e0 100644 --- a/brouter-core/src/main/java/btools/router/OsmTrack.java +++ b/brouter-core/src/main/java/btools/router/OsmTrack.java @@ -293,12 +293,14 @@ public final class OsmTrack { int ourSize = nodes.size(); float t0 = ourSize > 0 ? nodes.get(ourSize - 1 ).getTime() : 0; + float e0 = ourSize > 0 ? nodes.get(ourSize - 1 ).getEnergy() : 0; for ( int i = 0; i < t.nodes.size(); i++ ) { if ( i > 0 || ourSize == 0 ) { OsmPathElement e = t.nodes.get( i ); e.setTime( e.getTime() + t0 ); + e.setEnergy( e.getEnergy() + e0 ); nodes.add( e ); } } diff --git a/brouter-core/src/main/java/btools/router/RoutingEngine.java b/brouter-core/src/main/java/btools/router/RoutingEngine.java index 56632fe..5fba332 100644 --- a/brouter-core/src/main/java/btools/router/RoutingEngine.java +++ b/brouter-core/src/main/java/btools/router/RoutingEngine.java @@ -1115,6 +1115,7 @@ public class RoutingEngine extends Thread } float totalTime = element.getTime(); + float totalEnergy = element.getEnergy(); OsmTrack track = new OsmTrack(); track.cost = path.cost; @@ -1138,6 +1139,7 @@ public class RoutingEngine extends Thread if ( routingContext.inverseRouting ) { element.setTime( totalTime - element.getTime() ); + element.setEnergy( totalEnergy - element.getEnergy() ); track.nodes.add( element ); } else From f2d04ef70a8b1c3f8b5b64f7a8329a7fb840e47f Mon Sep 17 00:00:00 2001 From: Arndt Brenschede Date: Wed, 21 Mar 2018 09:10:59 +0100 Subject: [PATCH 03/12] breaking speeds from cost model + cost tuning --- .../java/btools/router/KinematicModel.java | 48 +++++++++++++++---- .../java/btools/router/KinematicPath.java | 20 ++++++-- misc/profiles2/car-eco.brf | 7 ++- misc/profiles2/car-fast.brf | 7 ++- 4 files changed, 67 insertions(+), 15 deletions(-) diff --git a/brouter-core/src/main/java/btools/router/KinematicModel.java b/brouter-core/src/main/java/btools/router/KinematicModel.java index 0968b43..cf34abd 100644 --- a/brouter-core/src/main/java/btools/router/KinematicModel.java +++ b/brouter-core/src/main/java/btools/router/KinematicModel.java @@ -36,8 +36,8 @@ class KinematicModel extends OsmPathModel public double rightWaySpeed; // derived values - public double xweight; // the weight-factor between time and energy for cost calculation - public double timecost0; // minimum possible "energy-adjusted-time" per meter + public double pw; // balance power + public double cost0; // minimum possible cost per meter private int wayIdxMaxspeed; private int wayIdxMinspeed; @@ -50,6 +50,9 @@ class KinematicModel extends OsmPathModel private boolean initDone = false; + private double lastEffectiveLimit; + private double lastBreakingSpeed; + @Override public void init( BExpressionContextWay expctxWay, BExpressionContextNode expctxNode, Map extraParams ) { @@ -77,8 +80,8 @@ class KinematicModel extends OsmPathModel leftWaySpeed = getParam( "leftWaySpeed", 12.f ) / 3.6; rightWaySpeed = getParam( "rightWaySpeed", 12.f ) / 3.6; - xweight = 1./( 2. * f_air * vmax * vmax * vmax - p_standby ); - timecost0 = 1./vmax + xweight*(f_roll + f_air*vmax*vmax + p_standby/vmax ); + pw = 2. * f_air * vmax * vmax * vmax - p_standby; + cost0 = (pw+p_standby)/vmax + f_roll + f_air*vmax*vmax; } protected float getParam( String name, float defaultValue ) @@ -111,10 +114,39 @@ class KinematicModel extends OsmPathModel return ctxNode.getBuildInVariable( nodeIdxMaxspeed ) / 3.6f; } - public double getMaxKineticEnergy() + /** + * get the effective speed limit from the way-limit and vmax/vmin + */ + public double getEffectiveSpeedLimit( ) { - // determine maximum possible speed and kinetic energy - double mspeed = Math.min( getWayMaxspeed(), Math.max( getWayMinspeed(), vmax ) ); - return 0.5*totalweight*mspeed*mspeed; + return Math.min( getWayMaxspeed(), Math.max( getWayMinspeed(), vmax ) ); } + + /** + * get the breaking speed for current balance-power (pw) and effective speed limit (vl) + */ + public double getBreakingSpeed( double vl ) + { + if ( vl == lastEffectiveLimit ) + { + return lastBreakingSpeed; + } + + double v = vl*0.8; + double pw2 = pw+p_standby; + double e = recup_efficiency; + double x0 = pw2/vl+f_air*e*vl*vl+(1.-e)*f_roll; + for(int i=0;i<5;i++) + { + double v2 = v*v; + double x = pw2/v+f_air*e*v2 - x0; + double dx = 2.*e*f_air*v - pw2/v2; + v -= x/dx; + } + lastEffectiveLimit = vl; + lastBreakingSpeed = v; + + return v; + } + } diff --git a/brouter-core/src/main/java/btools/router/KinematicPath.java b/brouter-core/src/main/java/btools/router/KinematicPath.java index c40da1f..74f4075 100644 --- a/brouter-core/src/main/java/btools/router/KinematicPath.java +++ b/brouter-core/src/main/java/btools/router/KinematicPath.java @@ -42,13 +42,14 @@ final class KinematicPath extends OsmPath KinematicModel km = (KinematicModel)rc.pm; double cost = 0.; + double extraTime = 0.; if ( isStartpoint ) { // for forward direction, we start with target speed if ( !rc.inverseDirection ) { - cost = 0.5 * (1. - cosangle ) * 40. / km.timecost0; // 40 seconds turn penalty + extraTime = 0.5 * (1. - cosangle ) * 40.; // 40 seconds turn penalty } } else @@ -107,7 +108,11 @@ final class KinematicPath extends OsmPath if ( hasLeftWay && turnspeed > km.leftWaySpeed ) turnspeed = km.leftWaySpeed; if ( hasRightWay && turnspeed > km.rightWaySpeed ) turnspeed = km.rightWaySpeed; if ( hasResidential && turnspeed > residentialSpeed ) turnspeed = residentialSpeed; - if ( (lastpriorityclassifier < 20) ^ (priorityclassifier < 20) ) turnspeed = 0; // full stop for entering or leaving road network + if ( (lastpriorityclassifier < 20) ^ (priorityclassifier < 20) ) + { + extraTime += 10.; + turnspeed = 0; // full stop for entering or leaving road network + } } cutEkin( km.totalweight, turnspeed ); // apply turnspeed @@ -128,6 +133,9 @@ final class KinematicPath extends OsmPath message.costfactor = (float)(distanceCost/dist); } + cost += extraTime * km.pw / km.cost0; + totalTime += extraTime; + return cost + distanceCost; } @@ -137,12 +145,14 @@ final class KinematicPath extends OsmPath // elevation force double fh = delta_h * km.totalweight * 9.81 / dist; - double emax = km.getMaxKineticEnergy(); + double effectiveSpeedLimit = km.getEffectiveSpeedLimit(); + double emax = 0.5*km.totalweight*effectiveSpeedLimit*effectiveSpeedLimit; if ( emax <= 0. ) { return -1.; } - double elow = 0.7*emax; // recup phase below 70% energy (=84% vmax) + double vb = km.getBreakingSpeed( effectiveSpeedLimit ); + double elow = 0.5*km.totalweight*vb*vb; double elapsedTime = 0.; double dissipatedEnergy = 0.; @@ -209,7 +219,7 @@ final class KinematicPath extends OsmPath totalTime += elapsedTime; totalEnergy += dissipatedEnergy + dist*fh; - return (elapsedTime + km.xweight * dissipatedEnergy)/km.timecost0; // =cost + return (km.pw * elapsedTime + dissipatedEnergy)/km.cost0; // =cost } @Override diff --git a/misc/profiles2/car-eco.brf b/misc/profiles2/car-eco.brf index 0cbec3e..bc7a10d 100644 --- a/misc/profiles2/car-eco.brf +++ b/misc/profiles2/car-eco.brf @@ -177,5 +177,10 @@ assign initialcost = assign maxspeed = - if or crossing=traffic_signals highway=traffic_signals then 0 + if or crossing=traffic_signals highway=traffic_signals + then + switch greater way:priorityclassifier 24 5 + switch greater way:priorityclassifier 22 3 + switch greater way:priorityclassifier 20 1 + 0 else 999 diff --git a/misc/profiles2/car-fast.brf b/misc/profiles2/car-fast.brf index 3c9959a..ab6a494 100644 --- a/misc/profiles2/car-fast.brf +++ b/misc/profiles2/car-fast.brf @@ -177,5 +177,10 @@ assign initialcost = assign maxspeed = - if or crossing=traffic_signals highway=traffic_signals then 0 + if or crossing=traffic_signals highway=traffic_signals + then + switch greater way:priorityclassifier 24 5 + switch greater way:priorityclassifier 22 3 + switch greater way:priorityclassifier 20 1 + 0 else 999 From 599a24f710d8f0ed29189134519b489d4f57b042 Mon Sep 17 00:00:00 2001 From: Arndt Brenschede Date: Mon, 2 Apr 2018 19:19:52 +0200 Subject: [PATCH 04/12] automatically ignore islands --- .../main/java/btools/codec/MicroCache2.java | 10 +- .../java/btools/codec/WaypointMatcher.java | 4 +- .../java/btools/router/RoutingEngine.java | 46 +++++-- .../btools/router/RoutingIslandException.java | 5 + .../btools/router/WaypointMatcherImpl.java | 31 ++++- .../java/btools/mapaccess/NodesCache.java | 4 +- .../main/java/btools/mapaccess/OsmFile.java | 4 +- .../java/btools/mapaccess/OsmNodePairSet.java | 122 ++++++++++++++++++ 8 files changed, 203 insertions(+), 23 deletions(-) create mode 100644 brouter-core/src/main/java/btools/router/RoutingIslandException.java create mode 100644 brouter-mapaccess/src/main/java/btools/mapaccess/OsmNodePairSet.java diff --git a/brouter-codec/src/main/java/btools/codec/MicroCache2.java b/brouter-codec/src/main/java/btools/codec/MicroCache2.java index fae63f3..ca3c1b3 100644 --- a/brouter-codec/src/main/java/btools/codec/MicroCache2.java +++ b/brouter-codec/src/main/java/btools/codec/MicroCache2.java @@ -170,9 +170,15 @@ public final class MicroCache2 extends MicroCache if ( !isReverse ) // write geometry for forward links only { WaypointMatcher matcher = wayTags == null || wayTags.accessType < 2 ? null : waypointMatcher; - if ( matcher != null ) matcher.startNode( ilon, ilat, wayTags.data ); int ilontarget = ilon + dlon_remaining; int ilattarget = ilat + dlat_remaining; + if ( matcher != null ) + { + if ( !matcher.start( ilon, ilat, ilontarget, ilattarget ) ) + { + matcher = null; + } + } int transcount = bc.decodeVarBits(); if ( debug ) System.out.println( "*** decoding geometry with count=" + transcount ); @@ -194,7 +200,7 @@ public final class MicroCache2 extends MicroCache if ( matcher != null ) matcher.transferNode( ilontarget - dlon_remaining, ilattarget - dlat_remaining ); } - if ( matcher != null ) matcher.endNode( ilontarget, ilattarget ); + if ( matcher != null ) matcher.end(); } if ( wayTags != null ) { diff --git a/brouter-codec/src/main/java/btools/codec/WaypointMatcher.java b/brouter-codec/src/main/java/btools/codec/WaypointMatcher.java index f71cc52..f7770e0 100644 --- a/brouter-codec/src/main/java/btools/codec/WaypointMatcher.java +++ b/brouter-codec/src/main/java/btools/codec/WaypointMatcher.java @@ -7,7 +7,7 @@ package btools.codec; */ public interface WaypointMatcher { - void startNode( int ilon, int ilat, byte[] wayTags ); + boolean start( int ilonStart, int ilatStart, int ilonTarget, int ilatTarget ); void transferNode( int ilon, int ilat ); - void endNode( int ilon, int ilat ); + void end(); } diff --git a/brouter-core/src/main/java/btools/router/RoutingEngine.java b/brouter-core/src/main/java/btools/router/RoutingEngine.java index 5fba332..c086069 100644 --- a/brouter-core/src/main/java/btools/router/RoutingEngine.java +++ b/brouter-core/src/main/java/btools/router/RoutingEngine.java @@ -14,6 +14,7 @@ import btools.mapaccess.NodesCache; import btools.mapaccess.OsmLink; import btools.mapaccess.OsmLinkHolder; import btools.mapaccess.OsmNode; +import btools.mapaccess.OsmNodePairSet; import btools.mapaccess.OsmNodesMap; import btools.util.SortedHeap; import btools.util.StackSampler; @@ -30,6 +31,8 @@ public class RoutingEngine extends Thread private int linksProcessed = 0; private int nodeLimit; // used for target island search + private int MAXNODES_ISLAND_CHECK = 500; + private OsmNodePairSet islandNodePairs = new OsmNodePairSet(MAXNODES_ISLAND_CHECK); protected OsmTrack foundTrack = new OsmTrack(); private OsmTrack foundRawTrack = null; @@ -328,9 +331,24 @@ public class RoutingEngine extends Thread terminate(); } - - private OsmTrack findTrack( OsmTrack[] refTracks, OsmTrack[] lastTracks ) + { + for(;;) + { + try + { + return tryFindTrack( refTracks, lastTracks ); + } + catch( RoutingIslandException rie ) + { + islandNodePairs.freezeTempPairs(); + nodesCache.clean( true ); + matchedWaypoints = null; + } + } + } + + private OsmTrack tryFindTrack( OsmTrack[] refTracks, OsmTrack[] lastTracks ) { OsmTrack totaltrack = new OsmTrack(); int nUnmatched = waypoints.size(); @@ -377,7 +395,7 @@ public class RoutingEngine extends Thread airDistanceCostFactor = 0.; for( int i=0; i unmatchedWaypoints ) { resetCache( false ); - nodesCache.waypointMatcher = new WaypointMatcherImpl( unmatchedWaypoints, 250. ); + nodesCache.waypointMatcher = new WaypointMatcherImpl( unmatchedWaypoints, 250., islandNodePairs ); for( MatchedWaypoint mwp : unmatchedWaypoints ) { preloadPosition( mwp.waypoint ); @@ -467,7 +485,10 @@ public class RoutingEngine extends Thread for( int idxLat=-1; idxLat<=1; idxLat++ ) for( int idxLon=-1; idxLon<=1; idxLon++ ) { - nodesCache.loadSegmentFor( n.ilon + d*idxLon , n.ilat +d*idxLat ); + if ( idxLon != 0 || idxLat != 0 ) + { + nodesCache.loadSegmentFor( n.ilon + d*idxLon , n.ilat +d*idxLat ); + } } } @@ -608,6 +629,7 @@ public class RoutingEngine extends Thread long maxmem = routingContext.memoryclass * 131072L; // 1/8 of total nodesCache = new NodesCache(segmentDir, nodesMap, routingContext.expctxWay, routingContext.forceSecondaryData, maxmem, nodesCache, detailed ); + islandNodePairs.clearTempPairs(); } private OsmNode getStartNode( long startId ) @@ -741,7 +763,7 @@ public class RoutingEngine extends Thread } finally { - nodesCache.cleanNonVirgin(); + nodesCache.clean( false ); // clean only non-virgin caches } } @@ -878,6 +900,10 @@ public class RoutingEngine extends Thread OsmNode currentNode = path.getTargetNode(); long currentNodeId = currentNode.getIdFromPos(); + long sourceNodeId = sourceNode.getIdFromPos(); + + islandNodePairs.addTempPair( sourceNodeId, currentNodeId ); + if ( path.treedepth != 1 ) { if ( path.treedepth == 0 ) // hack: sameSegment Paths marked treedepth=0 to pass above check @@ -885,7 +911,6 @@ public class RoutingEngine extends Thread path.treedepth = 1; } - long sourceNodeId = sourceNode.getIdFromPos(); if ( ( sourceNodeId == endNodeId1 && currentNodeId == endNodeId2 ) || ( sourceNodeId == endNodeId2 && currentNodeId == endNodeId1 ) ) { @@ -1078,7 +1103,6 @@ public class RoutingEngine extends Thread { bestPath.airdistance += boundary.getBoundaryDistance( nextNode ); } - bestPath.treedepth = path.treedepth + 1; link.addLinkHolder( bestPath, currentNode ); synchronized( openSet ) @@ -1092,6 +1116,12 @@ public class RoutingEngine extends Thread path.unregisterUpTree( routingContext ); } + + if ( nodesVisited < MAXNODES_ISLAND_CHECK && islandNodePairs.getFreezeCount() < 5 ) + { + throw new RoutingIslandException(); + } + return null; } diff --git a/brouter-core/src/main/java/btools/router/RoutingIslandException.java b/brouter-core/src/main/java/btools/router/RoutingIslandException.java new file mode 100644 index 0000000..2475227 --- /dev/null +++ b/brouter-core/src/main/java/btools/router/RoutingIslandException.java @@ -0,0 +1,5 @@ +package btools.router; + +public class RoutingIslandException extends RuntimeException +{ +} diff --git a/brouter-core/src/main/java/btools/router/WaypointMatcherImpl.java b/brouter-core/src/main/java/btools/router/WaypointMatcherImpl.java index 4266dd3..626b758 100644 --- a/brouter-core/src/main/java/btools/router/WaypointMatcherImpl.java +++ b/brouter-core/src/main/java/btools/router/WaypointMatcherImpl.java @@ -4,6 +4,7 @@ import java.util.List; import btools.codec.WaypointMatcher; import btools.mapaccess.OsmNode; +import btools.mapaccess.OsmNodePairSet; /** * the WaypointMatcher is feeded by the decoder with geoemtries of ways that are @@ -15,16 +16,20 @@ import btools.mapaccess.OsmNode; public final class WaypointMatcherImpl implements WaypointMatcher { private List waypoints; + private OsmNodePairSet islandPairs; private int lonStart; private int latStart; + private int lonTarget; + private int latTarget; private boolean anyUpdate; private int lonLast; private int latLast; - public WaypointMatcherImpl( List waypoints, double maxDistance ) + public WaypointMatcherImpl( List waypoints, double maxDistance, OsmNodePairSet islandPairs ) { this.waypoints = waypoints; + this.islandPairs = islandPairs; for ( MatchedWaypoint mwp : waypoints ) { mwp.radius = maxDistance * 110984.; // 6378000. / 57.3; @@ -105,11 +110,23 @@ public final class WaypointMatcherImpl implements WaypointMatcher } @Override - public void startNode( int ilon, int ilat, byte[] wayTags ) + public boolean start( int ilonStart, int ilatStart, int ilonTarget, int ilatTarget ) { - lonLast = lonStart = ilon; - latLast = latStart = ilat; + if ( islandPairs.size() > 0 ) + { + long n1 = ( (long) ilonStart ) << 32 | ilatStart; + long n2 = ( (long) ilonTarget ) << 32 | ilatTarget; + if ( islandPairs.hasPair( n1, n2 ) ) + { + return false; + } + } + lonLast = lonStart = ilonStart; + latLast = latStart = ilatStart; + lonTarget = ilonTarget; + latTarget = ilatTarget; anyUpdate = false; + return true; } @Override @@ -121,9 +138,9 @@ public final class WaypointMatcherImpl implements WaypointMatcher } @Override - public void endNode( int ilon, int ilat ) + public void end() { - checkSegment( lonLast, latLast, ilon, ilat ); + checkSegment( lonLast, latLast, lonTarget, latTarget ); if ( anyUpdate ) { for ( MatchedWaypoint mwp : waypoints ) @@ -132,7 +149,7 @@ public final class WaypointMatcherImpl implements WaypointMatcher { mwp.hasUpdate = false; mwp.node1 = new OsmNode( lonStart, latStart ); - mwp.node2 = new OsmNode( ilon, ilat ); + mwp.node2 = new OsmNode( lonTarget, latTarget ); } } } diff --git a/brouter-mapaccess/src/main/java/btools/mapaccess/NodesCache.java b/brouter-mapaccess/src/main/java/btools/mapaccess/NodesCache.java index 976a443..3efa97f 100644 --- a/brouter-mapaccess/src/main/java/btools/mapaccess/NodesCache.java +++ b/brouter-mapaccess/src/main/java/btools/mapaccess/NodesCache.java @@ -110,7 +110,7 @@ public final class NodesCache ghostSum = cacheSum; } - public void cleanNonVirgin() + public void clean( boolean all ) { for ( OsmFile[] fileRow : fileRows ) { @@ -118,7 +118,7 @@ public final class NodesCache continue; for ( OsmFile osmf : fileRow ) { - osmf.cleanNonVirgin(); + osmf.clean( all); } } } diff --git a/brouter-mapaccess/src/main/java/btools/mapaccess/OsmFile.java b/brouter-mapaccess/src/main/java/btools/mapaccess/OsmFile.java index 9f4461f..f548fa8 100644 --- a/brouter-mapaccess/src/main/java/btools/mapaccess/OsmFile.java +++ b/brouter-mapaccess/src/main/java/btools/mapaccess/OsmFile.java @@ -217,7 +217,7 @@ final class OsmFile return deleted; } - void cleanNonVirgin() + void clean( boolean all ) { int nc = microCaches == null ? 0 : microCaches.length; for ( int i = 0; i < nc; i++ ) @@ -225,7 +225,7 @@ final class OsmFile MicroCache mc = microCaches[i]; if ( mc == null ) continue; - if ( !mc.virgin ) + if ( all || !mc.virgin ) { microCaches[i] = null; } diff --git a/brouter-mapaccess/src/main/java/btools/mapaccess/OsmNodePairSet.java b/brouter-mapaccess/src/main/java/btools/mapaccess/OsmNodePairSet.java new file mode 100644 index 0000000..7e930b3 --- /dev/null +++ b/brouter-mapaccess/src/main/java/btools/mapaccess/OsmNodePairSet.java @@ -0,0 +1,122 @@ +/** + * Set holding pairs of osm nodes + * + * @author ab + */ +package btools.mapaccess; + +import btools.util.CompactLongMap; + +public class OsmNodePairSet +{ + private long[] n1a; + private long[] n2a; + private int tempNodes = 0; + private int maxTempNodes = 0; + private int npairs = 0; + private int freezecount = 0; + + public OsmNodePairSet( int maxTempNodeCount ) + { + maxTempNodes = maxTempNodeCount; + n1a = new long[maxTempNodes]; + n2a = new long[maxTempNodes]; + } + + private static class OsmNodePair + { + public long node2; + public OsmNodePair next; + } + + private CompactLongMap map; + + public void addTempPair( long n1, long n2 ) + { + if ( tempNodes < maxTempNodes ) + { + n1a[tempNodes] = n1; + n2a[tempNodes] = n2; + tempNodes++; + } + } + + public void freezeTempPairs() + { + freezecount++; + for( int i=0; i(); + } + npairs++; + + OsmNodePair e = getElement( n1, n2 ); + if ( e == null ) + { + e = new OsmNodePair(); + e.node2 = n2; + + OsmNodePair e0 = map.get( n1 ); + if ( e0 != null ) + { + while( e0.next != null ) + { + e0 = e0.next; + } + e0.next = e; + } + else + { + map.fastPut( n1, e ); + } + } + } + + public int size() + { + return npairs; + } + + public int tempSize() + { + return tempNodes; + } + + public int getFreezeCount() + { + return freezecount; + } + + public boolean hasPair( long n1, long n2 ) + { + return map != null && ( getElement( n1, n2 ) != null || getElement( n2, n1 ) != null ); + } + + private OsmNodePair getElement( long n1, long n2 ) + { + OsmNodePair e = map.get( n1 ); + while (e != null) + { + if ( e.node2 == n2 ) + { + return e; + } + e = e.next; + } + return null; + } +} From fcae2caa75b562e216ed7cbf205f5d9e0b94edcb Mon Sep 17 00:00:00 2001 From: Arndt Brenschede Date: Mon, 2 Apr 2018 22:20:21 +0200 Subject: [PATCH 05/12] 1.4.11 preps --- brouter-routing-app/assets/profiles2.zip | Bin 31020 -> 31076 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/brouter-routing-app/assets/profiles2.zip b/brouter-routing-app/assets/profiles2.zip index 681f57f7d2b5171f4f3af2eee215d857153fa10c..716408562f3eb896532319fe8630f875a9ebce91 100644 GIT binary patch delta 3298 zcmds)lK9q7iPr8{LvN)JZ&kd^_`NDZVr1O=6l z7zolSsP8$~`{BLLzwkaE?(6<^fBgNfr}6-}dI01y)Tg9k2T%a$03*d7$ORU_nl23h zu%E;wgcY_iYN#+V{ZW`Lo}`O(tG0Uh*-{*&*3qBH9VJhi=uOS)MGl;gO_MDzb`DFG zj@Z)hYFclEt0(D2jlo^42(+*e(`>zFd>I{O5%3SPG2D!X{zg04{^OD>9+uV&&eHL! zep?xxR|W&mge_0-RTxGqpjgAtuLn~cqGD*UQlY7N_VZT-+k;_Og?oGccqyu3vyjl) z$fi`z(DHIHo5C+*-JY*q0d-oawZVZ+}knOqoW zS)h>aoJ+cOdkF;6_JvYBTUF^xJJtC&Fs5N5qn!=qdStYI(^Gm2U@lRNsVohU%~!xC zVR61NKdN4n6XHk-1MO%@B6{dlLM=Fnk9AmncYQl?@E9 zp=*)Tpt>ZSLF^iRv)(HqIZ?-}vxA`w z2Epq7FU?`lH3S{CnjJNp%^RrRE)VuHhfCw`QtZWxWcFP@*B2=GL~pBZ^VDseHB(i_ zDkVvCMbRhLqe9rW*pRo}w_-Sc^pPi9rD8Tp7I|Gqvag6FOwy8}7wnth*e$+YL=mc9wG+eBjA=Ib)L_ui&2i*3?E}LLD%sZ;6-s8taazT$bjn%N!oH+;g7GjK zW7Zfa>MNTvektzn8Pnkj*8{?JuQR%#4elq7)>cUOv#1`$$$6KZnq%*T81Us1C(Gc+ z0mHiJ4KAM|U?cx*eev@(UO4aPg{_AcI;(12%QmsTHF}So`S126t74Lux#mSIu`xdd(a$io1KI-45Egi1r{ zJ%Kc>#jMqv$9w0>`n*d&q@lyiviGdc2yVC3^q0p+@&$u~NCh8@@WS+#Sb%m`so=5# zd|bC%fA&Fvy5H!}OzzC=T*2ccYYW|rxti2j8#3sf77!vyX8{*1&DYXh%S6c3YMOGSuB>3~?dXk#t!7$MO!hCK=w3Gv`<{ zQoNRMh49)dX@FMWH#M2Lo1jIGH@)UR*UV~Iw0uoy92(@N>Ua5)tc}q6bQ7}N^SeQ% z=r&m$c15-+CK_?FiuCxXzjA^`*1*&6nMJp1XP5~o$P6S$iCPn-F1?3Y-n^od<1*q1 zJ?5axZg8!M8K=i;k23+6Mf8Xp%6A%bXcp^{)3DE{Y`x?a4&nY9ZIi&8rMpL4Om z|KUHZ)e|W%VpOE}5B~8kG|>MK{!cjCqC*lq0R4b}43*I?!z zA1MDE8he31s7g+sOSuqNJ3Xi^AU*i()Vp+B)?L&>Y6Wd1A}8MCR(NQBU1)TzDO>R= zmN9sYfxx@h`%6_f#<#6Wl?dMW_EpfrfnBGT#teA?#1y*ow`wWOu-6&ij{l%Ev({%T zDjcG{Gbt8EYa^=x)w!BiYx9_`N7FgX^si{QC!k`np4f=$ui65l5^by~odV96xB>}Z zYq&mwra<+CqJqU|-GX%TL>9MrwYGa6OC=GtV>5XB&-0LT*f-4a`Nyzdd{ixDsJpo? zpV%qwA2pCaUY?pi#teb+JG|-YnWi%!ftzi=Z2HvDW)1C~W#{$ZJ;yc6_fC)BpVck2 zr;cEu_QrV8a?s^!g9=@r(zm>Zw9LKR7D^;~53Lhw}(1g4MQVl$rtw5zMDUrB0N2yLTEQOooJ zjSj78y2<=9C}X1xBqH{0@BSiRZ5Zdy@FH%Ild_ynt1&d(i&uH5*)nn%tj(g*EyzOC zEKyq0Z~MeFbA?tQpf6kT!v&Veqh1<6Hf#TZ5YWC>Byq%`GzIv~>^N`S;1Lgwciue~ z78g9okKL>7ReB7mY~&j`0(zx@B5UfDBoP?1XG`T2d(V4c{d&1B`@>FHUq-CrQ~|`( z!721EAsqEBX0@h^yL4>gHF#aPy?##m6KErEe!75VxX|^!M^eC9P#zYt=fi`yq0KIk zx-@J~$}irtTYmsjQ^jD=S+#avp#|ye!9kh@d7bHY0C^m)Gr9gR!4{0}<(Z-S;4$y+ zPlvYA_hIbKicW7A;-I_Ao;+C)=?@TFc$7-R-L_po0et0UF8HE_tgbNJ;Lf z0`Z~Z{rmO1+T)48A6ptg=(3`4ZlISh=d$kn;{NaB>_)=`- zoD#Nq($ZNts48C?6pE@2c`=}{{feKweRou0!H<$W%rj=qz??JgV6YfIz8R!AoH@ZO zFEE`$h)>+IuvohGw`&fQ=+2+G^^MQ@kKNhIELG^I)nB?cNZ4nca8D2$IumOq*}qZh z;^YRZWL!RSD+ti$B{^k#jNB{8Deqm|z| z6)#1X@U?tiu-B-YGKcIT$ zOyKLGJ7JPu|BAoahoxgnYC?By=%=dVsbFD($lz31$I6Q#Vqph)MlYyo+t+qqkIA!N zEi6z}qjhDZk69e(%==EWm_1~`mWFKGY( delta 3257 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 ZEC=F>g9s5EbAgGSh=@^w_(c9w{~z){5%T~5 From 9c5f2d113ecf1c4c70f8f15bc0439d094aea3ccd Mon Sep 17 00:00:00 2001 From: Arndt Brenschede Date: Mon, 2 Apr 2018 22:41:55 +0200 Subject: [PATCH 06/12] 1.4.11 preps --- brouter-codec/pom.xml | 2 +- brouter-core/pom.xml | 2 +- brouter-core/src/main/java/btools/router/OsmTrack.java | 2 +- brouter-expressions/pom.xml | 2 +- brouter-map-creator/pom.xml | 2 +- brouter-mapaccess/pom.xml | 2 +- brouter-mem-router/pom.xml | 2 +- brouter-routing-app/AndroidManifest.xml | 4 ++-- brouter-routing-app/pom.xml | 2 +- .../src/main/java/btools/routingapp/BRouterView.java | 2 +- brouter-server/pom.xml | 2 +- brouter-server/src/main/java/btools/server/BRouter.java | 2 +- brouter-server/src/main/java/btools/server/RouteServer.java | 2 +- brouter-util/pom.xml | 2 +- pom.xml | 2 +- 15 files changed, 16 insertions(+), 16 deletions(-) diff --git a/brouter-codec/pom.xml b/brouter-codec/pom.xml index d4b32cd..cef5728 100644 --- a/brouter-codec/pom.xml +++ b/brouter-codec/pom.xml @@ -5,7 +5,7 @@ org.btools brouter - 1.4.10 + 1.4.11 ../pom.xml brouter-codec diff --git a/brouter-core/pom.xml b/brouter-core/pom.xml index 8d05c68..9678493 100644 --- a/brouter-core/pom.xml +++ b/brouter-core/pom.xml @@ -5,7 +5,7 @@ org.btools brouter - 1.4.10 + 1.4.11 ../pom.xml brouter-core diff --git a/brouter-core/src/main/java/btools/router/OsmTrack.java b/brouter-core/src/main/java/btools/router/OsmTrack.java index ccc42e0..dfb9d5b 100644 --- a/brouter-core/src/main/java/btools/router/OsmTrack.java +++ b/brouter-core/src/main/java/btools/router/OsmTrack.java @@ -402,7 +402,7 @@ public final class OsmTrack } else { - sb.append( " creator=\"BRouter-1.4.10\" version=\"1.1\">\n" ); + sb.append( " creator=\"BRouter-1.4.11\" version=\"1.1\">\n" ); } if ( turnInstructionMode == 3) // osmand style diff --git a/brouter-expressions/pom.xml b/brouter-expressions/pom.xml index 84b3527..9287517 100644 --- a/brouter-expressions/pom.xml +++ b/brouter-expressions/pom.xml @@ -5,7 +5,7 @@ org.btools brouter - 1.4.10 + 1.4.11 ../pom.xml brouter-expressions diff --git a/brouter-map-creator/pom.xml b/brouter-map-creator/pom.xml index ec9c450..5c78b20 100644 --- a/brouter-map-creator/pom.xml +++ b/brouter-map-creator/pom.xml @@ -5,7 +5,7 @@ org.btools brouter - 1.4.10 + 1.4.11 ../pom.xml brouter-map-creator diff --git a/brouter-mapaccess/pom.xml b/brouter-mapaccess/pom.xml index e02bd80..bc09583 100644 --- a/brouter-mapaccess/pom.xml +++ b/brouter-mapaccess/pom.xml @@ -5,7 +5,7 @@ org.btools brouter - 1.4.10 + 1.4.11 ../pom.xml brouter-mapaccess diff --git a/brouter-mem-router/pom.xml b/brouter-mem-router/pom.xml index b5f595e..34a4f5e 100644 --- a/brouter-mem-router/pom.xml +++ b/brouter-mem-router/pom.xml @@ -5,7 +5,7 @@ org.btools brouter - 1.4.10 + 1.4.11 ../pom.xml brouter-mem-router diff --git a/brouter-routing-app/AndroidManifest.xml b/brouter-routing-app/AndroidManifest.xml index 1d892c9..0cd0e94 100644 --- a/brouter-routing-app/AndroidManifest.xml +++ b/brouter-routing-app/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="23" + android:versionName="1.4.11" package="btools.routingapp"> org.btools brouter - 1.4.10 + 1.4.11 ../pom.xml brouter-routing-app diff --git a/brouter-routing-app/src/main/java/btools/routingapp/BRouterView.java b/brouter-routing-app/src/main/java/btools/routingapp/BRouterView.java index e0186ae..75e2281 100644 --- a/brouter-routing-app/src/main/java/btools/routingapp/BRouterView.java +++ b/brouter-routing-app/src/main/java/btools/routingapp/BRouterView.java @@ -172,7 +172,7 @@ public class BRouterView extends View String basedir = fbd.getAbsolutePath(); AppLogger.log( "using basedir: " + basedir ); - String version = "v1.4.10"; + String version = "v1.4.11"; // create missing directories assertDirectoryExists( "project directory", basedir + "/brouter", null, null ); diff --git a/brouter-server/pom.xml b/brouter-server/pom.xml index 4ff2d79..9e485d1 100644 --- a/brouter-server/pom.xml +++ b/brouter-server/pom.xml @@ -5,7 +5,7 @@ org.btools brouter - 1.4.10 + 1.4.11 ../pom.xml brouter-server diff --git a/brouter-server/src/main/java/btools/server/BRouter.java b/brouter-server/src/main/java/btools/server/BRouter.java index 0934f68..8dbe265 100644 --- a/brouter-server/src/main/java/btools/server/BRouter.java +++ b/brouter-server/src/main/java/btools/server/BRouter.java @@ -88,7 +88,7 @@ public class BRouter } System.exit(0); } - System.out.println("BRouter 1.4.10 / 26022018"); + System.out.println("BRouter 1.4.11 / 02042018"); if ( args.length < 6 ) { System.out.println("Find routes in an OSM map"); diff --git a/brouter-server/src/main/java/btools/server/RouteServer.java b/brouter-server/src/main/java/btools/server/RouteServer.java index 842f450..c7a94e8 100644 --- a/brouter-server/src/main/java/btools/server/RouteServer.java +++ b/brouter-server/src/main/java/btools/server/RouteServer.java @@ -168,7 +168,7 @@ public class RouteServer extends Thread public static void main(String[] args) throws Exception { - System.out.println("BRouter 1.4.10 / 26022018"); + System.out.println("BRouter 1.4.11 / 02042018"); if ( args.length != 5 && args.length != 6) { System.out.println("serve BRouter protocol"); diff --git a/brouter-util/pom.xml b/brouter-util/pom.xml index 154760c..7724d8b 100644 --- a/brouter-util/pom.xml +++ b/brouter-util/pom.xml @@ -5,7 +5,7 @@ org.btools brouter - 1.4.10 + 1.4.11 ../pom.xml brouter-util diff --git a/pom.xml b/pom.xml index f2e0b89..6cb36c6 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 org.btools brouter - 1.4.10 + 1.4.11 pom http://brouter.de/brouter/ brouter From 5a2ce9d3ce53f2e490900e23f677ae7454d5c0ee Mon Sep 17 00:00:00 2001 From: Arndt Brenschede Date: Sat, 7 Apr 2018 13:04:14 +0200 Subject: [PATCH 07/12] fixed bug for TR near start/end --- brouter-core/src/main/java/btools/router/OsmPath.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/brouter-core/src/main/java/btools/router/OsmPath.java b/brouter-core/src/main/java/btools/router/OsmPath.java index 2ce003e..8d0f53e 100644 --- a/brouter-core/src/main/java/btools/router/OsmPath.java +++ b/brouter-core/src/main/java/btools/router/OsmPath.java @@ -183,8 +183,10 @@ abstract class OsmPath implements OsmLinkHolder ele2 = transferNode.selev; } + boolean isStartpoint = lon0 == -1 && lat0 == -1; + // check turn restrictions (n detail mode (=final pass) no TR to not mess up voice hints) - if ( nsection == 0 && rc.considerTurnRestrictions && !detailMode ) + if ( nsection == 0 && rc.considerTurnRestrictions && !detailMode&& !isStartpoint ) { boolean hasAnyPositive = false; boolean hasPositive = false; @@ -252,6 +254,7 @@ abstract class OsmPath implements OsmLinkHolder resetState(); lon0 = -1; // reset turncost-pipe lat0 = -1; + isStartpoint = true; if ( recordTransferNodes ) { @@ -275,7 +278,6 @@ abstract class OsmPath implements OsmLinkHolder linkdisttotal += dist; // apply a start-direction if appropriate (by faking the origin position) - boolean isStartpoint = lon0 == -1 && lat0 == -1; if ( isStartpoint ) { if ( rc.startDirectionValid ) From 50301f91cc7947ed043b7206455695782ff80e48 Mon Sep 17 00:00:00 2001 From: ProBackup-nl Date: Mon, 9 Apr 2018 13:07:34 +0200 Subject: [PATCH 08/12] Create vm-forum-liegerad-schnell.brf --- misc/profiles2/vm-forum-liegerad-schnell.brf | 375 +++++++++++++++++++ 1 file changed, 375 insertions(+) create mode 100644 misc/profiles2/vm-forum-liegerad-schnell.brf diff --git a/misc/profiles2/vm-forum-liegerad-schnell.brf b/misc/profiles2/vm-forum-liegerad-schnell.brf new file mode 100644 index 0000000..44d7dcb --- /dev/null +++ b/misc/profiles2/vm-forum-liegerad-schnell.brf @@ -0,0 +1,375 @@ +# +# Profile for fast recumbent bikes, contributed by https://www.velomobilforum.de/forum/index.php?threads/brouter-ein-konfigurierbarer-offline-streckenrouter-web-android.38274/page-53#post-884027 + +---context:global + +assign ignore_bicycle_no = false # für Regionen mit falschen bicyle=no tags können sie mit "true" ignoriert werden. Auch Shuttletransporte (bicycle=dismount + foot=no) werden geroutet +assign consider_smoothness_tags = false # mit false kann die kanne die Auswertung der smoothness tags abgeschaltet werden +assign low_memory_cutoff = false # mit true werden Wege mit hohen Kosten aus der Berechnung genommen und damit wird die Berechnung schneller und benötigt weniger Arbeitspeicher. + +assign turnInstructionMode 1 #Ausgabe von Abiegehinweise 0=keine, 1=automatische Wahl, 2=locus-Style, 3=osmand-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 downhillcost 80 # Kosten für die Höhenmeter bergab +assign downhillcutoff 0.1 # Gefälle unter diesem Wert in Prozent werden nicht gewertet +assign uphillcost 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. + +assign lmc switch low_memory_cutoff 10000 0 +---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 bicycle=designated|yes + +assign footway + or highway=footway 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 1000 # Kosten für Stufen + switch cycleway 100 # Kosten für Radwege + switch footway 1000 # 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 or highway=primary highway=primary_link add lmc 50 #zusätzliche Kosten für Bundesstraßen Einbahnstraßen in Gegenrichtung + switch or highway=secondary highway=secondary_link add lmc 30 #zusätzliche Kosten für Landstraßen Einbahnstraßen in Gegenrichtung + switch or highway=tertiary highway=tertiary_link add lmc 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 downspeedpenalty + switch maxspeed=10 4 # Zusatzkosten für Geschwindigkeitsbegrenzung 10 km/h bei Gefälle + switch maxspeed=20 1.5 # Zusatzkosten für Geschwindigkeitsbegrenzung 20 km/h bei Gefälle + switch maxspeed=30 0.7 # Zusatzkosten für Geschwindigkeitsbegrenzung 30 km/h bei Gefälle + switch maxspeed=50 0.2 # Zusatzkosten für Geschwindigkeitsbegrenzung 50 km/h bei Gefälle + 0 + +assign flatspeedpenalty + switch maxspeed=10 2 # Zusatzkosten für Geschwindigkeitsbegrenzung 10 km/h in der Ebene + switch maxspeed=20 0.5 # Zusatzkosten für Geschwindigkeitsbegrenzung 20 km/h in der Ebene + switch maxspeed=30 0.15 # Zusatzkosten für Geschwindigkeitsbegrenzung 30 km/h in der Ebene + switch maxspeed=50 0.1 # Zusatzkosten für Geschwindigkeitsbegrenzung 50 km/h in der Ebene + 0 + +assign upspeedpenalty + switch maxspeed=10 1.5 # Zusatzkosten für Geschwindigkeitsbegrenzung 10 km/h bei Anstiegen + switch maxspeed=20 0.4 # Zusatzkosten für Geschwindigkeitsbegrenzung 20 km/h bei Anstiegen + switch maxspeed=30 0.1 # Zusatzkosten für Geschwindigkeitsbegrenzung 30 km/h bei Anstiegen + 0 + + +assign surfacepenalty + 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 add lmc 10 #Zusatzkosten für Schotter, Sand oder Kies + switch surface=ground|grass|unpaved|dirt|earth|mud|clay add lmc 50 #Zusatzkosten für naturbelassene Wege, Grasswege, unbefestigte Wege, Schmutzwege, erdige Wege, schlammige Wege oder Lehmwege + 0 + +assign smoothnesspenalty + switch smoothness=excellent|good|very_good 0 #Zusatzkosten für excellente, gute, oder sehr gute Oberflächen + switch smoothness=intermediate|medium 0.2 #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 add lmc 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 add lmc 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 + + add onewaypenalty + add accesspenalty + add surfacepenalty + add switch consider_smoothness_tags smoothnesspenalty 0 + add flatspeedpenalty + + 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 5 # Kosten für eine autobahnänliche Straße + switch highway=primary|primary_link 2 # Kosten für Bundesstraßen + switch highway=secondary|secondary_link 1 # Kosten für Landstraßen + switch highway=tertiary|tertiary_link 1 # Kosten für Kreisstraßen + switch highway=unclassified 1 # Kosten für Verbindungsstraßen + switch highway=residential|service 1.2 # Kosten für Wohn- und Zufahrtsstraßen + switch highway=track + switch tracktype=grade1 1.2 # Kosten für geteerte, betonierte oder gepflasterte Feldwege + switch tracktype=grade2 7 # Kosten für geschotterte Feldwege + switch tracktype=grade3 add lmc 40 # Kosten für Feldwege mit weichem Untergrund + switch tracktype=grade4 add lmc 50 # Kosten für unbefestigte Feldwege + switch tracktype=grade5 add lmc 50 # Kosten für kaum erkennbare Feldwege + add lmc 20 # Kosten für Feldwege ohne Oberflächenangabe + switch cycleway 1.3 # Kosten für Fahrradwege + switch highway=living_street 4 # Kosten für Spielstraßen + switch highway=road 7 # Kosten für noch nicht genauer beschriebene Straße + switch footway 15 # Kosten für Fußwege + switch highway=pedestrian 20 # Kosten für Gehwege + switch highway=steps 30 # Kosten für Stufen + switch highway=path + switch surface= add lmc 40 # Kosten für Pfade ohne Oberflächenangabe + 1.3 # Kosten für Pfade mit Oberflächenangabe + switch highway=bridleway add lmc 80 # Kosten für Reitwege + add lmc 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 + + add upspeedpenalty + add onewaypenalty + add accesspenalty + add switch consider_smoothness_tags smoothnesspenalty 0 + add surfacepenalty + + switch highway=motorway|motorway_link 10000 + switch route=ferry 10.67 + switch highway=trunk|trunk_link 7 + switch highway=primary|primary_link 3 + switch highway=secondary|secondary_link 1.2 + switch highway=tertiary|tertiary_link 1 + switch highway=unclassified 1 + switch highway=residential|service 1 + switch highway=track + switch tracktype=grade1 1 + switch tracktype=grade2 3 + switch tracktype=grade3 add lmc 40 + switch tracktype=grade4 add lmc 50 + switch tracktype=grade5 add lmc 50 + add lmc 20 + switch cycleway 1 + switch highway=living_street 2.5 + switch highway=road 5 + switch footway 15 + switch highway=pedestrian 20 + switch highway=steps 30 + switch highway=path + switch surface= add lmc 30 + 1 + switch highway=bridleway add lmc 80 + add lmc 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 + + add downspeedpenalty + add onewaypenalty + add accesspenalty + add switch consider_smoothness_tags smoothnesspenalty 0 + add surfacepenalty + + switch highway=motorway|motorway_link 10000 + switch route=ferry 10.67 + switch highway=trunk|trunk_link 3 + switch highway=primary|primary_link 2 + switch highway=secondary|secondary_link 1 + switch highway=tertiary|tertiary_link 1 + switch highway=unclassified 1.2 + switch highway=residential|service 2 + switch highway=track + switch tracktype=grade1 2 + switch tracktype=grade2 8 + switch tracktype=grade3 add lmc 40 + switch tracktype=grade4 add lmc 50 + switch tracktype=grade5 add lmc 50 + add lmc 20 + switch cycleway 2 + switch highway=living_street 8 + switch highway=road 10 + switch footway 20 + switch highway=pedestrian 30 + switch highway=steps 40 + switch highway=path + switch surface= add lmc 40 + 2 + switch highway=bridleway add lmc 80 + add lmc 20 + + +# hier kommen Variablen die zur Generierung der Abiegehinweise 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 or and not ignore_bicycle_no 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 + 0 + switch bikeaccess + 0 + switch footaccess + 10000 # Kosten fürs Absteigen + 1000000 #Kosten für verbotene oder private Wege From 67df0743cdcb61a01e7b8d6aa81dd5a4f4e610ed Mon Sep 17 00:00:00 2001 From: Arndt Brenschede Date: Thu, 31 May 2018 23:08:24 +0200 Subject: [PATCH 09/12] destination access logic --- .../src/main/java/btools/router/OsmPath.java | 70 +++++++++++++++++-- .../java/btools/router/RoutingEngine.java | 5 +- misc/profiles2/car-eco.brf | 12 +++- misc/profiles2/car-fast.brf | 12 +++- 4 files changed, 92 insertions(+), 7 deletions(-) diff --git a/brouter-core/src/main/java/btools/router/OsmPath.java b/brouter-core/src/main/java/btools/router/OsmPath.java index 8d0f53e..fe0f8b3 100644 --- a/brouter-core/src/main/java/btools/router/OsmPath.java +++ b/brouter-core/src/main/java/btools/router/OsmPath.java @@ -46,9 +46,34 @@ abstract class OsmPath implements OsmLinkHolder // the classifier of the segment just before this paths position protected float lastClassifier; + protected float lastInitialCost; protected int priorityclassifier; + private static final int PATH_START_BIT = 1; + private static final int CAN_LEAVE_DESTINATION_BIT = 2; + private static final int IS_ON_DESTINATION_BIT = 4; + private static final int HAD_DESTINATION_START_BIT = 8; + protected int bitfield = PATH_START_BIT; + + private boolean getBit( int mask ) + { + return (bitfield & mask ) != 0; + } + + private void setBit( int mask, boolean bit ) + { + if ( getBit( mask ) != bit ) + { + bitfield ^= mask; + } + } + + public boolean didEnterDestinationArea() + { + return !getBit( HAD_DESTINATION_START_BIT ) && getBit( IS_ON_DESTINATION_BIT ); + } + public MessageData message; public void unregisterUpTree( RoutingContext rc ) @@ -99,6 +124,8 @@ abstract class OsmPath implements OsmLinkHolder this.targetNode = link.getTarget( sourceNode ); this.cost = origin.cost; this.lastClassifier = origin.lastClassifier; + this.lastInitialCost = origin.lastInitialCost; + this.bitfield = origin.bitfield; init( origin ); addAddionalPenalty(refTrack, detailMode, origin, link, rc ); } @@ -140,15 +167,20 @@ abstract class OsmPath implements OsmLinkHolder boolean isTrafficBackbone = cost == 0 && rc.expctxWay.getIsTrafficBackbone() > 0.f; int lastpriorityclassifier = priorityclassifier; priorityclassifier = (int)rc.expctxWay.getPriorityClassifier(); - int classifiermask = (int)rc.expctxWay.getClassifierMask(); // *** add initial cost if the classifier changed float newClassifier = rc.expctxWay.getInitialClassifier(); + float newInitialCost = rc.expctxWay.getInitialcost(); float classifierDiff = newClassifier - lastClassifier; - if ( classifierDiff > 0.0005 || classifierDiff < -0.0005 ) + if ( newClassifier != 0. && lastClassifier != 0. && ( classifierDiff > 0.0005 || classifierDiff < -0.0005 ) ) { - lastClassifier = newClassifier; - float initialcost = rc.expctxWay.getInitialcost(); + float initialcost = rc.inverseDirection ? lastInitialCost : newInitialCost; + if ( initialcost >= 1000000. ) + { + cost = -1; + return; + } + int iicost = (int)initialcost; if ( message != null ) { @@ -156,6 +188,36 @@ abstract class OsmPath implements OsmLinkHolder } cost += iicost; } + lastClassifier = newClassifier; + lastInitialCost = newInitialCost; + + // *** destination logic: no destination access in between + int classifiermask = (int)rc.expctxWay.getClassifierMask(); + boolean newDestination = (classifiermask & 64) != 0; + boolean oldDestination = getBit( IS_ON_DESTINATION_BIT ); + if ( getBit( PATH_START_BIT ) ) + { + setBit( PATH_START_BIT, false ); + setBit( CAN_LEAVE_DESTINATION_BIT, newDestination ); + setBit( HAD_DESTINATION_START_BIT, newDestination ); + } + else + { + if ( oldDestination && !newDestination ) + { + if ( getBit( CAN_LEAVE_DESTINATION_BIT ) ) + { + setBit( CAN_LEAVE_DESTINATION_BIT, false ); + } + else + { + cost = -1; + return; + } + } + } + setBit( IS_ON_DESTINATION_BIT, newDestination ); + OsmTransferNode transferNode = link.geometry == null ? null : rc.geometryDecoder.decodeGeometry( link.geometry, sourceNode, targetNode, isReverse ); diff --git a/brouter-core/src/main/java/btools/router/RoutingEngine.java b/brouter-core/src/main/java/btools/router/RoutingEngine.java index c086069..58e388a 100644 --- a/brouter-core/src/main/java/btools/router/RoutingEngine.java +++ b/brouter-core/src/main/java/btools/router/RoutingEngine.java @@ -902,7 +902,10 @@ public class RoutingEngine extends Thread long currentNodeId = currentNode.getIdFromPos(); long sourceNodeId = sourceNode.getIdFromPos(); - islandNodePairs.addTempPair( sourceNodeId, currentNodeId ); + if ( !path.didEnterDestinationArea() ) + { + islandNodePairs.addTempPair( sourceNodeId, currentNodeId ); + } if ( path.treedepth != 1 ) { diff --git a/misc/profiles2/car-eco.brf b/misc/profiles2/car-eco.brf index bc7a10d..f1ab2e6 100644 --- a/misc/profiles2/car-eco.brf +++ b/misc/profiles2/car-eco.brf @@ -52,6 +52,15 @@ assign caraccess motor_vehicle=yes|permissive|designated|destination motorcar=yes|permissive|designated|destination +assign caraccess_destination + switch motorcar= + switch motor_vehicle= + switch vehicle= + access=destination + vehicle=destination + motor_vehicle=destination + motorcar=destination + assign accessspeedlimit = if caraccess then 999 else 0 assign isbadoneway = if reversedirection=yes then ( if oneway= then junction=roundabout else oneway=yes|true|1 ) else oneway=-1 @@ -150,7 +159,8 @@ assign classifiermask add isbadoneway add multiply isroundabout 4 add multiply islinktype 8 add multiply isgoodforcars 16 - multiply highway=residential|living_street 32 + add multiply highway=residential|living_street 32 + multiply caraccess_destination 64 ---context:node # following code refers to node tags diff --git a/misc/profiles2/car-fast.brf b/misc/profiles2/car-fast.brf index ab6a494..797213a 100644 --- a/misc/profiles2/car-fast.brf +++ b/misc/profiles2/car-fast.brf @@ -52,6 +52,15 @@ assign caraccess motor_vehicle=yes|permissive|designated|destination motorcar=yes|permissive|designated|destination +assign caraccess_destination + switch motorcar= + switch motor_vehicle= + switch vehicle= + access=destination + vehicle=destination + motor_vehicle=destination + motorcar=destination + assign accessspeedlimit = if caraccess then 999 else 0 assign isbadoneway = if reversedirection=yes then ( if oneway= then junction=roundabout else oneway=yes|true|1 ) else oneway=-1 @@ -150,7 +159,8 @@ assign classifiermask add isbadoneway add multiply isroundabout 4 add multiply islinktype 8 add multiply isgoodforcars 16 - multiply highway=residential|living_street 32 + add multiply highway=residential|living_street 32 + multiply caraccess_destination 64 ---context:node # following code refers to node tags From ed0619d93aa5c001bc43a70d1cf7819e805734a1 Mon Sep 17 00:00:00 2001 From: Arndt Brenschede Date: Sun, 8 Jul 2018 12:08:38 +0200 Subject: [PATCH 10/12] locus ETA --- brouter-core/src/main/java/btools/router/VoiceHint.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/brouter-core/src/main/java/btools/router/VoiceHint.java b/brouter-core/src/main/java/btools/router/VoiceHint.java index 86888d5..d6b112d 100644 --- a/brouter-core/src/main/java/btools/router/VoiceHint.java +++ b/brouter-core/src/main/java/btools/router/VoiceHint.java @@ -36,6 +36,11 @@ public class VoiceHint double distanceToNext; int indexInTrack; + public float getTime() + { + return goodWay == null ? 0.f : goodWay.time; + } + float angle; boolean turnAngleConsumed; boolean needsRealTurn; From 53a0aac21d27dd68df30571d3c14bbbf5f68ae7c Mon Sep 17 00:00:00 2001 From: Arndt Brenschede Date: Sun, 8 Jul 2018 12:10:23 +0200 Subject: [PATCH 11/12] locus ETA --- .../src/main/java/btools/router/OsmTrack.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/brouter-core/src/main/java/btools/router/OsmTrack.java b/brouter-core/src/main/java/btools/router/OsmTrack.java index dfb9d5b..0611abb 100644 --- a/brouter-core/src/main/java/btools/router/OsmTrack.java +++ b/brouter-core/src/main/java/btools/router/OsmTrack.java @@ -421,14 +421,25 @@ public final class OsmTrack if ( turnInstructionMode == 2 ) // locus style { + float lastRteTime = 0.f; + for( VoiceHint hint: voiceHints.list ) { sb.append( " " ) .append( hint.selev == Short.MIN_VALUE ? "" : "" + (hint.selev / 4.) + "" ) .append( "" ).append( hint.getMessageString() ).append( "" ) - .append( "" ).append( "" + hint.distanceToNext ).append( "" ) - .append( "" ).append( "" + hint.getLocusAction() ).append( "" ) + .append( "" ).append( "" + hint.distanceToNext ).append( "" ); + float rteTime = hint.getTime(); + if ( rteTime != lastRteTime ) // add timing only if available + { + double t = rteTime - lastRteTime; + double speed = hint.distanceToNext / t; + sb.append( "" ).append( "" + t ).append( "" ) + .append( "" ).append( "" + speed ).append( "" ); + lastRteTime = rteTime; + } + sb.append( "" ).append( "" + hint.getLocusAction() ).append( "" ) .append( "\n" ); } } From 195a39ed0c5d4f9f64d73d05195f858d489e5f09 Mon Sep 17 00:00:00 2001 From: Arndt Brenschede Date: Sun, 8 Jul 2018 12:30:55 +0200 Subject: [PATCH 12/12] suspect-manager: profile per country --- .../src/main/java/btools/server/SuspectManager.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/brouter-server/src/main/java/btools/server/SuspectManager.java b/brouter-server/src/main/java/btools/server/SuspectManager.java index 59635f4..621fe0f 100644 --- a/brouter-server/src/main/java/btools/server/SuspectManager.java +++ b/brouter-server/src/main/java/btools/server/SuspectManager.java @@ -185,8 +185,17 @@ public class SuspectManager extends Thread double dlon = ( ilon - 180000000 ) / 1000000.; double dlat = ( ilat - 90000000 ) / 1000000.; + String profile = "car-eco"; + File configFile = new File( "configs/" + country + ".cfg" ); + if ( configFile.exists() ) + { + BufferedReader br = new BufferedReader( new FileReader( configFile ) ); + profile = br.readLine(); + br.close(); + } + String url1 = "http://brouter.de/brouter-web/#zoom=18&lat=" + dlat + "&lon=" + dlon - + "&layer=OpenStreetMap&lonlats=" + dlon + "," + dlat + "&profile=car-eco-de"; + + "&layer=OpenStreetMap&lonlats=" + dlon + "," + dlat + "&profile=" + profile; // String url1 = "http://localhost:8080/brouter-web/#map=18/" + dlat + "/" // + dlon + "/Mapsforge Tile Server&lonlats=" + dlon + "," + dlat;