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