Hi,

this is another performance improvement:

Usually the mkgmap input tiles are larger than the processed bounding box (splitter parameter overlap). So there are much many elements which are processed but thrown away at a late step in mkgmap.

The patch tries to remove them much earlier before the style files are processed and before the LocationHook starts (which ignores them but that must also be calculated).

The patch contains one drawback:
Ways which have all its points outside the bounding box of the tile but which cross the tile are also removed. If that's a point the patch must be improved.

Have fun!
WanMil
Index: src/uk/me/parabola/mkgmap/reader/osm/UnusedElementsRemoverHook.java
===================================================================
--- src/uk/me/parabola/mkgmap/reader/osm/UnusedElementsRemoverHook.java	(revision 0)
+++ src/uk/me/parabola/mkgmap/reader/osm/UnusedElementsRemoverHook.java	(revision 0)
@@ -0,0 +1,64 @@
+package uk.me.parabola.mkgmap.reader.osm;
+
+import java.util.ArrayList;
+
+import uk.me.parabola.imgfmt.app.Area;
+import uk.me.parabola.imgfmt.app.Coord;
+import uk.me.parabola.log.Logger;
+import uk.me.parabola.util.EnhancedProperties;
+
+public class UnusedElementsRemoverHook extends OsmReadingHooksAdaptor {
+	private static final Logger log = Logger.getLogger(UnusedElementsRemoverHook.class);
+
+	private ElementSaver saver;
+
+	public UnusedElementsRemoverHook() {
+	}
+
+	public boolean init(ElementSaver saver, EnhancedProperties props) {
+		this.saver = saver;
+		return true;
+	}
+	
+	public void end() {
+		long t1 = System.currentTimeMillis();
+		log.error("Removing unused elements");
+		
+		final Area bbox = saver.getBoundingBox();
+		
+		long nodes = saver.getNodes().size();
+		for (Node node : new ArrayList<Node>(saver.getNodes().values())) {
+			if (node.getTagCount() == 0) {
+				saver.getNodes().remove(node.getId());
+				continue;
+			}
+			if (bbox.contains(node.getLocation()) == false) {
+				saver.getNodes().remove(node.getId());
+			}
+		}
+		
+		long ways = saver.getWays().size();
+		for (Way way : new ArrayList<Way>(saver.getWays().values())) {
+			if (way.getTagCount() == 0) {
+				saver.getWays().remove(way.getId());
+				continue;
+			}
+			
+			boolean coordInBbox = false;
+			for (Coord c : way.getPoints()) {
+				if (bbox.contains(c)) {
+					coordInBbox = true;
+					break;
+				}
+			}
+			if (coordInBbox==false) {
+				saver.getWays().remove(way.getId());
+			}
+		}
+
+		log.error("Removing unused elements took "+(System.currentTimeMillis()-t1)+" ms");
+		log.error("Nodes: before "+nodes+" now "+saver.getNodes().size());	
+		log.error("Ways: before "+ways+" now "+saver.getWays().size());	
+		}
+
+}
Index: src/uk/me/parabola/mkgmap/reader/osm/OsmMapDataSource.java
===================================================================
--- src/uk/me/parabola/mkgmap/reader/osm/OsmMapDataSource.java	(revision 2159)
+++ src/uk/me/parabola/mkgmap/reader/osm/OsmMapDataSource.java	(working copy)
@@ -53,6 +53,7 @@
 	private final OsmReadingHooks[] POSSIBLE_HOOKS = {
 			new SeaGenerator(),
 			new MultiPolygonFinishHook(),
+			new UnusedElementsRemoverHook(),
 			new RoutingHook(),
 			new HighwayHooks(),
 			new LocationHook(),
_______________________________________________
mkgmap-dev mailing list
[email protected]
http://www.mkgmap.org.uk/mailman/listinfo/mkgmap-dev

Reply via email to