As per OSM Wiki, it expects vehicle classes to be separated with ';'

Works in mapsource, not tried on a real GPS.

Doesn't appear to work for either pedestrians or emergency vehicles.

diff --git a/src/uk/me/parabola/imgfmt/app/net/RouteRestriction.java b/src/uk/me/parabola/imgfmt/app/net/RouteRestriction.java
index ee51bad..ba5691b 100644
--- a/src/uk/me/parabola/imgfmt/app/net/RouteRestriction.java
+++ b/src/uk/me/parabola/imgfmt/app/net/RouteRestriction.java
@@ -56,16 +56,27 @@ public class RouteRestriction {
 	// last restriction in a node
 	private boolean last;
 
+	// mask that specifies which vehicle types the restriction doesn't apply to
+	private final byte exceptMask;
+
+	public final static byte EXCEPT_CAR      = 0x01;
+	public final static byte EXCEPT_BUS      = 0x02;
+	public final static byte EXCEPT_TAXI     = 0x04;
+	public final static byte EXCEPT_DELIVERY = 0x10;
+	public final static byte EXCEPT_BICYCLE  = 0x20;
+	public final static byte EXCEPT_TRUCK    = 0x40;
+
 	/**
 	 * Create a route restriction.
 	 *
 	 * @param from The inverse arc of "from" arc.
 	 * @param to The "to" arc.
 	 */
-	public RouteRestriction(RouteArc from, RouteArc to) {
+	public RouteRestriction(RouteArc from, RouteArc to, byte exceptMask) {
 		assert from.getSource().equals(to.getSource()) : "arcs in restriction don't meet";
 		this.from = from;
 		this.to = to;
+		this.exceptMask = exceptMask;
 	}
 
 	private int calcOffset(RouteNode node, int tableOffset) {
@@ -82,7 +93,16 @@ public class RouteRestriction {
 	 * @param tableOffset The offset in NOD 1 of the tables area.
 	 */
 	public void write(ImgFileWriter writer, int tableOffset) {
-		writer.put3(HEADER);
+		int header = HEADER;
+
+		if(exceptMask != 0)
+			header |= 0x0800;
+
+		writer.put3(header);
+
+		if(exceptMask != 0)
+			writer.put(exceptMask);
+
 		int[] offsets = new int[3];
 
 		if (from.isInternal())
@@ -125,7 +145,10 @@ public class RouteRestriction {
 	 * Size in bytes of the Table C entry.
 	 */
 	public int getSize() {
-		return SIZE;
+		int size = SIZE;
+		if(exceptMask != 0)
+			++size;
+		return size;
 	}
 
 	public void setOffsetC(int offsetC) {
diff --git a/src/uk/me/parabola/mkgmap/general/RoadNetwork.java b/src/uk/me/parabola/mkgmap/general/RoadNetwork.java
index 0c45d68..8506381 100644
--- a/src/uk/me/parabola/mkgmap/general/RoadNetwork.java
+++ b/src/uk/me/parabola/mkgmap/general/RoadNetwork.java
@@ -182,7 +182,7 @@ public class RoadNetwork {
 		return boundary;
 	}
 
-	public void addRestriction(CoordNode fromNode, CoordNode toNode, CoordNode viaNode) {
+	public void addRestriction(CoordNode fromNode, CoordNode toNode, CoordNode viaNode, byte exceptMask) {
 		RouteNode fn = nodes.get(fromNode.getId());
 		RouteNode tn = nodes.get(toNode.getId());
 		RouteNode vn = nodes.get(viaNode.getId());
@@ -197,7 +197,7 @@ public class RoadNetwork {
 		assert fa != null : "can't locate arc from 'via' node to 'from' node";
 		assert ta != null : "can't locate arc from 'via' node to 'to' node";
 
-		vn.addRestriction(new RouteRestriction(fa, ta));
+		vn.addRestriction(new RouteRestriction(fa, ta, exceptMask));
     }
 
 }
diff --git a/src/uk/me/parabola/mkgmap/reader/osm/RestrictionRelation.java b/src/uk/me/parabola/mkgmap/reader/osm/RestrictionRelation.java
index e00f677..6fafaa2 100644
--- a/src/uk/me/parabola/mkgmap/reader/osm/RestrictionRelation.java
+++ b/src/uk/me/parabola/mkgmap/reader/osm/RestrictionRelation.java
@@ -7,6 +7,7 @@ import java.util.Map;
 
 import uk.me.parabola.imgfmt.app.Coord;
 import uk.me.parabola.imgfmt.app.CoordNode;
+import uk.me.parabola.imgfmt.app.net.RouteRestriction;
 import uk.me.parabola.log.Logger;
 import uk.me.parabola.mkgmap.general.RoadNetwork;
 
@@ -28,6 +29,7 @@ public class RestrictionRelation extends Relation {
     private CoordNode toNode;
     private CoordNode viaNode;
     private final List<CoordNode> otherNodes = new ArrayList<CoordNode>();
+	private byte exceptMask;
     private final String messagePrefix;
 
 	/**
@@ -105,7 +107,6 @@ public class RestrictionRelation extends Relation {
 		restriction = getTag("restriction");
 
 		String[] unsupportedTags = {
-		    "except",
 		    "day_on",
 		    "day_off",
 		    "hour_on",
@@ -115,6 +116,29 @@ public class RestrictionRelation extends Relation {
 				log.warn(messagePrefix + "ignoring unsupported '" + unsupportedTag + "' tag");
 			}
 		}
+
+		String except = getTag("except");
+		if(except == null)
+			except = getTag("exception"); // be nice
+		if(except != null) {
+			for(String e : except.split(";")) {
+				e = e.trim();
+				if(e.equals("motorcar") || e.equals("motorcycle"))
+					exceptMask |= RouteRestriction.EXCEPT_CAR;
+				else if(e.equals("psv") || e.equals("bus"))
+					exceptMask |= RouteRestriction.EXCEPT_BUS;
+				else if(e.equals("taxi"))
+					exceptMask |= RouteRestriction.EXCEPT_TAXI;
+				else if(e.equals("delivery") || e.equals("goods"))
+					exceptMask |= RouteRestriction.EXCEPT_DELIVERY;
+				else if(e.equals("bicycle"))
+					exceptMask |= RouteRestriction.EXCEPT_BICYCLE;
+				else if(e.equals("hgv") || e.equals("truck"))
+					exceptMask |= RouteRestriction.EXCEPT_TRUCK;
+				else
+					log.warn(messagePrefix + "ignoring unsupported vehicle class '" + e + "' in turn restriction exception");
+			}
+		}
 	}
 
 	public Way getFromWay() {
@@ -236,7 +260,7 @@ public class RestrictionRelation extends Relation {
 		   restriction.equals("no_straight_on") ||
 		   restriction.equals("no_u_turn") ||
 		   restriction.startsWith("no_turn")) {
-			roadNetwork.addRestriction(fromNode, toNode, viaNode);
+			roadNetwork.addRestriction(fromNode, toNode, viaNode, exceptMask);
 			if(restriction.startsWith("no_turn"))
 				log.warn(messagePrefix + "has bad type '" + restriction + "' it should be of the form no_X_turn rather than no_turn_X - I added the restriction anyway at " + viaNode.toDegreeString() + " (blocked routing to " + toNode.toDegreeString() + ")");
 			else
@@ -246,7 +270,7 @@ public class RestrictionRelation extends Relation {
 			restriction.equals("only_right_turn") ||
 			restriction.equals("only_straight_on")) {
 			for(CoordNode otherNode : otherNodes) {
-				roadNetwork.addRestriction(fromNode, otherNode, viaNode);
+				roadNetwork.addRestriction(fromNode, otherNode, viaNode, exceptMask);
 				log.info(messagePrefix + "(" + restriction + ") added at " + viaNode.toDegreeString() + " (blocked routing to " + otherNode.toDegreeString() + ")");
 			}
 		}
_______________________________________________
mkgmap-dev mailing list
mkgmap-dev@lists.mkgmap.org.uk
http://www.mkgmap.org.uk/mailman/listinfo/mkgmap-dev

Reply via email to