[mkgmap] 01/05: Imported Upstream version 0.0.0+svn3639

Sebastiaan Couwenberg sebastic at moszumanska.debian.org
Tue Sep 1 13:54:07 UTC 2015


This is an automated email from the git hooks/post-receive script.

sebastic pushed a commit to branch master
in repository mkgmap.

commit 8c966cda255db18aca7d001df1b4f69d9c17378e
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Tue Sep 1 15:40:04 2015 +0200

    Imported Upstream version 0.0.0+svn3639
---
 resources/mkgmap-version.properties                |   4 +-
 resources/styles/default/inc/roadspeed             |   2 +-
 .../me/parabola/imgfmt/app/net/NumberPreparer.java |   5 -
 src/uk/me/parabola/imgfmt/app/net/RoadNetwork.java |  15 +-
 src/uk/me/parabola/mkgmap/Options.java             |   6 +-
 .../me/parabola/mkgmap/osmstyle/ConvertedWay.java  |  54 ++--
 .../mkgmap/osmstyle/housenumber/ExtNumbers.java    |   8 +-
 .../osmstyle/housenumber/HousenumberElem.java      |   9 +
 .../osmstyle/housenumber/HousenumberGenerator.java | 314 +++++----------------
 .../osmstyle/housenumber/HousenumberIvl.java       | 106 ++++++-
 .../osmstyle/housenumber/HousenumberMatch.java     |   3 +-
 .../osmstyle/housenumber/HousenumberRoad.java      |  16 +-
 .../mkgmap/reader/osm/HousenumberHooks.java        |   1 -
 .../mkgmap/reader/osm/RestrictionRelation.java     |  28 +-
 test/func/ArgsTest.java                            |   2 +
 test/uk/me/parabola/mkgmap/CommandArgsTest.java    |   8 +-
 16 files changed, 251 insertions(+), 330 deletions(-)

diff --git a/resources/mkgmap-version.properties b/resources/mkgmap-version.properties
index 82f30ff..ab841e7 100644
--- a/resources/mkgmap-version.properties
+++ b/resources/mkgmap-version.properties
@@ -1,2 +1,2 @@
-svn.version: 3625
-build.timestamp: 2015-07-28T16:04:06+0100
+svn.version: 3639
+build.timestamp: 2015-08-31T13:34:36+0100
diff --git a/resources/styles/default/inc/roadspeed b/resources/styles/default/inc/roadspeed
index b0a791b..d141e80 100644
--- a/resources/styles/default/inc/roadspeed
+++ b/resources/styles/default/inc/roadspeed
@@ -39,4 +39,4 @@ maxspeed=* & mkgmap:road-speed-max!=* & maxspeedkmh() <=  85 { set mkgmap:road-s
 maxspeed=* & mkgmap:road-speed-max!=* & maxspeedkmh() <= 100 { set mkgmap:road-speed-max = 5 }
 maxspeed=* & mkgmap:road-speed-max!=* & maxspeedkmh() <= 120 { set mkgmap:road-speed-max = 6 }
 # mkgmap:road-speed-max = 7 has no effect 
-#maxspeed=* & mkgmap:road-speed-max!=* { set mkgmap:road-speed-max = 7 }
\ No newline at end of file
+#maxspeed=* & mkgmap:road-speed-max!=* { set mkgmap:road-speed-max = 7 }
diff --git a/src/uk/me/parabola/imgfmt/app/net/NumberPreparer.java b/src/uk/me/parabola/imgfmt/app/net/NumberPreparer.java
index aa80147..a23fc77 100644
--- a/src/uk/me/parabola/imgfmt/app/net/NumberPreparer.java
+++ b/src/uk/me/parabola/imgfmt/app/net/NumberPreparer.java
@@ -982,17 +982,12 @@ class CityZipWriter {
 			initFlag >>= 5;
 		}
 		initFlag |= sidesFlag << 5;
-		if ((initFlag & 0xff) == 4){
-			long dd = 4;
-		}
 		buf.write((byte) (initFlag & 0xff));
 		if ((sidesFlag & 4) == 0) {
 			if (indexes[0] > 0 && (sidesFlag == 0 || (sidesFlag & 1) == 1))
 				writeIndex(indexes[0]);
 			if (indexes[1] > 0 && (sidesFlag & 2) != 0)
 				writeIndex(indexes[1]);
-		} else {
-			long dd = 4;
 		}
 		System.arraycopy(indexes, 0, prevIndexes, 0, indexes.length);
 	}
diff --git a/src/uk/me/parabola/imgfmt/app/net/RoadNetwork.java b/src/uk/me/parabola/imgfmt/app/net/RoadNetwork.java
index 98d2ce5..77fe5cc 100644
--- a/src/uk/me/parabola/imgfmt/app/net/RoadNetwork.java
+++ b/src/uk/me/parabola/imgfmt/app/net/RoadNetwork.java
@@ -393,9 +393,6 @@ public class RoadNetwork {
 		}
 		
 		// a bit more complex: determine the to-node and arc(s) 
-		RouteNode uTurnNode = (viaNodes.size() > 1) ? viaNodes.get(viaNodes.size()-2): fn;
-		long uTurnWay = (viaNodes.size() > 1) ? grr.getViaWayIds().get(grr.getViaWayIds().size()-1) : grr.getFromWayId(); 
-		
 		RouteNode tn = null;
 		int toId = 0; 
 		List<RouteArc> toArcs = new ArrayList<>();
@@ -470,23 +467,13 @@ public class RoadNetwork {
 		}
 		else if (grr.getType() == GeneralRouteRestriction.RestrType.TYPE_ONLY){
 			// this is the inverse logic, grr gives the allowed path, we have to find the others
-			int uTurns = 0;
-			
 			for (RouteArc badArc : lastViaNode.arcsIteration()){
 				if (!badArc.isDirect() || toArcs.contains(badArc))
 					continue;
-				if (badArc.getDest() == uTurnNode && badArc.getRoadDef().getId() == uTurnWay){
-					// ignore u-turn
-					++uTurns;
-					continue;
-				}
 				badArcs.add(badArc);
 			}
 			if (badArcs.isEmpty()){
-				if (uTurns > 0)
-					log.warn(sourceDesc, "restriction ignored because it forbids only u-turn");
-				else
-					log.warn(sourceDesc, "restriction ignored because it has no effect");
+				log.warn(sourceDesc, "restriction ignored because it has no effect");
 				return 0;
 			}
 		}
diff --git a/src/uk/me/parabola/mkgmap/Options.java b/src/uk/me/parabola/mkgmap/Options.java
index 07dd0cf..1631822 100644
--- a/src/uk/me/parabola/mkgmap/Options.java
+++ b/src/uk/me/parabola/mkgmap/Options.java
@@ -76,8 +76,10 @@ public class Options {
 			return;
 		}
 
