v3 - hopefully, now works again after being broken by the round coords
filter.
---------
v2 - based on r1402.
-----------
Hi Felix,
Please try the attached patch. I've tested it inasmuch that it doesn't
blow up but whether it actually does the right thing when you have a
routable and non-routable way from the same set of points, I don't know.
Cheers,
Mark
diff --git a/src/uk/me/parabola/imgfmt/app/Coord.java b/src/uk/me/parabola/imgfmt/app/Coord.java
index 335284d..788f058 100644
--- a/src/uk/me/parabola/imgfmt/app/Coord.java
+++ b/src/uk/me/parabola/imgfmt/app/Coord.java
@@ -39,6 +39,7 @@ public class Coord implements Comparable<Coord> {
private final int longitude;
private byte highwayCount; // number of highways that use this point
private boolean onBoundary; // true if point lies on a boundary
+ private boolean locatedAtNode; // true if point is located at a routing node
/**
* Construct from co-ordinates that are already in map-units.
@@ -90,6 +91,14 @@ public class Coord implements Comparable<Coord> {
this.onBoundary = onBoundary;
}
+ public boolean locatedAtNode() {
+ return locatedAtNode;
+ }
+
+ public void locatedAtNode(boolean locatedAtNode) {
+ this.locatedAtNode = locatedAtNode;
+ }
+
public int hashCode() {
return latitude+longitude;
}
diff --git a/src/uk/me/parabola/imgfmt/app/CoordNode.java b/src/uk/me/parabola/imgfmt/app/CoordNode.java
index ebcfd58..1207e55 100644
--- a/src/uk/me/parabola/imgfmt/app/CoordNode.java
+++ b/src/uk/me/parabola/imgfmt/app/CoordNode.java
@@ -24,8 +24,6 @@ package uk.me.parabola.imgfmt.app;
*/
public class CoordNode extends Coord {
private final long id;
- //private int roadCount;
- private final boolean boundary;
/**
* Construct from co-ordinates that are already in map-units.
@@ -38,14 +36,11 @@ public class CoordNode extends Coord {
public CoordNode(int latitude, int longitude, long id, boolean boundary) {
super(latitude, longitude);
this.id = id;
- this.boundary = boundary;
+ setOnBoundary(boundary);
+ locatedAtNode(true);
}
public long getId() {
return id;
}
-
- public boolean isBoundary() {
- return boundary;
- }
}
diff --git a/src/uk/me/parabola/imgfmt/app/net/RouteNode.java b/src/uk/me/parabola/imgfmt/app/net/RouteNode.java
index b8ffdcc..4ea1e03 100644
--- a/src/uk/me/parabola/imgfmt/app/net/RouteNode.java
+++ b/src/uk/me/parabola/imgfmt/app/net/RouteNode.java
@@ -80,7 +80,7 @@ public class RouteNode implements Comparable<RouteNode> {
public RouteNode(Coord coord) {
this.coord = (CoordNode) coord;
nodeId = nodeCount++; // XXX: take coord.getId() instead?
- setBoundary(this.coord.isBoundary());
+ setBoundary(this.coord.getOnBoundary());
}
private boolean haveLargeOffsets() {
diff --git a/src/uk/me/parabola/mkgmap/filters/DouglasPeuckerFilter.java b/src/uk/me/parabola/mkgmap/filters/DouglasPeuckerFilter.java
index 9a9c141..513bf2f 100644
--- a/src/uk/me/parabola/mkgmap/filters/DouglasPeuckerFilter.java
+++ b/src/uk/me/parabola/mkgmap/filters/DouglasPeuckerFilter.java
@@ -79,7 +79,7 @@ public class DouglasPeuckerFilter implements MapFilter {
// If a node in the line use the douglas peucker algorithm for upper segment
// TODO: Should consider only nodes connected to roads visible at current resolution.
- if (p instanceof CoordNode) {
+ if (p.locatedAtNode()) {
douglasPeucker(coords, i, endIndex, maxErrorDistance);
endIndex = i;
}
diff --git a/src/uk/me/parabola/mkgmap/filters/RoundCoordsFilter.java b/src/uk/me/parabola/mkgmap/filters/RoundCoordsFilter.java
index 2cdb95b..c5d4223 100644
--- a/src/uk/me/parabola/mkgmap/filters/RoundCoordsFilter.java
+++ b/src/uk/me/parabola/mkgmap/filters/RoundCoordsFilter.java
@@ -53,7 +53,7 @@ public class RoundCoordsFilter implements MapFilter {
int lon = (p.getLongitude() + half) & mask;
Coord newP;
if(p instanceof CoordNode)
- newP = new CoordNode(lat, lon, ((CoordNode)p).getId(), ((CoordNode)p).isBoundary());
+ newP = new CoordNode(lat, lon, ((CoordNode)p).getId(), p.getOnBoundary());
else
newP = new Coord(lat, lon);
// only add the new point if it has different
@@ -65,6 +65,14 @@ public class RoundCoordsFilter implements MapFilter {
newPoints.add(newP);
lastP = newP;
}
+ else if(newP.locatedAtNode()) {
+ // this point is not going to be used because it
+ // has the same (rounded) coordinates as the last
+ // node but it has been marked as being located at
+ // a node so transfer that property to the
+ // previous point so that it's not lost
+ lastP.locatedAtNode(true);
+ }
}
if(newPoints.size() > 1) {
newLine.setPoints(newPoints);
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 549b1bf..158118d 100644
--- a/src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5XmlHandler.java
+++ b/src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5XmlHandler.java
@@ -746,6 +746,7 @@ class Osm5XmlHandler extends DefaultHandler {
// or are closer than the minimum distance
// allowed but they are not the same point
// object
+ p.locatedAtNode(true);
if(p != previousNode &&
(p.equals(previousNode) ||
(minArcLength > 0 &&
_______________________________________________
mkgmap-dev mailing list
[email protected]
http://www.mkgmap.org.uk/mailman/listinfo/mkgmap-dev