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