-		Reader r = new FileReader(filename);
-		readOptionFile(r, filename);
+		try (Reader r = new FileReader(filename)) {
+			readOptionFile(r, filename);
+		}
+		
 	}
 
 	public void readOptionFile(Reader r, String filename) {
diff --git a/src/uk/me/parabola/mkgmap/osmstyle/ConvertedWay.java b/src/uk/me/parabola/mkgmap/osmstyle/ConvertedWay.java
index 523e902..6a9c8ff 100644
--- a/src/uk/me/parabola/mkgmap/osmstyle/ConvertedWay.java
+++ b/src/uk/me/parabola/mkgmap/osmstyle/ConvertedWay.java
@@ -134,21 +134,22 @@ public class ConvertedWay {
 			} else {
 				roadClass = Byte.decode(val);
 			}
-			val = el.getTag("mkgmap:road-class-max");
-			byte roadClassMax = 4;
-			if (val != null)
-				roadClassMax = Byte.decode(val);
-			val = el.getTag("mkgmap:road-class-min");
+		}
+		val = el.getTag("mkgmap:road-class-max");
+		byte roadClassMax = 4;
+		if (val != null)
+			roadClassMax = Byte.decode(val);
 
-			byte roadClassMin = 0;
-			if (val != null)
-				roadClassMin = Byte.decode(val);
-			if (roadClass > roadClassMax)
-				roadClass = roadClassMax;
-			else if (roadClass < roadClassMin)
-				roadClass = roadClassMin;
+		val = el.getTag("mkgmap:road-class-min");
+		byte roadClassMin = 0;
+		if (val != null)
+			roadClassMin = Byte.decode(val);
+
+		if (roadClass > roadClassMax)
+			roadClass = roadClassMax;
+		else if (roadClass < roadClassMin)
+			roadClass = roadClassMin;
 
-		}
 		return (roadClass != oldRoadClass);
 	}
 	
@@ -202,20 +203,21 @@ public class ConvertedWay {
 			else {
 				roadSpeed = Byte.decode(val);
 			}
-			val = el.getTag("mkgmap:road-speed-max");
-			byte roadSpeedMax = 7;
-			if(val != null)
-				roadSpeedMax = Byte.decode(val);
-			val = el.getTag("mkgmap:road-speed-min");
-
-			byte roadSpeedMin = 0;
-			if(val != null)
-				roadSpeedMin = Byte.decode(val);
-			if(roadSpeed > roadSpeedMax)
-				roadSpeed = roadSpeedMax;
-			else if(roadSpeed < roadSpeedMin)
-				roadSpeed = roadSpeedMin;
 		}
+		val = el.getTag("mkgmap:road-speed-max");
+		byte roadSpeedMax = 7;
+		if(val != null)
+			roadSpeedMax = Byte.decode(val);
+
+		val = el.getTag("mkgmap:road-speed-min");
+		byte roadSpeedMin = 0;
+		if(val != null)
+			roadSpeedMin = Byte.decode(val);
+
+		if(roadSpeed > roadSpeedMax)
+			roadSpeed = roadSpeedMax;
+		else if(roadSpeed < roadSpeedMin)
+			roadSpeed = roadSpeedMin;
 		return (oldRoadSpeed != roadSpeed);
 	}
 
diff --git a/src/uk/me/parabola/mkgmap/osmstyle/housenumber/ExtNumbers.java b/src/uk/me/parabola/mkgmap/osmstyle/housenumber/ExtNumbers.java
index 4f4f26b..36e7e19 100644
--- a/src/uk/me/parabola/mkgmap/osmstyle/housenumber/ExtNumbers.java
+++ b/src/uk/me/parabola/mkgmap/osmstyle/housenumber/ExtNumbers.java
@@ -432,11 +432,11 @@ public class ExtNumbers {
 			if (house.isIgnored())
 				continue;
 			if (house.getSegment() < startInRoad || house.getSegment() >= endInRoad){
-				log.error("internal error, house has wrong segment, road",getRoad(),"house",house,house.getElement().toBrowseURL());
+				log.error("internal error, house has wrong segment, road",getRoad(),"house",house,house.toBrowseURL());
 			}
 			if (Double.isNaN(house.getDistance()) || house.getDistance() > HousenumberGenerator.MAX_DISTANCE_TO_ROAD + 10){
 				if (house.getGroup() == null)
-					log.error("internal error, distance to road too large, road",getRoad(),"house",house,house.getElement().toBrowseURL());
+					log.error("internal error, distance to road too large, road",getRoad(),"house",house,house.toBrowseURL());
 			}
 		}
 	}
@@ -1014,7 +1014,7 @@ public class ExtNumbers {
 			HousenumberGenerator.findClosestRoadSegment(house, getRoad(), segment,segment+1);
 			if (house.getRoad() == null || house.getSegment() != segment){
 				// should not happen
-				log.error("internal error, house too far from forced segment in road",getRoad(),house,house.getElement().toBrowseURL());
+				log.error("internal error, house too far from forced segment in road",getRoad(),house,house.toBrowseURL());
 				house.setIgnored(true);
 			}
 		}
@@ -1390,7 +1390,7 @@ public class ExtNumbers {
 					}
 					if (bestMoveMod != null){
 						if (bestMoveOrig.isDuplicate()){
-							log.warn("duplicate number causes problems",streetName,bestMoveOrig.getSign(),bestMoveOrig.getElement().toBrowseURL() );
+							log.warn("duplicate number causes problems",streetName,bestMoveOrig.getSign(),bestMoveOrig.toBrowseURL() );
 						}
 						List<HousenumberMatch> fromHouses, toHouses;
 						ExtNumbers from,to;
diff --git a/src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberElem.java b/src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberElem.java
index fdbd5b5..2a93d6b 100644
--- a/src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberElem.java
+++ b/src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberElem.java
@@ -5,6 +5,7 @@ import uk.me.parabola.mkgmap.general.CityInfo;
 import uk.me.parabola.mkgmap.general.MapRoad;
 import uk.me.parabola.mkgmap.general.ZipCodeInfo;
 import uk.me.parabola.mkgmap.reader.osm.Element;
+import uk.me.parabola.mkgmap.reader.osm.FakeIdGenerator;
 import uk.me.parabola.mkgmap.reader.osm.Node;
 import uk.me.parabola.mkgmap.reader.osm.Way;
 import uk.me.parabola.util.Locatable;
@@ -107,4 +108,12 @@ class HousenumberElem implements Locatable{
 			return place + " " + sign;
 		return "?" + " " + sign;
 	}
+	
+	public String toBrowseURL(){
+		if (FakeIdGenerator.isFakeId(element.getId())){
+			return getLocation().toOSMURL();
+		}
+		return element.toBrowseURL();
+	}
+
 }
