From: Scott Crosby <scro...@cs.rice.edu>

---
 src/uk/me/parabola/splitter/OSMWriter.java      |    4 ++
 src/uk/me/parabola/splitter/SplitProcessor.java |   36 +++++++++++++++++++++--
 2 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/src/uk/me/parabola/splitter/OSMWriter.java 
b/src/uk/me/parabola/splitter/OSMWriter.java
index a0d140c..701a639 100644
--- a/src/uk/me/parabola/splitter/OSMWriter.java
+++ b/src/uk/me/parabola/splitter/OSMWriter.java
@@ -37,6 +37,10 @@ public class OSMWriter {
                this.outputDir = outputDir;
        }
 
+       public Area getExtendedBounds() {
+               return extendedBounds;
+       }
+       
        public void initForWrite(int mapId, int extra) {
                extendedBounds = new Area(bounds.getMinLat() - extra,
                                                bounds.getMinLong() - extra,
diff --git a/src/uk/me/parabola/splitter/SplitProcessor.java 
b/src/uk/me/parabola/splitter/SplitProcessor.java
index 24d23db..716c50b 100644
--- a/src/uk/me/parabola/splitter/SplitProcessor.java
+++ b/src/uk/me/parabola/splitter/SplitProcessor.java
@@ -16,6 +16,9 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.BitSet;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.Map.Entry;
+import java.util.TreeMap;
 import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.BlockingQueue;
 
@@ -41,8 +44,31 @@ class SplitProcessor implements MapProcessor {
        
        private final int maxThreads;
 
+       TreeMap<Integer,ArrayList<OSMWriter>> writermap = new 
TreeMap<Integer,ArrayList<OSMWriter>>();
+       HashMap<OSMWriter,Integer> writerToID = new 
HashMap<OSMWriter,Integer>();
+       
+       void makeWriterMap() {
+               for (int i = 0 ; i < writers.length ; i++) {
+                       writerToID.put(writers[i],i);
+               }
+               
+               for (OSMWriter w : writers) {
+                       writermap.put(w.getExtendedBounds().getMinLat(),new 
ArrayList<OSMWriter>());
+                       writermap.put(w.getExtendedBounds().getMaxLat(),new 
ArrayList<OSMWriter>());
+               }
+               for (OSMWriter w: writers) {
+                       int minlat = w.getExtendedBounds().getMinLat();
+                       int maxlat = w.getExtendedBounds().getMaxLat();
+                       for (Integer i = minlat ; i != null && i <= maxlat;  i 
= writermap.higherKey(i)) {
+                               writermap.get(i).add(w);
+                       }
+               }
+
+       }
+
        SplitProcessor(OSMWriter[] writers, int maxThreads) {
                this.writers = writers;
+               makeWriterMap();
                this.maxThreads = maxThreads;
                this.writerInputQueue = new 
ArrayBlockingQueue<InputQueueInfo>(writers.length); 
                this.writerInputQueues = new BlockingQueue[writers.length];
@@ -195,13 +221,17 @@ class SplitProcessor implements MapProcessor {
        }
 
        private void writeNode(Node currentNode) throws IOException {
-               for (int n = 0; n < writers.length; n++) {
-                       boolean found = 
writers[n].nodeBelongsToThisArea(currentNode); 
+               Entry<Integer, ArrayList<OSMWriter>> entry = 
writermap.floorEntry(currentNode.getMapLat());
+               if (entry == null)
+                       return;
+               for (OSMWriter w : entry.getValue()) {
+                       int n = writerToID.get(w);
+                       boolean found = w.nodeBelongsToThisArea(currentNode); 
                        if (found) {
                                if (maxThreads > 1) {
                                        addToWorkingQueue(n, currentNode);
                                } else {
-                                       writers[n].write(currentNode);
+                                       w.write(currentNode);
                                }
                                if (currentNodeAreaSet == 0) {
                                        currentNodeAreaSet = n + 1;
-- 
1.7.2.3

_______________________________________________
mkgmap-dev mailing list
mkgmap-dev@lists.mkgmap.org.uk
http://www.mkgmap.org.uk/mailman/listinfo/mkgmap-dev

Reply via email to