From f15c5b923e411a38db3cb3937fc9bf29bad89494 Mon Sep 17 00:00:00 2001 From: Arndt Date: Sat, 10 Dec 2016 19:49:24 +0100 Subject: [PATCH] tr bike exceptions --- .../main/java/btools/codec/MicroCache2.java | 21 ++++++++++++++++--- .../src/main/java/btools/router/OsmPath.java | 3 ++- .../java/btools/mapcreator/OsmCutter.java | 19 +++++++++++++++++ .../main/java/btools/mapcreator/OsmNodeP.java | 1 + .../btools/mapcreator/RestrictionData.java | 3 +++ .../main/java/btools/mapaccess/OsmFile.java | 6 +++++- .../main/java/btools/mapaccess/OsmNode.java | 1 + .../btools/mapaccess/TurnRestriction.java | 6 ++++++ 8 files changed, 55 insertions(+), 5 deletions(-) diff --git a/brouter-codec/src/main/java/btools/codec/MicroCache2.java b/brouter-codec/src/main/java/btools/codec/MicroCache2.java index e12418c..b118162 100644 --- a/brouter-codec/src/main/java/btools/codec/MicroCache2.java +++ b/brouter-codec/src/main/java/btools/codec/MicroCache2.java @@ -88,15 +88,23 @@ public final class MicroCache2 extends MicroCache int ilat = alat[n]; // future escapes (turn restrictions?) + short trExceptions = 0; for(;;) { int featureId = bc.decodeVarBits(); if ( featureId == 0 ) break; int bitsize = bc.decodeNoisyNumber( 5 ); - if ( featureId == 1 ) // turn-restriction + if ( featureId == 2 ) // exceptions to turn-restriction + { + trExceptions = (short)bc.decodeBounded( 1023 ); + } + else if ( featureId == 1 ) // turn-restriction { writeBoolean( true ); + writeShort( trExceptions ); // exceptions from previous feature + trExceptions = 0; + writeBoolean( bc.decodeBit() ); // isPositive writeInt( ilon + bc.decodeNoisyDiff( 10 ) ); // fromLon writeInt( ilat + bc.decodeNoisyDiff( 10 ) ); // fromLat @@ -364,8 +372,15 @@ public final class MicroCache2 extends MicroCache // write turn restrictions while( readBoolean() ) { - bc.encodeVarBits( 1 ); // 1 = extra-data type : turn-restriction - bc.encodeNoisyNumber( restrictionBits.getNext(), 5 ); // bit-count using looku-ahead fifo + short exceptions = readShort(); // except bikes, psv, ... + if ( exceptions != 0 ) + { + bc.encodeVarBits( 2 ); // 2 = tr exceptions + bc.encodeNoisyNumber( 10 , 5 ); // bit-count + bc.encodeBounded( 1023 , exceptions & 1023 ); + } + bc.encodeVarBits( 1 ); // 1 = turn restriction + bc.encodeNoisyNumber( restrictionBits.getNext(), 5 ); // bit-count using look-ahead fifo long b0 = bc.getWritingBitPosition(); bc.encodeBit( readBoolean() ); // isPositive bc.encodeNoisyDiff( readInt() - ilon, 10 ); // fromLon diff --git a/brouter-core/src/main/java/btools/router/OsmPath.java b/brouter-core/src/main/java/btools/router/OsmPath.java index 3d4bb12..77fd85a 100644 --- a/brouter-core/src/main/java/btools/router/OsmPath.java +++ b/brouter-core/src/main/java/btools/router/OsmPath.java @@ -216,7 +216,8 @@ final class OsmPath implements OsmLinkHolder TurnRestriction tr = sourceNode.firstRestriction; while( tr != null ) { - if ( tr.fromLon == lon0 && tr.fromLat == lat0 ) + boolean trValid = ! (tr.exceptBikes() && rc.bikeMode); + if ( trValid && tr.fromLon == lon0 && tr.fromLat == lat0 ) { if ( tr.isPositive ) { diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/OsmCutter.java b/brouter-map-creator/src/main/java/btools/mapcreator/OsmCutter.java index 173cff0..47d4c60 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/OsmCutter.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/OsmCutter.java @@ -224,9 +224,23 @@ public class OsmCutter extends MapCreatorBase { return; } + + short exceptions = 0; + String except = r.getTag( "except" ); + if ( except != null ) + { + exceptions |= toBit( "bicycle" , 0, except ); + exceptions |= toBit( "motorcar" , 1, except ); + exceptions |= toBit( "agricultural" , 2, except ); + exceptions |= toBit( "forestry" , 2, except ); + exceptions |= toBit( "psv" , 3, except ); + exceptions |= toBit( "hgv" , 4, except ); + } + // System.out.println( "restriction id = " + r.rid + " isPositive=" + isPositive + " fromWid = " + fromWid + " toWid = " + toWid+ " viaNid = " + viaNid ); RestrictionData res = new RestrictionData(); res.isPositive = isPositive; + res.exceptions = exceptions; res.fromWid = fromWid; res.toWid = toWid; res.viaNid = viaNid; @@ -234,6 +248,11 @@ public class OsmCutter extends MapCreatorBase } + private static short toBit( String tag, int bitpos, String s ) + { + return (short) ( s.indexOf( tag ) < 0 ? 0 : 1 << bitpos ); + } + private int getTileIndex( int ilon, int ilat ) { int lon = ilon / 45000000; diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/OsmNodeP.java b/brouter-map-creator/src/main/java/btools/mapcreator/OsmNodeP.java index 004a7fd..486a347 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/OsmNodeP.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/OsmNodeP.java @@ -175,6 +175,7 @@ public class OsmNodeP extends OsmLinkP while( r != null ) { mc.writeBoolean( true ); // restriction follows + mc.writeShort( r.exceptions ); mc.writeBoolean( r.isPositive ); mc.writeInt( r.fromLon ); mc.writeInt( r.fromLat ); diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/RestrictionData.java b/brouter-map-creator/src/main/java/btools/mapcreator/RestrictionData.java index 9784287..72ac0d4 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/RestrictionData.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/RestrictionData.java @@ -13,6 +13,7 @@ import btools.util.LongList; public class RestrictionData extends MapCreatorBase { public boolean isPositive; + public short exceptions; public long fromWid; public long toWid; public long viaNid; @@ -31,6 +32,7 @@ public class RestrictionData extends MapCreatorBase public RestrictionData( DataInputStream di ) throws Exception { isPositive = di.readBoolean(); + exceptions = di.readShort(); fromWid = readId( di ); toWid = readId( di ); viaNid = readId( di ); @@ -39,6 +41,7 @@ public class RestrictionData extends MapCreatorBase public void writeTo( DataOutputStream dos ) throws Exception { dos.writeBoolean( isPositive ); + dos.writeShort( exceptions ); writeId( dos, fromWid ); writeId( dos, toWid ); writeId( dos, viaNid ); diff --git a/brouter-mapaccess/src/main/java/btools/mapaccess/OsmFile.java b/brouter-mapaccess/src/main/java/btools/mapaccess/OsmFile.java index 1ad7e66..9f4461f 100644 --- a/brouter-mapaccess/src/main/java/btools/mapaccess/OsmFile.java +++ b/brouter-mapaccess/src/main/java/btools/mapaccess/OsmFile.java @@ -149,7 +149,11 @@ final class OsmFile int crcData = Crc32.crc( ab, 0, asize - 4 ); int crcFooter = new ByteDataReader( ab, asize - 4 ).readInt(); - if ( ( crcData ^ 2 ) == crcFooter ) + if ( crcData == crcFooter ) + { + throw new IOException( "old, unsupported data-format" ); + } + else if ( ( crcData ^ 2 ) == crcFooter ) { return reallyDecode ? new MicroCache2( dataBuffers, lonIdx, latIdx, divisor, wayValidator, waypointMatcher ) : null; } diff --git a/brouter-mapaccess/src/main/java/btools/mapaccess/OsmNode.java b/brouter-mapaccess/src/main/java/btools/mapaccess/OsmNode.java index 41504cc..3dc6e57 100644 --- a/brouter-mapaccess/src/main/java/btools/mapaccess/OsmNode.java +++ b/brouter-mapaccess/src/main/java/btools/mapaccess/OsmNode.java @@ -136,6 +136,7 @@ public class OsmNode extends OsmLink implements OsmPos while( mc.readBoolean() ) { TurnRestriction tr = new TurnRestriction(); + tr.exceptions = mc.readShort(); tr.isPositive = mc.readBoolean(); tr.fromLon = mc.readInt(); tr.fromLat = mc.readInt(); diff --git a/brouter-mapaccess/src/main/java/btools/mapaccess/TurnRestriction.java b/brouter-mapaccess/src/main/java/btools/mapaccess/TurnRestriction.java index d8924fc..0764f70 100644 --- a/brouter-mapaccess/src/main/java/btools/mapaccess/TurnRestriction.java +++ b/brouter-mapaccess/src/main/java/btools/mapaccess/TurnRestriction.java @@ -8,6 +8,7 @@ package btools.mapaccess; public final class TurnRestriction { public boolean isPositive; + public short exceptions; public int fromLon; public int fromLat; @@ -17,6 +18,11 @@ public final class TurnRestriction public TurnRestriction next; + public boolean exceptBikes() + { + return ( exceptions & 1 ) != 0; + } + @Override public String toString() {