\ No newline at end of file
diff --git a/src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberGenerator.java b/src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberGenerator.java
index c6ccfaf..e7e389e 100644
--- a/src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberGenerator.java
+++ b/src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberGenerator.java
@@ -68,6 +68,8 @@ public class HousenumberGenerator {
 
 	/** Gives the maximum distance between house number element and the matching road */
 	public static final double MAX_DISTANCE_TO_ROAD = 150d;
+	/** Gives the maximum distance for different elements with the same address */
+	public static final double MAX_DISTANCE_SAME_NUM = 100d;
 	
 	private boolean numbersEnabled;
 
@@ -280,6 +282,7 @@ public class HousenumberGenerator {
 		HousenumberElem houseElem = handleElement(n);
 		if (houseElem == null)
 			return;
+		
 		if (n.getTag(HousenumberHooks.partOfInterpolationTagKey) != null)
 			interpolationNodes.put(n.getId(),houseElems.size()-1);
 	}
@@ -396,17 +399,11 @@ public class HousenumberGenerator {
 				
 				int start = he1.getHousenumber();
 				int end = he2.getHousenumber();
-				int steps;
-				if (start < end){
-					steps = (end - start) / step - 1;
-				} else {
-					steps = (start - end) / step - 1;
-				}
 				HousenumberIvl hivl = new HousenumberIvl(street, w, (Node)he1.element, (Node)he2.element);
 				hivl.setStart(start);
 				hivl.setEnd(end);
 				hivl.setStep(step);
-				hivl.setSteps(steps);
+				hivl.calcSteps();
 				hivl.setPoints(w.getPoints().subList(pos1, pos2+1));
 //				if (pos1 > 0){
 //					double angle = Utils.getAngle(w.getPoints().get(pos1-1), w.getPoints().get(pos1), w.getPoints().get(pos1+1));
@@ -480,8 +477,6 @@ public class HousenumberGenerator {
 	 * Evaluate type=associatedStreet relations.
 	 */
 	public void addRelation(Relation r) {
-		if (numbersEnabled == false) 
-			return;
 		String relType = r.getTag("type");
 		// the wiki says that we should also evaluate type=street
 		if ("associatedStreet".equals(relType) || "street".equals(relType)){
@@ -571,6 +566,7 @@ public class HousenumberGenerator {
 				}
 				for (Element street : unnamedStreetElems) {
 					street.addTag(streetTagKey, streetName);
+					street.addTag("name", streetName);
 				}
 			}
 			if (log.isInfoEnabled()){
@@ -670,7 +666,7 @@ public class HousenumberGenerator {
 				if (hnr.getName() == null){
 					iter.remove();
 					for (HousenumberMatch house : hnr.getHouses()){
-						log.warn("found no plausible road name for address",house.getElement().toBrowseURL(),", closest road id:",house.getRoad());
+						log.warn("found no plausible road name for address",house.toBrowseURL(),", closest road id:",house.getRoad());
 					}
 				}
 			}
@@ -696,11 +692,10 @@ public class HousenumberGenerator {
 			
 			for (Entry<String, TreeMap<CityInfo, List<HousenumberRoad>>> streetNameEntry : streetnameCityRoadMap.entrySet()){
 				String streetName = streetNameEntry.getKey();
-				List<HousenumberRoad> roadsWithStreetName = new ArrayList<>();
+				
 				for (Entry<CityInfo, List<HousenumberRoad>> clusterEntry : streetNameEntry.getValue().entrySet()){
-					roadsWithStreetName.addAll(clusterEntry.getValue());
+					useInterpolationInfo(streetName, clusterEntry.getValue(), road2HousenumberRoadMap);
 				}
-				useInterpolationInfo(streetName, roadsWithStreetName, road2HousenumberRoadMap);
 				
 				for (Entry<CityInfo, List<HousenumberRoad>> clusterEntry : streetNameEntry.getValue().entrySet()){
 					List<HousenumberRoad> roadsInCluster = clusterEntry.getValue();
@@ -738,9 +733,9 @@ public class HousenumberGenerator {
 			for (HousenumberElem house : houseElems){
 				if (house.getRoad() == null){
 					if (house.getStreet() != null)
-						log.info("found no plausible road for house number element",house.getElement().toBrowseURL(),house.getStreet(),house.getSign());
+						log.info("found no plausible road for house number element",house.toBrowseURL(),house.getStreet(),house.getSign());
 					else 
-						log.info("found no plausible road for house number element",house.getElement().toBrowseURL());
+						log.info("found no plausible road for house number element",house.toBrowseURL());
 				}
 			}
 		}
@@ -841,10 +836,9 @@ public class HousenumberGenerator {
 				for (HousenumberMatch house : placeHouses){
 					if (house.getStreet() != null ){
 						++housesWithStreet;
-						if (house.getStreet().equals(house.getRoad().getStreet())){
+						if (house.getStreet().equalsIgnoreCase(house.getRoad().getStreet())){
 							++housesWithMatchingStreet;
 						}
-						
 					} else {
 						if (house.getRoad().getStreet() == null)
 							++unnamedCloseRoads;
@@ -1102,7 +1096,6 @@ public class HousenumberGenerator {
 	 *  XXX: Known problem: Doesn't work well when the road was
 	 *  clipped at the tile boundary.
 	 * @param streetName
-	 * @param housesNearCluster
 	 * @param roadsInCluster
 	 * @param road2HousenumberRoadMap 
 	 * @param interpolationInfos 
@@ -1122,7 +1115,7 @@ public class HousenumberGenerator {
 		if (housesWithIvlInfo.isEmpty())
 			return;
 		
-		HashSet<String> simpleDupCheckSet = new HashSet<>();
+		HashMap<String, HousenumberIvl> simpleDupCheckSet = new HashMap<>();
 		HashSet<HousenumberIvl> badIvls = new HashSet<>();
 		Long2ObjectOpenHashMap<HousenumberIvl> id2IvlMap = new Long2ObjectOpenHashMap<>();
 		Int2ObjectOpenHashMap<HousenumberMatch> interpolatedNumbers = new Int2ObjectOpenHashMap<>();
@@ -1133,23 +1126,25 @@ public class HousenumberGenerator {
 			for (HousenumberMatch house : hnr.getHouses())
 				existingNumbers.put(house.getHousenumber(), house);
 		}
-		
 		int inCluster = 0;
 		boolean allOK = true;
-		for (HousenumberIvl hivl : interpolationInfos){
+		// for loop may change the list 
+		for (int i = 0; i < interpolationInfos.size(); i++){
+			HousenumberIvl hivl = interpolationInfos.get(i);
 			if (hivl.inCluster(housesWithIvlInfo) == false || hivl.ignoreForInterpolation())
 				continue;
 			++inCluster;
 			String hivlDesc = hivl.getDesc();
-			if (simpleDupCheckSet.contains(hivlDesc)){
+			HousenumberIvl hivlTest = simpleDupCheckSet.get(hivlDesc);
+			if (hivlTest != null){
 				// happens often in Canada (CanVec imports): two or more addr:interpolation ways with similar meaning
 				// sometimes at completely different road parts, sometimes at exactly the same
-				log.warn("found additional addr:interpolation way with same meaning, is ignored:",streetName, hivl);
+				log.warn("found additional addr:interpolation way with same meaning, is ignored:",streetName, hivl, hivlTest);
 				badIvls.add(hivl);
 				allOK = false;
 				continue;
 			}
-			simpleDupCheckSet.add(hivlDesc);
+			simpleDupCheckSet.put(hivlDesc, hivl);
 
 			id2IvlMap.put(hivl.getId(), hivl);
 			List<HousenumberMatch> interpolatedHouses = hivl.getInterpolatedHouses();
@@ -1158,22 +1153,36 @@ public class HousenumberGenerator {
 					// the interpolated houses are not all along one road
 					findRoadForInterpolatedHouses(streetName, interpolatedHouses, roadsInCluster);
 				}
-
-				boolean foundDup = false;
+				
+				int dupCount = 0;
 				for (HousenumberMatch house : interpolatedHouses){
 					if (house.getRoad() == null || house.getDistance() > HousenumberIvl.MAX_INTERPOLATION_DISTANCE_TO_ROAD)
 						continue;
 					boolean ignoreGenOnly = false;
-					HousenumberMatch old = interpolatedNumbers.put(house.getHousenumber(), house);
+					HousenumberMatch old = interpolatedNumbers.get(house.getHousenumber());
 					if (old == null){
 						ignoreGenOnly = true;
 						old = existingNumbers.get(house.getHousenumber());
 					}
 					if (old != null){
+						// try to build new intervals using existing node
+						HousenumberIvl[] splitIvls = hivl.trySplitAt(old);
+						if (splitIvls != null){
+							log.info("adding address",streetName,old,old.toBrowseURL(),"to addr:interpolation way, replacing", hivl,"by",Arrays.deepToString(splitIvls));
+							interpolationInfos.add(splitIvls[0]);
+							interpolationInfos.add(splitIvls[1]);
+							hivl.setIgnoreForInterpolation(true);
+							break;
+						}
 						// forget both or only one ? Which one?
 						house.setIgnored(true);
-						if (old.getLocation().distance(house.getLocation()) > 5){
-							foundDup = true;
+						double distToOld = old.getLocation().distance(house.getLocation()); 
+						if (distToOld > MAX_DISTANCE_SAME_NUM){
+							if (old.isInterpolated())
+								log.info("conflict caused by addr:interpolation way",streetName,hivl,"and interpolated address",old,"at",old.getLocation().toDegreeString());
+							else 
+								log.info("conflict caused by addr:interpolation way",streetName,hivl,"and address element",old,"at",old.getLocation().toDegreeString());
+							dupCount++;
 							if (!ignoreGenOnly){
 								old.setIgnored(true);
 								long ivlId = old.getElement().getOriginalId();
@@ -1184,10 +1193,17 @@ public class HousenumberGenerator {
 						}
 					}
 				}
-				if (foundDup)
+				if (hivl.ignoreForInterpolation())
+					continue;
+				if (dupCount > 0){
+					log.warn("addr:interpolation way",streetName,hivl,"is ignored, it produces",dupCount,"duplicate number(s) too far from existing nodes");
 					badIvls.add(hivl);
-				else
+				}
+				else {
 					housesToAdd.put(hivl, interpolatedHouses);
+					for (HousenumberMatch hnm : interpolatedHouses)
+						interpolatedNumbers.put(hnm.getHousenumber(), hnm);
+				}
 			}
 		}
 		if (inCluster == 0)
@@ -1206,7 +1222,7 @@ public class HousenumberGenerator {
 				if (house.getRoad() != null && house.isIgnored() == false){
 					HousenumberRoad hnr = road2HousenumberRoadMap.get(house.getRoad());
 					if (hnr == null){
-						log.error("internal error: found no housenumber road for interpolated house",house.getElement().toBrowseURL());
+						log.error("internal error: found no housenumber road for interpolated house",house.toBrowseURL());
 						continue;
 					}
 					hnr.addHouse(house);
@@ -1290,7 +1306,7 @@ public class HousenumberGenerator {
 			
 			if (house.getRoad() == null) {
 				if (house.isIgnored() == false)
-					log.warn("found no plausible road for house number element",house.getElement().toBrowseURL(),"(",streetName,house.getSign(),")");
+					log.warn("found no plausible road for house number element",house.toBrowseURL(),"(",streetName,house.getSign(),")");
 			}
 			if (!house.isIgnored())
 				prev = house;
@@ -1320,7 +1336,7 @@ public class HousenumberGenerator {
 			// check if they should be treated alike
 			boolean markFarDup = false;
 			double dist = house1.getLocation().distance(house2.getLocation());
-			if (dist > 100)
+			if (dist > MAX_DISTANCE_SAME_NUM)
 				markFarDup = true;
 			else {
 				CityInfo city1 = house1.getCityInfo();
@@ -1353,7 +1369,7 @@ public class HousenumberGenerator {
 				house2.setIgnored(true);
 				if (log.isDebugEnabled()){
 					if (house1.getSign().equals(house2.getSign()))
-						log.debug("duplicate number is ignored",streetName,house2.getSign(),house2.getElement().toBrowseURL() );
+						log.debug("duplicate number is ignored",streetName,house2.getSign(),house2.toBrowseURL() );
 					else 
 						log.info("using",streetName,house1.getSign(), "in favor of",house2.getSign(),"as target for address search");
 				}
@@ -1367,109 +1383,6 @@ public class HousenumberGenerator {
 	}
 
 
-	/**
-	 * If we find a sequence of house numbers like 1,3,5 or 1,2,3
-	 * where the house in the middle is assigned to a different road,
-	 * it is likely that this match is wrong.
-	 * This typically happens when a house is rather far away from two 
-	 * possible roads, but a bit closer to the wrong match. The two roads
-	 * typically form an L, U, or O shape. 
-	 * @param streetName common name tag (for debugging) 
-	 * @param sortedHouses house number elements sorted by number
-	 * @param roadNumbers the existing map which should be corrected
-	 */
-	private static void checkDubiousRoadMatches(String streetName,
-			List<HousenumberMatch> sortedHouses,
-			MultiHashMap<MapRoad, HousenumberMatch> roadNumbers) {
-		int n = sortedHouses.size();
-		for (int pos1 = 0; pos1 < n; pos1++){
-			HousenumberMatch house1 = sortedHouses.get(pos1);
-			if (house1.isIgnored() || house1.hasAlternativeRoad() == false)
-				continue;
-			int confirmed = 0;
-			int falsified = 0;
-			int pos2 = pos1;
-			HousenumberMatch bestAlternative = null;
-			double bestAlternativeDist = Double.POSITIVE_INFINITY;
-			
-			while (pos2 > 0){
-				HousenumberMatch house2 = sortedHouses.get(pos2);
-				if (house1.getHousenumber() - house2.getHousenumber() > 2)
-					break;
-					--pos2;
-			}
-			for (; pos2 < n; pos2++){
-				if (confirmed > 0)
-					break;
-				if (pos2 == pos1)
-					continue;
-				HousenumberMatch house2 = sortedHouses.get(pos2);
-				if (house2.isIgnored() || house2.getRoad() == null)
-					continue;
-				int deltaNum = house2.getHousenumber() - house1.getHousenumber();
-				if (deltaNum > 2)
-					break;
-				if (deltaNum < -2)
-					continue;
-				double distHouses = house1.getLocation().distance(house2.getLocation());
-				if (house2.getRoad() == house1.getRoad()){
-					if (Math.abs(house1.getSegment() - house2.getSegment()) < 2){
-						if (distHouses < 1.5 * bestAlternativeDist)
-							confirmed++;
-					} 
-					continue;
-				}
-				
-				Coord c1 = house2.getRoad().getPoints().get(house2.getSegment());
-				Coord c2 = house2.getRoad().getPoints().get(house2.getSegment()+1);
-				double frac2 = getFrac(c1,c2, house1.getLocation());
-				double dist2 = distanceToSegment(c1,c2,house1.getLocation(),frac2);
-				if (distHouses > dist2)
-					continue;
-				if (distHouses > house1.getDistance())
-					continue;
-				Coord c3 = house1.getRoad().getPoints().get(house1.getSegment());
-				Coord c4 = house1.getRoad().getPoints().get(house1.getSegment()+1);
-				if (c1 == c3 && Math.abs(Utils.getAngle(c2, c1, c4)) < 10 ||
-						c1 == c4 && Math.abs(Utils.getAngle(c2, c1, c3)) < 10 ||
-						c2 == c3 && Math.abs(Utils.getAngle(c1, c2, c4)) < 10 ||
-						c2 == c4 && Math.abs(Utils.getAngle(c1, c2, c3)) < 10){
-					confirmed++;
-					continue;
-				}
-				++falsified;
-				if (bestAlternative == null || dist2 < bestAlternativeDist){
-					bestAlternative = house2;
-					bestAlternativeDist = dist2;
-				}
-				if (log.isDebugEnabled())
-					log.debug("road check house-1:",house1.getRoad(),house1,house1.getDistance(),",house-2:", house2.getRoad(),house2,house2.getDistance(),distHouses,dist2,frac2,"house-1 is falsified");
-			}
-			if (confirmed == 0 && falsified > 0){
-				if (log.isInfoEnabled())
-					log.info("house number element assigned to road",house1.getRoad(),house1,house1.getElement().toBrowseURL(),"is closer to more plausible houses at road",bestAlternative.getRoad());
-				roadNumbers.removeMapping(house1.getRoad(), house1);
-				Coord c1 = bestAlternative.getRoad().getPoints().get(bestAlternative.getSegment());
-				Coord c2 = bestAlternative.getRoad().getPoints().get(bestAlternative.getSegment()+1);
-				double frac2 = getFrac(c1,c2, house1.getLocation());
-				double dist2 = distanceToSegment(c1,c2,house1.getLocation(),frac2);
-				if (dist2 >= MAX_DISTANCE_TO_ROAD){
-					log.info("house number element assigned to road",house1.getRoad(),house1,house1.getElement().toBrowseURL(),"is too far from more plausible road, is ignored");
-					house1.setIgnored(true);
-				} else {
-					house1.setRoad(bestAlternative.getRoad());
-					house1.setSegment(bestAlternative.getSegment());
-					house1.setSegmentFrac(frac2);
-					house1.setDistance(dist2);
-					house1.setLeft(isLeft(c1, c2, house1.getLocation()));
-					roadNumbers.add(house1.getRoad(), house1);
-				} 
-			} else if (confirmed == 0 && house1.isDuplicate()){
-				// special ?
-			}
-		}
-	}
-
 	public static void findClosestRoadSegment(HousenumberMatch house, MapRoad r) {
 		findClosestRoadSegment(house, r, 0, r.getPoints().size());
 	}
@@ -1648,97 +1561,6 @@ public class HousenumberGenerator {
 		}
 	}
 	
-	private static List<HousenumberMatch> checkPlausibility(String streetName, List<MapRoad> clusteredRoads,
-			List<HousenumberMatch> housesNearCluster) {
-		int countError = 0;
-		int countTested = 0;
-		List<HousenumberMatch> failed = new ArrayList<>();
-		Int2IntOpenHashMap tested = new Int2IntOpenHashMap();
-		tested.defaultReturnValue(-1);
-		for (HousenumberMatch house : housesNearCluster){
-			if (house.isIgnored())
-				continue;
-			++countTested;
-			int num = house.getHousenumber();
-			int countPlaces = 0;
-			int countRoads = 0;
-			int prevRes = tested.get(num);
-			if (prevRes == 0)
-				continue;
-			boolean reported = false;
-			for (MapRoad r : clusteredRoads){
-				int countMatches = checkRoad(r, house.getHousenumber());
-				if (countMatches == 0)
-					continue;
-				countRoads++;
-				if (countMatches > 1){
-					log.warn(streetName,house.getSign(),house.getElement().toBrowseURL(),"is coded in",countMatches,"different road segments");
-					reported = true;
-				}
-				countPlaces += countMatches;
-			}
-			if (countPlaces == 1){
-				tested.put(num,0);
-				continue;
-			}
-			failed.add(house);
-			++countError;
-			
-			if (countPlaces == 0 && house.getRoad() != null) {
-				log.warn(streetName, house.getSign(), house.getElement().toBrowseURL(), "is not found in expected road", house.getRoad());
-				reported = true;
-			}
-			if (countRoads > 1){
-				log.warn(streetName, house.getSign(), house.getElement().toBrowseURL(), "is coded in", countRoads, "different roads");
-				reported = true;
-			}
-			if (!reported)
-				log.error(streetName, house.getSign(), house.getElement().toBrowseURL(), "unexpected result in plausibility check, counters:",countRoads, countPlaces);
-		}
-		if (countTested == 0)
-			log.warn("plausibility check for road cluster found no valid numbers",clusteredRoads );
-		else if (countError > 0)
-			log.warn("plausibility check for road cluster failed with", countError, "detected problems:", clusteredRoads);
-		else if (log.isInfoEnabled()) 
-			log.info("plausibility check for road cluster found no problems", clusteredRoads);
-		return failed; 
-	}
-
-	/**
-	 * Count all segments that contain the house number
-	 * @param r
-	 * @param hn
-	 * @return
-	 */
-	private static int checkRoad(MapRoad r, int hn) {
-		if (r.getNumbers() == null)
-			return 0;
-
-		int matches = 0;
-		Numbers last = null;
-		Numbers firstMatch = null;
-		for (Numbers numbers : r.getNumbers()){
-			if (numbers.isEmpty())
-				continue;
-			int n = numbers.countMatches(hn);
-			if (n > 0 && firstMatch == null)
-				firstMatch = numbers;
-			
-			if (n == 1 && matches > 0){
-				if (last.getLeftEnd() == numbers.getLeftStart() && last.getLeftEnd() == hn || 
-						last.getRightEnd() == numbers.getRightStart() && last.getRightEnd() == hn ||
-						last.getLeftStart() == numbers.getLeftEnd() && last.getLeftStart() == hn||
-						last.getRightStart() == numbers.getRightEnd() && last.getRightStart() == hn){
-					n = 0; // intervals are overlapping, probably two houses (e.g. 2a,2b) at a T junction
-				}
-			}
-			
-			matches += n;
-			last = numbers;
-		}
-		return matches;
-	}
-
 	/**
 	 * If the closest point to a road is a junction, try to find the road
 	 * segment that forms a right angle with the house 
@@ -1787,9 +1609,9 @@ public class HousenumberGenerator {
 		}
 		if (log.isDebugEnabled()){
 			if (closestMatch.getRoad() != bestMatch.getRoad()){
-				log.debug("check angle: using road",bestMatch.getRoad().getRoadDef().getId(),"instead of",closestMatch.getRoad().getRoadDef().getId(),"for house number",bestMatch.getSign(),bestMatch.getElement().toBrowseURL());
+				log.debug("check angle: using road",bestMatch.getRoad().getRoadDef().getId(),"instead of",closestMatch.getRoad().getRoadDef().getId(),"for house number",bestMatch.getSign(),bestMatch.toBrowseURL());
 			} else if (closestMatch != bestMatch){
-				log.debug("check angle: using road segment",bestMatch.getSegment(),"instead of",closestMatch.getSegment(),"for house number element",bestMatch.getElement().toBrowseURL());
+				log.debug("check angle: using road segment",bestMatch.getSegment(),"instead of",closestMatch.getSegment(),"for house number element",bestMatch.toBrowseURL());
 			}
 		}
 		return bestMatch;
@@ -2013,10 +1835,10 @@ public class HousenumberGenerator {
 			MapRoad lastRoad = null;
 			HousenumberMatch hnm = null;
 			for (RoadPoint rp : closeRoadPoints){
-				if (house.getStreet() != null && house.getStreet().equals(rp.r.getStreet()) == false){
-					if (rp.r.getStreet() != null){
+				if (house.getStreet() != null){
+					// we have a given street name, accept only roads with similar name or no name
+					if (rp.r.getStreet() != null && house.getStreet().equalsIgnoreCase(rp.r.getStreet()) == false)
 						continue;
-					}
 				}
 				if (rp.r != lastRoad){
 					hnm = new HousenumberMatch(house);
@@ -2045,22 +1867,25 @@ public class HousenumberGenerator {
 					continue;
 			}
 			if (matches.isEmpty())
-				return closest;
+				return closest; // closest has not yet a road
+			
 			Collections.sort(matches, new HousenumberGenerator.HousenumberMatchByDistComparator());
 			closest = matches.get(0);
 			closest = checkAngle(closest, matches);
 			closest.calcRoadSide();
 			HousenumberMatch bestMatchingName = null; 
-			if (closest.getStreet() != null && closest.getStreet().equals(closest.getRoad().getStreet()))
+			if (closest.getStreet() != null && closest.getStreet().equalsIgnoreCase(closest.getRoad().getStreet()))
 				bestMatchingName = closest;
+			
 			for (HousenumberMatch altHouse : matches){
 				if (altHouse.getDistance() >= MAX_DISTANCE_TO_ROAD)
 					break;
 				if (altHouse.getRoad() != closest.getRoad()){
 					if (house.getStreet() != null && altHouse.getDistance() > closest.getDistance()){
-						if (house.getStreet().equals(altHouse.getRoad().getStreet())){
-							if (bestMatchingName == null || bestMatchingName.getDistance() > altHouse.getDistance())
+						if (house.getStreet().equalsIgnoreCase(altHouse.getRoad().getStreet())){
+							if (bestMatchingName == null || bestMatchingName.getDistance() > altHouse.getDistance()){
 								bestMatchingName = altHouse;
+							}
 						} else {
 							if (bestMatchingName != null && altHouse.getDistance() > bestMatchingName.getDistance())
 								continue;
@@ -2069,6 +1894,13 @@ public class HousenumberGenerator {
 					closest.addAlternativeRoad(altHouse.getRoad());
 				}
 			}
+			if (bestMatchingName != null){
+				if (house.getStreet().equals(bestMatchingName.getRoad().getStreet()) == false){
+					log.warn("accepting match in spite of different capitalisation" , house.getStreet(),house.getSign(), bestMatchingName.getRoad().getRoadDef(), "house:",house.toBrowseURL());
+					bestMatchingName.setStreet(bestMatchingName.getRoad().getStreet());
+					closest.setStreet(bestMatchingName.getStreet());
+				}
+			}
 			if (closest == bestMatchingName || bestMatchingName == null || bestMatchingName.getDistance() > MAX_DISTANCE_TO_ROAD)
 				return closest;
 			
@@ -2079,21 +1911,23 @@ public class HousenumberGenerator {
 			if (ratio > 0.75){
 				// prefer the road with the matching name
 				for (MapRoad r : closest.getAlternativeRoads()){
-					if (house.getStreet().equals(r.getStreet()))
+					if (house.getStreet().equalsIgnoreCase(r.getStreet()))
 						bestMatchingName.addAlternativeRoad(r);
 				}
 				best = bestMatchingName;
 				best.calcRoadSide();
 			} else {
 				if (log.isDebugEnabled()){
-					log.debug("further checks needed for address", closest.getStreet(), closest.getSign(), closest.getElement().toBrowseURL(), 
+					log.debug("further checks needed for address", closest.getStreet(), closest.getSign(), closest.toBrowseURL(), 
 							formatLen(closest.getDistance()), formatLen(bestMatchingName.getDistance()));
 				}
 
 			}
 			return best;
 		}
+
 	}
+	
 }
 
 
diff --git a/src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberIvl.java b/src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberIvl.java
index 8d62400..b6c25d8 100644
--- a/src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberIvl.java
+++ b/src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberIvl.java
@@ -20,7 +20,9 @@ import java.util.Map;
 import uk.me.parabola.imgfmt.Utils;
 import uk.me.parabola.imgfmt.app.Coord;
 import uk.me.parabola.log.Logger;
+import uk.me.parabola.mkgmap.general.CityInfo;
 import uk.me.parabola.mkgmap.general.MapRoad;
+import uk.me.parabola.mkgmap.general.ZipCodeInfo;
 import uk.me.parabola.mkgmap.reader.osm.Node;
 import uk.me.parabola.mkgmap.reader.osm.TagDict;
 import uk.me.parabola.mkgmap.reader.osm.Way;
@@ -69,8 +71,8 @@ public class HousenumberIvl {
 	private static final short addrInterpolationTagKey = TagDict.getInstance().xlate("addr:interpolation");
 
 	
-	public HousenumberIvl(String steetName, Way interpolationWay, Node n1, Node n2) {
-		this.streetName = steetName;
+	public HousenumberIvl(String streetName, Way interpolationWay, Node n1, Node n2) {
+		this.streetName = streetName;
 		this.interpolationWay = interpolationWay;
 		this.n1 = n1;
 		this.n2 = n2;
@@ -98,8 +100,12 @@ public class HousenumberIvl {
 	public int getEnd() {
 		return end;
 	}
-	public void setSteps(int steps) {
-		this.steps = steps;
+	public void calcSteps() {
+		if (start < end){
+			steps = (end - start) / step - 1;
+		} else {
+			steps = (start - end) / step - 1;
+		}
 	}
 
 
@@ -286,9 +292,9 @@ public class HousenumberIvl {
 	private void copyRoadData(HousenumberMatch source, HousenumberMatch dest) {
 		if (log.isInfoEnabled()){
 			if (source.getRoad() != dest.getRoad())
-				log.info("moving",streetName,dest.getSign(),dest.getElement().toBrowseURL(),"from road",dest.getRoad(),"to road",source.getRoad());
+				log.info("moving",streetName,dest.getSign(),dest.toBrowseURL(),"from road",dest.getRoad(),"to road",source.getRoad());
 			else 
-				log.info("moving",streetName,dest.getSign(),dest.getElement().toBrowseURL(),"from segment",dest.getSegment(),"to ",source.getSegment(),"in road",source.getRoad());
+				log.info("moving",streetName,dest.getSign(),dest.toBrowseURL(),"from segment",dest.getSegment(),"to ",source.getSegment(),"in road",source.getRoad());
 		}
 		dest.setRoad(source.getRoad());
 		dest.setSegment(source.getSegment());
@@ -305,6 +311,13 @@ public class HousenumberIvl {
 		int usedStep = (start < end) ? step : -step;
 		int hn = start;
 		boolean distanceWarningIssued = false;
+		CityInfo ci = knownHouses[0].getCityInfo();
+		ZipCodeInfo zip = knownHouses[0].getZipCode();
+		if (ci != null && ci.equals(knownHouses[1].getCityInfo()) == false)
+			log.warn("addr:interpolation way connects houses in different cities",streetName,this,"using city",ci,"for all interpolated adresses");
+		if (zip != null && zip.equals(knownHouses[1].getZipCode()) == false)
+			log.warn("addr:interpolation way connects houses with differnt zip codes",streetName,this,"using zip code",zip,"for all interpolated adresses");
+		
 		for (Coord co : interpolatedPoints){
 			hn += usedStep;
 			Node generated = new Node(interpolationWay.getId(), co);
@@ -314,9 +327,9 @@ public class HousenumberIvl {
 			generated.addTag(housenumberTagKey, number);
 			// TODO: maybe add check that city info and zip code of both houses is equal ?
 			// what if not ?
-			HousenumberElem houseElem = new HousenumberElem(generated, knownHouses[0].getCityInfo());
+			HousenumberElem houseElem = new HousenumberElem(generated, ci);
 			houseElem.setHousenumber(hn);
-			houseElem.setZipCode(knownHouses[0].getZipCode());
+			houseElem.setZipCode(zip);
 			houseElem.setStreet(streetName);
 			houseElem.setSign(number);
 			HousenumberMatch house = new HousenumberMatch(houseElem);
@@ -334,9 +347,6 @@ public class HousenumberIvl {
 			house.setInterpolated(true);
 			houses.add(house);
 		}
-		if (getId() == 37881402){
-			long dd = 4;
-		}
 		
 		if (log.isDebugEnabled()){
 			String addrInterpolationMethod = interpolationWay.getTag(addrInterpolationTagKey);
@@ -499,4 +509,78 @@ public class HousenumberIvl {
 	public HousenumberMatch[] getHouseNodes (){
 		return knownHouses;
 	}
+
+	/**
+	 * Check if an address node can be used to calculate new intervals 
+	 * @param houseToAdd a single address from OSM data 
+	 * @return null in case of error or an array with two new {@link HousenumberIvl} instances  
+	 */
+	public HousenumberIvl[] trySplitAt(HousenumberMatch houseToAdd) {
+		if (houseToAdd.isInterpolated())
+			return null;
+		if (houseToAdd.getRoad() != knownHouses[0].getRoad() && houseToAdd.getRoad() != knownHouses[1].getRoad())
+			return null;
+		HousenumberMatch s = knownHouses[0];
+		HousenumberMatch e = knownHouses[1];
+		if (s.getSegment() > e.getSegment() || s.getSegment() == e.getSegment() && s.getSegmentFrac() > e.getSegmentFrac()){
+			s = knownHouses[1];
+			e = knownHouses[0];
+		}
+		if (houseToAdd.getSegment() < s.getSegment() || houseToAdd.getSegment() > e.getSegment())
+			return null;
+		if (houseToAdd.getSegment() == s.getSegment() && houseToAdd.getSegmentFrac() < s.getSegmentFrac())
+			return null;
+		if (houseToAdd.getSegment() == e.getSegment()  && houseToAdd.getSegmentFrac() > e.getSegmentFrac())
+			return null;
+		
+		for (int i = 0; i+1 < points.size(); i++){
+			Coord c1 = points.get(i);
+			Coord c2 = points.get(i + 1);
+			double frac = HousenumberGenerator.getFrac(c1, c2, houseToAdd.getLocation());
+			if (frac < 0 || frac > 1)
+				continue;
+			HousenumberIvl[] ivls = new HousenumberIvl[2];
+			HousenumberMatch hnm = null;
+			if (houseToAdd.element instanceof Node){
+				hnm = houseToAdd;
+			}
+			else {
+				// create a Node instance 
+				Node toAdd = new Node(houseToAdd.getElement().getId(), houseToAdd.getLocation());
+				toAdd.setFakeId();
+				toAdd.copyTags(houseToAdd.element);
+				HousenumberElem hnElem = new HousenumberElem(toAdd, houseToAdd.getCityInfo());
+				hnm = new HousenumberMatch(hnElem);
+				hnm.setZipCode(houseToAdd.getZipCode());
+				HousenumberGenerator.findClosestRoadSegment(hnm, houseToAdd.getRoad(), houseToAdd.getSegment(), houseToAdd.getSegment());
+			}
+			
+			List<Coord> points1 = new ArrayList<>();
+			List<Coord> points2 = new ArrayList<>();
+			points1.addAll(points.subList(0, i+1));
+			points1.add(houseToAdd.getLocation());
+			points2.add(houseToAdd.getLocation());
+			points2.addAll(points.subList(i+1, points.size()));
+			
+			ivls[0] = new HousenumberIvl(streetName, interpolationWay, n1, (Node)hnm.element);
+			ivls[0].setStart(knownHouses[0].getHousenumber());
+			ivls[0].setEnd(houseToAdd.getHousenumber());
+			ivls[0].setStep(step);
+			ivls[0].calcSteps();
+			ivls[0].setPoints(points1);
+			ivls[0].addHousenumberMatch(knownHouses[0]);
+			ivls[0].addHousenumberMatch(hnm);
+
+			ivls[1] = new HousenumberIvl(streetName, interpolationWay, (Node) hnm.element, n2);
+			ivls[1].setStart(houseToAdd.getHousenumber());
+			ivls[1].setEnd(knownHouses[1].getHousenumber());
+			ivls[1].setStep(step);
+			ivls[1].calcSteps();
+			ivls[1].setPoints(points2);
+			ivls[1].addHousenumberMatch(knownHouses[1]);
+			ivls[1].addHousenumberMatch(hnm);
+			return ivls;
+		}
+		return null;
+	}
 }
diff --git a/src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberMatch.java b/src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberMatch.java
index 3caee8e..395e643 100644
--- a/src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberMatch.java
+++ b/src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberMatch.java
@@ -20,13 +20,12 @@ import java.util.List;
 import uk.me.parabola.imgfmt.app.Coord;
 import uk.me.parabola.mkgmap.general.MapRoad;
 import uk.me.parabola.mkgmap.reader.osm.Way;
-import uk.me.parabola.util.Locatable;
 
 /**
  * Stores the matching data between a housenumber and its road.
  * @author WanMil
  */
-public class HousenumberMatch extends HousenumberElem implements Locatable {
+public class HousenumberMatch extends HousenumberElem {
 	private MapRoad road;
 	private HousenumberRoad housenumberRoad;
 	
diff --git a/src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberRoad.java b/src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberRoad.java
index 92f3618..dbc408c 100644
--- a/src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberRoad.java
+++ b/src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberRoad.java
@@ -93,7 +93,7 @@ public class HousenumberRoad {
 				continue;
 			}
 			if (house.getHousenumberRoad() != this || house.getHousenumberRoad().getRoad() != house.getRoad()){
-				log.error("internal error, road links are not correct",house.getElement().toBrowseURL());
+				log.error("internal error, road links are not correct",house.toBrowseURL());
 			}
 			if (house.isLeft()) {
 				leftNumbers.add(house);
@@ -294,7 +294,7 @@ public class HousenumberRoad {
 				if (sameSide && (distBetweenHouses < 100 || distToUsed < 100)){
 					HousenumberMatch obsolete = house1 == usedForCalc ? house2 : house1;
 					if (log.isDebugEnabled())
-						log.debug("house",obsolete,obsolete.getElement().toBrowseURL(),"is close to other element and on the same road side, is ignored");
+						log.debug("house",obsolete,obsolete.toBrowseURL(),"is close to other element and on the same road side, is ignored");
 					toIgnore.add(obsolete);
 					continue;
 				}
@@ -320,7 +320,7 @@ public class HousenumberRoad {
 					}
 					if (wrongSide != null){
 						if (log.isDebugEnabled())
-							log.debug("house",streetName,wrongSide.getSign(),"from",wrongSide.getElement().toBrowseURL(),"seems to be wrong, is ignored");
+							log.debug("house",streetName,wrongSide.getSign(),"from",wrongSide.toBrowseURL(),"seems to be wrong, is ignored");
 						toIgnore.add(wrongSide);
 						continue;
 					}
@@ -395,8 +395,8 @@ public class HousenumberRoad {
 					found[k] = TO_SEARCH - 1 - stillToFind; 
 				}
 				if (log.isDebugEnabled()){
-					log.debug("dup check 1:", streetName, house1, house1.getElement().toBrowseURL());
-					log.debug("dup check 2:", streetName, house2, house2.getElement().toBrowseURL());
+					log.debug("dup check 1:", streetName, house1, house1.toBrowseURL());
+					log.debug("dup check 2:", streetName, house2, house2.toBrowseURL());
 					log.debug("confirmed",Arrays.toString(confirmed),"falsified",Arrays.toString(falsified),"sum-dist",Arrays.toString(sumDist),"sum-dist-same-side",Arrays.toString(sumDistSameSide));
 				}
 				HousenumberMatch bad = null;
@@ -422,7 +422,7 @@ public class HousenumberRoad {
 		} 
 		for (HousenumberMatch house : toIgnore){
 			if (log.isInfoEnabled())
-				log.info("duplicate housenumber",streetName,house.getSign(),"is ignored for road with id",house.getRoad().getRoadDef().getId(),",house:",house.getElement().toBrowseURL());
+				log.info("duplicate housenumber",streetName,house.getSign(),"is ignored for road with id",house.getRoad().getRoadDef().getId(),",house:",house.toBrowseURL());
 			houseNumbers.remove(house);
 		}
 	}
@@ -751,7 +751,7 @@ public class HousenumberRoad {
 			while (iter.hasNext()){
 				HousenumberMatch house = iter.next();
 				if (streetName != null){
-					if (house.getStreet() == null || streetName.equals(house.getStreet()))
+					if (house.getStreet() == null || streetName.equalsIgnoreCase(house.getStreet()))
 						continue;
 				} else if (house.getPlace() != null)
 					continue;
@@ -774,7 +774,7 @@ public class HousenumberRoad {
 					best.calcRoadSide();
 					wrongHouses.add(best);
 				} else {
-					log.warn("found no plausible road for address",house.getStreet(),house,house.getElement().toBrowseURL());
+					log.warn("found no plausible road for address",house.getStreet(),house,house.toBrowseURL());
 				}
 			}
 			
diff --git a/src/uk/me/parabola/mkgmap/reader/osm/HousenumberHooks.java b/src/uk/me/parabola/mkgmap/reader/osm/HousenumberHooks.java
index ca0c9b5..8ffe45b 100644
--- a/src/uk/me/parabola/mkgmap/reader/osm/HousenumberHooks.java
+++ b/src/uk/me/parabola/mkgmap/reader/osm/HousenumberHooks.java
@@ -35,7 +35,6 @@ public class HousenumberHooks extends OsmReadingHooksAdaptor {
 	private final List<Node> nodes = new ArrayList<>();
 	private boolean clearNodes;
 	
-	private static final short addrStreetTagKey = TagDict.getInstance().xlate("addr:street");
 	private static final short addrHousenumberTagKey = TagDict.getInstance().xlate("addr:housenumber");
 	private static final short addrInterpolationTagKey = TagDict.getInstance().xlate("addr:interpolation");
 	
diff --git a/src/uk/me/parabola/mkgmap/reader/osm/RestrictionRelation.java b/src/uk/me/parabola/mkgmap/reader/osm/RestrictionRelation.java
index afc3044..62207b0 100644
--- a/src/uk/me/parabola/mkgmap/reader/osm/RestrictionRelation.java
+++ b/src/uk/me/parabola/mkgmap/reader/osm/RestrictionRelation.java
@@ -320,12 +320,6 @@ public class RestrictionRelation extends Relation {
 			log.warn(messagePrefix, "'via' way(s) are not supported with multiple 'from' or 'to' ways");
 			valid = false;
 		}
-		if (toWays.size() == 1 && fromWays.size() == 1 && viaWays.isEmpty()){
-			if ("no_u_turn".equals(restriction) && fromWays.get(0).equals(toWays.get(0))){
-				log.warn(messagePrefix,"no_u_turn with equal 'from' and 'to' way and via node is ignored");
-				valid = false;
-			}
-		}
 		if (!valid)
 			return;
 		for (List<Way> ways : Arrays.asList(fromWays,viaWays,toWays)){
@@ -668,7 +662,27 @@ public class RestrictionRelation extends Relation {
 		if (viaWayIds.contains(way.getId()) == false)
 			return;
 		if(updatedViaWays.contains(way.getId())){
-			log.error(messagePrefix, "internal error: via way is updated again");
+			// we may get here when the style adds multiple routable ways for the
+			// OSM way
+			if (viaPoints.size() != nodeIndices.size())
+				valid = false;
+			else {
+				Iterator<Coord> iter = viaPoints.iterator();
+				for (int pos : nodeIndices){
+					if (iter.hasNext()){
+						if (way.getPoints().get(pos).equals(iter.next()))
+							continue;
+					}
+					valid = false;
+					break;
+				}
+			}
+			if (!valid)
+				log.error(messagePrefix, "internal error: via way is updated again with different nodes");
+			else {
+				// already up to date
+				return;
+			}
 		}
 		Coord first = way.getPoints().get(nodeIndices.get(0));
 		Coord last = way.getPoints().get(
diff --git a/test/func/ArgsTest.java b/test/func/ArgsTest.java
index 4625950..23503b4 100644
--- a/test/func/ArgsTest.java
+++ b/test/func/ArgsTest.java
@@ -80,6 +80,8 @@ public class ArgsTest extends Base {
 
 	@Test
 	public void testDisplayPriority() throws FileNotFoundException {
+		TestUtils.registerFile("osmmap.img");
+		 
 		int pri = 42;
 		Outputs op = TestUtils.run("--draw-priority=" + pri,
 				Args.TEST_RESOURCE_OSM + "uk-test-1.osm.gz");
diff --git a/test/uk/me/parabola/mkgmap/CommandArgsTest.java b/test/uk/me/parabola/mkgmap/CommandArgsTest.java
index 3a1afaa..df1a023 100644
--- a/test/uk/me/parabola/mkgmap/CommandArgsTest.java
+++ b/test/uk/me/parabola/mkgmap/CommandArgsTest.java
@@ -20,8 +20,6 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Properties;
 
-import uk.me.parabola.imgfmt.Utils;
-
 import func.lib.TestUtils;
 import org.junit.Test;
 
@@ -202,12 +200,8 @@ public class CommandArgsTest {
 
 	private void createFile(String name, String content) throws IOException {
 		TestUtils.registerFile(name);
-		Writer w = null;
-		try {
-			w = new FileWriter(name);
+		try (Writer w = new FileWriter(name)){
 			w.append(content);
-		} finally {
-			Utils.closeFile(w);
 		}
 	}
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/mkgmap.git



More information about the Pkg-grass-devel mailing list