What we want is that the result of RouteArc.convertMeters() is not less than 1. So with the values it has at the moment that requires a min arc length of 4.878 metres. If we set the default to 5m, we should be chuckling.
It could look like the attached patch.
diff --git a/resources/help/en/options b/resources/help/en/options index 9bbfad7..ceb1921 100644 --- a/resources/help/en/options +++ b/resources/help/en/options @@ -182,11 +182,15 @@ Miscellaneous options: in which they appear in the OSM input. Without this option, the order in which the elements are processed is not defined. ---remove-short-arcs[=MinLength] - Merge nodes to remove short arcs that can cause routing - problems. If MinLength is specified (in metres), arcs shorter - than that length will be removed. If a length is not - specified, only zero-length arcs will be removed. +--remove-short-arcs (a) +--remove-short-arcs=MinLength (b) +--remove-short-arcs=no (c) + If routing is enabled, arcs shorter than 5m will be removed + to avoid routing problems. This behaviour can be modified with + this option. It has three variants: + (a) turn on short arc removal even if routing is not enabled. + (b) explicitly specify the minimum arc length (no 'm' suffix). + (c) completely disable short arc removal. --road-name-pois[=GarminCode] Generate a POI for each named road. By default, the POIs' diff --git a/src/uk/me/parabola/imgfmt/app/net/RouteArc.java b/src/uk/me/parabola/imgfmt/app/net/RouteArc.java index 1a0968d..b268b17 100644 --- a/src/uk/me/parabola/imgfmt/app/net/RouteArc.java +++ b/src/uk/me/parabola/imgfmt/app/net/RouteArc.java @@ -184,7 +184,7 @@ public class RouteArc { return b; } - private static int convertMeters(double l) { + public static int convertMeters(double l) { // XXX: really a constant factor? // this factor derived by looking at a variety // of arcs in an IMG of Berlin; 1/4 of diff --git a/src/uk/me/parabola/mkgmap/general/RoadNetwork.java b/src/uk/me/parabola/mkgmap/general/RoadNetwork.java index 0c45d68..82f7488 100644 --- a/src/uk/me/parabola/mkgmap/general/RoadNetwork.java +++ b/src/uk/me/parabola/mkgmap/general/RoadNetwork.java @@ -105,7 +105,7 @@ public class RoadNetwork { log.error("Road " + road.getRoadDef().getName() + " (OSM id " + road.getRoadDef().getId() + ") contains consecutive identical nodes - routing will be broken"); log.error(" " + co.toOSMURL()); } - else if(arcLength == 0) { + else if(RouteArc.convertMeters(arcLength) == 0) { log.error("Road " + road.getRoadDef().getName() + " (OSM id " + road.getRoadDef().getId() + ") contains zero length arc"); log.error(" " + co.toOSMURL()); } diff --git a/src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5XmlHandler.java b/src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5XmlHandler.java index e350483..025573c 100644 --- a/src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5XmlHandler.java +++ b/src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5XmlHandler.java @@ -107,8 +107,13 @@ class Osm5XmlHandler extends DefaultHandler { ignoreBounds = props.getProperty("ignore-osm-bounds", false); routing = props.containsKey("route"); String rsa = props.getProperty("remove-short-arcs", null); - if(rsa != null) - minimumArcLength = (rsa.length() > 0)? Double.parseDouble(rsa) : 0.0; + final double DEFAULT_MIN_ARC_LENGTH = 5; + if("no".equals(rsa)) + minimumArcLength = null; + else if(rsa != null) + minimumArcLength = (rsa.length() > 0)? Double.parseDouble(rsa) : DEFAULT_MIN_ARC_LENGTH; + else if(routing) + minimumArcLength = DEFAULT_MIN_ARC_LENGTH; else minimumArcLength = null; frigRoundabouts = props.getProperty("frig-roundabouts"); @@ -500,6 +505,7 @@ class Osm5XmlHandler extends DefaultHandler { Map<Coord, Integer> arcCounts = new IdentityHashMap<Coord, Integer>(); int numWaysDeleted = 0; int numNodesMerged = 0; + log.info("Removing short arcs (min arc length = " + minArcLength + "m)"); log.info("Removing short arcs - counting arcs"); for(Way w : wayMap.values()) { List<Coord> points = w.getPoints();
_______________________________________________ mkgmap-dev mailing list mkgmap-dev@lists.mkgmap.org.uk http://www.mkgmap.org.uk/mailman/listinfo/mkgmap-dev