From e8d8bc084a18da620da6be9136c31558ea2622dc Mon Sep 17 00:00:00 2001 From: Arndt Date: Sun, 1 May 2016 11:51:42 +0200 Subject: [PATCH] voice hints, here: cf=9999 survive decoder --- .../main/java/btools/codec/MicroCache2.java | 9 +++++---- .../main/java/btools/codec/TagValueCoder.java | 12 ++++++++---- .../java/btools/codec/TagValueValidator.java | 4 ++-- .../java/btools/codec/TagValueWrapper.java | 12 ++++++++++++ .../src/main/java/btools/router/OsmPath.java | 2 +- .../expressions/BExpressionContextWay.java | 18 ++++++++++++------ 6 files changed, 40 insertions(+), 17 deletions(-) create mode 100644 brouter-codec/src/main/java/btools/codec/TagValueWrapper.java diff --git a/brouter-codec/src/main/java/btools/codec/MicroCache2.java b/brouter-codec/src/main/java/btools/codec/MicroCache2.java index f6971ea..d149f0e 100644 --- a/brouter-codec/src/main/java/btools/codec/MicroCache2.java +++ b/brouter-codec/src/main/java/btools/codec/MicroCache2.java @@ -95,7 +95,8 @@ public final class MicroCache2 extends MicroCache selev += nodeEleDiff.decodeSignedValue(); writeShort( (short) selev ); - writeVarBytes( nodeTagCoder.decodeTagValueSet() ); + TagValueWrapper nodeTags = nodeTagCoder.decodeTagValueSet(); + writeVarBytes( nodeTags == null ? null : nodeTags.data ); int links = bc.decodeNoisyNumber( 1 ); if ( debug ) System.out.println( "*** decoding node with links=" + links ); @@ -120,7 +121,7 @@ public final class MicroCache2 extends MicroCache writeVarLengthSigned( dlon_remaining = extLonDiff.decodeSignedValue() ); writeVarLengthSigned( dlat_remaining = extLatDiff.decodeSignedValue() ); } - byte[] wayTags = wayTagCoder.decodeTagValueSet(); + TagValueWrapper wayTags = wayTagCoder.decodeTagValueSet(); if ( wayTags != null ) { @@ -133,10 +134,10 @@ public final class MicroCache2 extends MicroCache } } - writeModeAndDesc( isReverse, wayTags ); + writeModeAndDesc( isReverse, wayTags == null ? null : wayTags.data ); if ( !isReverse ) // write geometry for forward links only { - WaypointMatcher matcher = wayTags == null ? null : waypointMatcher; + WaypointMatcher matcher = wayTags == null || wayTags.accessType < 2 ? null : waypointMatcher; if ( matcher != null ) matcher.startNode( ilon, ilat ); int ilontarget = ilon + dlon_remaining; int ilattarget = ilat + dlat_remaining; diff --git a/brouter-codec/src/main/java/btools/codec/TagValueCoder.java b/brouter-codec/src/main/java/btools/codec/TagValueCoder.java index 595db7e..63b564e 100644 --- a/brouter-codec/src/main/java/btools/codec/TagValueCoder.java +++ b/brouter-codec/src/main/java/btools/codec/TagValueCoder.java @@ -46,7 +46,7 @@ public final class TagValueCoder } } - public byte[] decodeTagValueSet() + public TagValueWrapper decodeTagValueSet() { Object node = tree; while (node instanceof TreeNode) @@ -55,7 +55,7 @@ public final class TagValueCoder boolean nextBit = bc.decodeBit(); node = nextBit ? tn.child2 : tn.child1; } - return (byte[]) node; + return (TagValueWrapper) node; } public void encodeDictionary( BitCoderContext bc ) @@ -120,9 +120,13 @@ public final class TagValueCoder byte[] res = new byte[len]; System.arraycopy( buffer, 0, res, 0, len ); - if ( validator == null || validator.accessAllowed( res ) ) + int accessType = validator == null ? 2 : validator.accessType( res ); + if ( accessType > 0 ) { - return res; + TagValueWrapper w = new TagValueWrapper(); + w.data = res; + w.accessType = accessType; + return w; } return null; } diff --git a/brouter-codec/src/main/java/btools/codec/TagValueValidator.java b/brouter-codec/src/main/java/btools/codec/TagValueValidator.java index 7c7693e..6e0bf3a 100644 --- a/brouter-codec/src/main/java/btools/codec/TagValueValidator.java +++ b/brouter-codec/src/main/java/btools/codec/TagValueValidator.java @@ -5,7 +5,7 @@ public interface TagValueValidator { /** * @param tagValueSet the way description to check - * @return true if access is allowed in the current profile + * @return 0 = nothing, 1=no matching, 2=normal */ - public boolean accessAllowed( byte[] tagValueSet ); + public int accessType( byte[] tagValueSet ); } diff --git a/brouter-codec/src/main/java/btools/codec/TagValueWrapper.java b/brouter-codec/src/main/java/btools/codec/TagValueWrapper.java new file mode 100644 index 0000000..4839922 --- /dev/null +++ b/brouter-codec/src/main/java/btools/codec/TagValueWrapper.java @@ -0,0 +1,12 @@ +package btools.codec; + + +/** + * TagValueWrapper wrapps a description bitmap + * to add the access-type + */ +public final class TagValueWrapper +{ + public byte[] data; + public int accessType; +} diff --git a/brouter-core/src/main/java/btools/router/OsmPath.java b/brouter-core/src/main/java/btools/router/OsmPath.java index 133423a..a4afef2 100644 --- a/brouter-core/src/main/java/btools/router/OsmPath.java +++ b/brouter-core/src/main/java/btools/router/OsmPath.java @@ -304,7 +304,7 @@ final class OsmPath implements OsmLinkHolder } float fcost = dist * costfactor + 0.5f; - if ( ( costfactor > 9999. && !detailMode ) || fcost + cost >= 2000000000. ) + if ( ( costfactor > 9998. && !detailMode ) || fcost + cost >= 2000000000. ) { cost = -1; return; diff --git a/brouter-expressions/src/main/java/btools/expressions/BExpressionContextWay.java b/brouter-expressions/src/main/java/btools/expressions/BExpressionContextWay.java index 9110ff5..7d9cbd9 100644 --- a/brouter-expressions/src/main/java/btools/expressions/BExpressionContextWay.java +++ b/brouter-expressions/src/main/java/btools/expressions/BExpressionContextWay.java @@ -49,13 +49,19 @@ public final class BExpressionContextWay extends BExpressionContext implements T } @Override - public boolean accessAllowed( byte[] description ) + public int accessType( byte[] description ) { evaluate( false, description, null ); - boolean ok = getCostfactor() < 10000.; - evaluate( true, description, null ); - ok |= getCostfactor() < 10000.; - return ok; + float minCostFactor = getCostfactor(); + if ( minCostFactor >= 9999.f ) + { + evaluate( true, description, null ); + float reverseCostFactor = getCostfactor(); + if ( reverseCostFactor < minCostFactor ) + { + minCostFactor = reverseCostFactor; + } + } + return minCostFactor < 9999.f ? 2 : minCostFactor < 10000.f ? 1 : 0; } - }