The patch changes the house number processing in such a way that it uses OSM elements how they are returned from the style processing. The important thing is that street names of house number nodes are evaluated after style processing and not before.

WanMil


Hi Gerd,

maybe I find some time on the weekend to have a look on it.

WanMil

Hi Colin,

I think you found a bug in the housenumber processing.
The current implementation uses the streetnames which exist before style
processing
to produce a map of existing streets and nodes with addr info. After
style processing, It tries to find the
nodes and ways with the same name as that of a road. With your changes,
this will probably
fail.
If I got that right, we have to create another map that maps old and new
streetnames.

@WanMil: Do you have time to look at this?

Gerd



------------------------------------------------------------------------
Date: Sun, 25 May 2014 22:18:35 +0200
From: [email protected]
To: [email protected]
Subject: [mkgmap-dev] House numbers and styles

I have some rules which modify name, addr:street and mkgmap:street in
"lines" and "points" which apply some transformations to the street
names. The idea is to normalise the names by removing punctuation and
standardising abbreviations. The resulting map is missing the house
numbers for streets whose name I have modified. In the style rules, I
apply identical transformations to the way (looking for highway=* &
name=*) and points (looking for addr:street and mkgmap:street,
separately of course). I expect that mkgmap can match up the address
nodes with the street because the street names are still identical, but
something is not working right. The modified street name is working fine
- that is displayed and is in the index (i.e. I can search for it as a
destination). However for these streets only, there don't seem to be any
house numbers present. A search for a specific (existing) number on the
road finds the road with no numbers, at the centroid of the street.
Other streets whose names don't get changed, will allow me to find a
specific house number and get the location right as well.
Does anyone have any ideas what might be going wrong here? Am I trying
to do something that can never work?
Is it possible that something in the address handling in mkgmap is using
the original street name, before the style has been applied?
Is it possible that the styles don't get applied to address-only nodes?
I have the following in "lines":
# CS: normalise by getting rid of . in abbreviations
highway=* & name ~ '.*[.].*' {set name='${name|subst:.-=>-|subst:\.~>
|subst: +~> }'}
... and the following in "points":
# CS: normalise by getting rid of . in abbreviations
#mkgmap:street ~ '.*[.].*' {set
mkgmap:street='${mkgmap:street|subst:.-=>-|subst:\.~> |subst: +~> }';
echo "fixed mkgmap:street ${mkgmap:street}"}
mkgmap:street ~ '.*[.].*' {set
mkgmap:street='${mkgmap:street|subst:.-=>-|subst:\.~> |subst: +~> }'}
#addr:street ~ '.*[.].*' {set
addr:street='${addr:street|subst:.-=>-|subst:\.~> |subst: +~> }'; echo
"fixed addr:street ${addr:street}"}
addr:street ~ '.*[.].*' {set
addr:street='${addr:street|subst:.-=>-|subst:\.~> |subst: +~> }'}
Thanks in advance for any pointers!
Colin


_______________________________________________ mkgmap-dev mailing list
[email protected]
http://www.mkgmap.org.uk/mailman/listinfo/mkgmap-dev


_______________________________________________
mkgmap-dev mailing list
[email protected]
http://www.mkgmap.org.uk/mailman/listinfo/mkgmap-dev


_______________________________________________
mkgmap-dev mailing list
[email protected]
http://www.mkgmap.org.uk/mailman/listinfo/mkgmap-dev

Index: src/uk/me/parabola/mkgmap/osmstyle/StyledConverter.java
===================================================================
--- src/uk/me/parabola/mkgmap/osmstyle/StyledConverter.java	(revision 3288)
+++ src/uk/me/parabola/mkgmap/osmstyle/StyledConverter.java	(working copy)
@@ -187,19 +187,33 @@
 	private class WayTypeResult implements TypeResult 
 	{
 		private Way way;
+		/** flag if the rule was fired */
+		private boolean matched;
+		
 		public void setWay(Way way) {
 			this.way = way;
+			this.matched = false;
 		}
 		
 		public void add(Element el, GType type) {
+			this.matched = true;
 			if (type.isContinueSearch()) {
 				// If not already copied, do so now
 				if (el == way) 
 					el = way.copy();
 			}
 			postConvertRules(el, type);
+			housenumberGenerator.addWay((Way)el);
 			addConvertedWay((Way) el, type);
 		}
+
+		/**
+		 * Retrieves if a rule of the style matched and the way is converted.
+		 * @return {@code true} way is converted; {@code false} way is not converted
+		 */
+		public boolean isMatched() {
+			return matched;
+		}
 	}
 	
 	
@@ -224,7 +238,6 @@
 		}
 		preConvertRules(way);
 
-		housenumberGenerator.addWay(way);
 		String styleFilterTag = way.getTag(styleFilterTagKey);
 		Rule rules;
 		if ("polyline".equals(styleFilterTag))
@@ -250,9 +263,17 @@
 		}
 		wayTypeResult.setWay(way);
 		lineCacheId = rules.resolveType(lineCacheId, way, wayTypeResult);
+		if (wayTypeResult.isMatched() == false) {
+			// no match found but we have to keep it for house number processing
+			housenumberGenerator.addWay(way);
+		}
 		if (cycleWay != null){
 			wayTypeResult.setWay(cycleWay);
 			lineCacheId = rules.resolveType(lineCacheId, cycleWay, wayTypeResult);
+			if (wayTypeResult.isMatched() == false) {
+				// no match found but we have to keep it for house number processing
+				housenumberGenerator.addWay(cycleWay);
+			}
 		}
 		if (lastRoadId != way.getId()){
 			// this way was not added to the roads list
@@ -323,11 +344,16 @@
 	private NodeTypeResult nodeTypeResult = new NodeTypeResult();
 	private class NodeTypeResult implements TypeResult {
 		private Node node;
+		/** flag if the rule was fired */
+		private boolean matched;
+		
 		public void setNode(Node node) {
 			this.node = node;
+			this.matched = false;
 		}
 		
 		public void add(Element el, GType type) {
+			this.matched = true;
 			if (type.isContinueSearch()) {
 				// If not already copied, do so now
 				if (el == node) 
@@ -335,8 +361,17 @@
 			}
 			
 			postConvertRules(el, type);
+			housenumberGenerator.addNode((Node)el);
 			addPoint((Node) el, type);
 		}
+
+		/**
+		 * Retrieves if a rule of the style matched and the node is converted.
+		 * @return {@code true} node is converted; {@code false} node is not converted
+		 */
+		public boolean isMatched() {
+			return matched;
+		}
 	}
 
 	/**
@@ -353,10 +388,12 @@
 
 		preConvertRules(node);
 
-		housenumberGenerator.addNode(node);
-		
 		nodeTypeResult.setNode(node);
 		nodeRules.resolveType(node, nodeTypeResult);
+		if (nodeTypeResult.isMatched() == false) {
+			// no match found but we have to keep it for house number processing
+			housenumberGenerator.addNode(node);
+		}
 	}
 	
 
_______________________________________________
mkgmap-dev mailing list
[email protected]
http://www.mkgmap.org.uk/mailman/listinfo/mkgmap-dev

Reply via email to