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