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 <sebas...@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

_______________________________________________
Pkg-grass-devel mailing list
Pkg-grass-devel@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel

Reply via email to