[josm-dev] Validator patch for overlapping ways

Dave Hansen dave at sr71.net
Wed May 21 16:50:56 BST 2008


On Wed, 2008-05-21 at 20:34 +1000, Roy Rankin wrote:
> I have submitted a patch to TRAC, ticket 774. The following is from
> the 
> report:

Could you post here, too?

I've been doing some hacking on it as well, to the same end.  I also
added the ability to fix a small class of these overlapping ways in an
automated fashion.

If you post your patch, I'll give it a shot the next time I bring up
JOSM.  We really need to get this stuff integrated.

--- OverlappingWays.java	(revision 7656)
+++ OverlappingWays.java	(working copy)
@@ -2,10 +2,11 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
-import java.util.ArrayList;
 
-import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.command.*;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.WaySegment;
@@ -44,36 +45,124 @@
 		nodePairs = new Bag<Pair<Node,Node>, WaySegment>(1000);
 	}
 
+    @Override
+    public Command fixError(TestError testError)
+    {
+		Way w1 = (Way)testError.getPrimitives().get(0); 
+		Way w2 = (Way)testError.getPrimitives().get(1); 
+        
+		Collection<OsmPrimitive> primitives = new ArrayList<OsmPrimitive>();;
+		// we want to delete the smaller one
+		if (w1.nodes.size() >= w2.nodes.size())
+			primitives.add(w2);
+		else
+			primitives.add(w1);
+
+        List<Command> cmds = new ArrayList<Command>();
+        cmds.add(new DeleteCommand(primitives));
+       	return new SequenceCommand(tr("Delete Ways"), cmds);
+    }
+
+	public boolean isSubWay(Way little, Way big)
+	{
+		if (little.nodes.size() > big.nodes.size()) {
+			//System.out.println("can not be subway, little>big");
+			return false;
+		}
+		/*
+		for ( Node n : little.nodes )
+			System.out.println("little node: " + (n == little.nodes.get(0)));
+		for ( Node n : big.nodes )
+			System.out.println("big node: " + (n == big.nodes.get(0)));
+	
+		System.out.println("little.nodes.size(): " + little.nodes.size());
+		System.out.println("big.nodes.size(): " + big.nodes.size());
+		*/
+		ArrayList<Pair<Node,Node>> little_pairs = little.getNodePairs(true);
+		ArrayList<Pair<Node,Node>> big_pairs = big.getNodePairs(true);
+
+		Pair<Node,Node> first_little_pair = little_pairs.get(0);
+		int start_at = big_pairs.indexOf(first_little_pair);
+		if (start_at == -1) {
+			System.out.println("can not be subway, no index for flp");
+			return false;
+		}
+		Pair<Node,Node> last_little_pair = little_pairs.get(little_pairs.size()-1);
+		int end_at = big_pairs.indexOf(last_little_pair);
+		if (end_at == -1) {
+			System.out.println("can not be subway, no index for llp");
+			return false;
+		}
+		if (start_at > end_at) {
+				int tmp = start_at;
+				start_at = end_at;
+				end_at = tmp;
+		}
+		// subList's second argument is exlcusive, so +1
+		end_at++;
+		//System.out.println("start_at: " + start_at);
+		//System.out.println("end_at: " + end_at);
+		List<Pair<Node,Node>> big_sub_list = big_pairs.subList(start_at, end_at);
+		//System.out.println("big_sub_list size: " + big_sub_list.size());
+		//System.out.println("little_pairs size: " + little_pairs.size());
+
+		int last_index = 0;
+		for (Pair<Node,Node> pair : little_pairs) {
+			if (big_sub_list.indexOf(pair) != last_index) {
+				System.out.println("can not be subway, non-sequential pairs at: " +
+								last_index + " but found at: " +
+								big_sub_list.indexOf(pair));
+				return false;
+			}
+			last_index++;
+		}
+		if (last_index < little_pairs.size()) {
+				System.out.println("can not be subway, not right length: " + last_index + " vs. " + little_pairs.size());
+				return false;
+		}
+		return true;
+	}
+
+    @Override
+    public boolean isFixable(TestError testError)
+    {
+		Way w1 = (Way)testError.getPrimitives().get(0);
+		Way w2 = (Way)testError.getPrimitives().get(1);
+		Way small;
+		Way large;
+
+		if (w1.nodes.size() >= w2.nodes.size()) {
+			small = w2;
+			large = w1;
+		} else {
+			small = w1;
+			large = w2;
+		}
+		return isSubWay(small, large);
+    }
+
 	@Override
 	public void endTest() 
 	{
-		for (List<WaySegment> duplicated : nodePairs.values())
-		{
-			if (duplicated.size() > 1)
-			{
-				List<OsmPrimitive> prims = new ArrayList<OsmPrimitive>();
-				for (WaySegment ws : duplicated) prims.add(ws.way);
-				errors.add(new TestError(this, Severity.OTHER,
-					tr("Overlapping ways"), prims, duplicated));
-			}
+		for (Pair<Node,Node> pair : nodePairs.keySet()) {
+			List<WaySegment> segments = nodePairs.get(pair);
+			//in.debug("Segsize: " + segments.size());
+			if (segments.size() == 1)
+				continue;
+			List<Way> ways = new ArrayList<Way>();
+			for (WaySegment s : segments)
+				ways.add(s.way);
+			errors.add(new TestError(this, Severity.WARNING, tr("Overlapping ways a"), ways));
 		}
-		nodePairs = null;
 	}
 
 	@Override
 	public void visit(Way w) 
 	{
-		Node lastN = null;
-		int i = -2;
-		for (Node n : w.nodes) {
-			i++;
-			if (lastN == null) {
-				lastN = n;
-				continue;
-			}
-			nodePairs.add(Pair.sort(new Pair<Node,Node>(lastN, n)),
-				new WaySegment(w, i));
-			lastN = n;
+		int i = 0;
+		for (Pair<Node,Node> pair : w.getNodePairs(true)) {
+			//Main.debug("node pair: " + pair.a.id + " " + pair.b.id);
+			nodePairs.add(pair,	new WaySegment(w, i++));
 		}
 	}
 }


-- Dave





More information about the josm-dev mailing list