From 0e633cb2d7954a10d7b921006d6695b6c5e0ee58 Mon Sep 17 00:00:00 2001 From: MGlolenstine Date: Sat, 9 Jun 2018 08:18:44 +0200 Subject: [PATCH 1/2] Updated the library for Processing 3 and added Makefile builds for different Java versions. --- .gitignore | 0 INSTALL | 0 Java6/modestmaps/library/modestmaps.jar | Bin 0 -> 30990 bytes Java7/modestmaps/library/modestmaps.jar | Bin 0 -> 30004 bytes Java8/modestmaps/library/modestmaps.jar | Bin 0 -> 30008 bytes LICENSE | 0 Makefile | 55 +- README | 0 .../AndroidManifest.xml | 12 + examples/modest_maps_interactive/Button.pde | 0 .../code/sketch.properties | 3 + .../modest_maps_interactive.pde | 21 +- examples/modest_maps_static/atkinson.pde | 0 ...st_maps_lib.pde => modest_maps_static.pde} | 11 +- examples/modest_maps_static/tests.pde | 0 .../library/modestmaps.jar | Bin src/com/modestmaps/InteractiveMap.java | 1169 ++++++++++------- src/com/modestmaps/StaticMap.java | 5 +- src/com/modestmaps/core/Coordinate.java | 0 src/com/modestmaps/core/MapCenter.java | 0 src/com/modestmaps/core/Point2f.java | 0 .../modestmaps/geo/AbstractProjection.java | 0 src/com/modestmaps/geo/LinearProjection.java | 0 src/com/modestmaps/geo/Location.java | 0 .../modestmaps/geo/MercatorProjection.java | 0 src/com/modestmaps/geo/Transformation.java | 0 src/com/modestmaps/package.html | 0 .../providers/AbstractMapProvider.java | 0 src/com/modestmaps/providers/Microsoft.java | 0 src/com/modestmaps/providers/Yahoo.java | 0 30 files changed, 739 insertions(+), 537 deletions(-) mode change 100644 => 100755 .gitignore mode change 100644 => 100755 INSTALL create mode 100644 Java6/modestmaps/library/modestmaps.jar create mode 100644 Java7/modestmaps/library/modestmaps.jar create mode 100644 Java8/modestmaps/library/modestmaps.jar mode change 100644 => 100755 LICENSE mode change 100644 => 100755 Makefile mode change 100644 => 100755 README create mode 100755 examples/modest_maps_interactive/AndroidManifest.xml mode change 100644 => 100755 examples/modest_maps_interactive/Button.pde create mode 100755 examples/modest_maps_interactive/code/sketch.properties mode change 100644 => 100755 examples/modest_maps_interactive/modest_maps_interactive.pde mode change 100644 => 100755 examples/modest_maps_static/atkinson.pde rename examples/modest_maps_static/{modest_maps_lib.pde => modest_maps_static.pde} (61%) mode change 100644 => 100755 mode change 100644 => 100755 examples/modest_maps_static/tests.pde rename {modestmaps => modestmaps2}/library/modestmaps.jar (100%) mode change 100644 => 100755 mode change 100644 => 100755 src/com/modestmaps/InteractiveMap.java mode change 100644 => 100755 src/com/modestmaps/StaticMap.java mode change 100644 => 100755 src/com/modestmaps/core/Coordinate.java mode change 100644 => 100755 src/com/modestmaps/core/MapCenter.java mode change 100644 => 100755 src/com/modestmaps/core/Point2f.java mode change 100644 => 100755 src/com/modestmaps/geo/AbstractProjection.java mode change 100644 => 100755 src/com/modestmaps/geo/LinearProjection.java mode change 100644 => 100755 src/com/modestmaps/geo/Location.java mode change 100644 => 100755 src/com/modestmaps/geo/MercatorProjection.java mode change 100644 => 100755 src/com/modestmaps/geo/Transformation.java mode change 100644 => 100755 src/com/modestmaps/package.html mode change 100644 => 100755 src/com/modestmaps/providers/AbstractMapProvider.java mode change 100644 => 100755 src/com/modestmaps/providers/Microsoft.java mode change 100644 => 100755 src/com/modestmaps/providers/Yahoo.java diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/INSTALL b/INSTALL old mode 100644 new mode 100755 diff --git a/Java6/modestmaps/library/modestmaps.jar b/Java6/modestmaps/library/modestmaps.jar new file mode 100644 index 0000000000000000000000000000000000000000..f2fae47b5b614b56b4a30fa7c87ae91d7cd68891 GIT binary patch literal 30990 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 literal 0 HcmV?d00001 diff --git a/Java7/modestmaps/library/modestmaps.jar b/Java7/modestmaps/library/modestmaps.jar new file mode 100644 index 0000000000000000000000000000000000000000..c9bb37f9ab6e7274a920bcdd4d67aac08e3284cb GIT binary patch literal 30004 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 literal 0 HcmV?d00001 diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/Makefile b/Makefile old mode 100644 new mode 100755 index 8e62794..202d2dc --- a/Makefile +++ b/Makefile @@ -1,16 +1,55 @@ # change these if you're not on a Mac, or don't run "make install" :) -PROCESSING_PATH = "/Applications/Processing.app/Contents/Resources/Java/core.jar" -LIBRARY_PATH = "/Users/$(USER)/Documents/Processing/libraries/" +#PROCESSING_PATH = "/Applications/Processing.app/Contents/Resources/Java/core.jar" +PROCESSING_PATH = "/home/notyours/processing-3.3.7/core/library/core.jar" +#LIBRARY_PATH = "/Users/$(USER)/Documents/Processing/libraries/" +LIBRARY_PATH = "/home/notyours/sketchbook/libraries/" -modestmaps/library/modestmaps.jar: +#modestmaps/library/modestmaps.jar: +java6: mkdir -p classes - javac -sourcepath src/ -cp $(PROCESSING_PATH) -d classes src/com/modestmaps/*.java src/com/modestmaps/core/*.java src/com/modestmaps/providers/*.java src/com/modestmaps/geo/*.java - mkdir -p modestmaps/library - jar cvf modestmaps/library/modestmaps.jar -C classes . + javac -sourcepath src/ -cp $(PROCESSING_PATH) -d classes src/com/modestmaps/*.java src/com/modestmaps/core/*.java src/com/modestmaps/providers/*.java src/com/modestmaps/geo/*.java -source 6 -target 6 + mkdir -p Java6/modestmaps/library + jar cvf Java6/modestmaps/library/modestmaps.jar -C classes . -install: modestmaps/library/modestmaps.jar - cp -r modestmaps $(LIBRARY_PATH) +java7: + mkdir -p classes + javac -sourcepath src/ -cp $(PROCESSING_PATH) -d classes src/com/modestmaps/*.java src/com/modestmaps/core/*.java src/com/modestmaps/providers/*.java src/com/modestmaps/geo/*.java -source 7 -target 7 + mkdir -p Java7/modestmaps/library + jar cvf Java7/modestmaps/library/modestmaps.jar -C classes . + +java8: + mkdir -p classes + javac -sourcepath src/ -cp $(PROCESSING_PATH) -d classes src/com/modestmaps/*.java src/com/modestmaps/core/*.java src/com/modestmaps/providers/*.java src/com/modestmaps/geo/*.java -source 8 -target 8 + mkdir -p Java8/modestmaps/library + jar cvf Java8/modestmaps/library/modestmaps.jar -C classes . + +all: + #Java6 build + mkdir -p classes + javac -sourcepath src/ -cp $(PROCESSING_PATH) -d classes src/com/modestmaps/*.java src/com/modestmaps/core/*.java src/com/modestmaps/providers/*.java src/com/modestmaps/geo/*.java -source 6 -target 6 + mkdir -p Java6/modestmaps/library + jar cvf Java6/modestmaps/library/modestmaps.jar -C classes . + rm -rf classes/* + #Java7 build + mkdir -p classes + javac -sourcepath src/ -cp $(PROCESSING_PATH) -d classes src/com/modestmaps/*.java src/com/modestmaps/core/*.java src/com/modestmaps/providers/*.java src/com/modestmaps/geo/*.java -source 7 -target 7 + mkdir -p Java7/modestmaps/library + jar cvf Java7/modestmaps/library/modestmaps.jar -C classes . + rm -rf classes/* + #Java8 build + mkdir -p classes + javac -sourcepath src/ -cp $(PROCESSING_PATH) -d classes src/com/modestmaps/*.java src/com/modestmaps/core/*.java src/com/modestmaps/providers/*.java src/com/modestmaps/geo/*.java -source 8 -target 8 + mkdir -p Java8/modestmaps/library + jar cvf Java8/modestmaps/library/modestmaps.jar -C classes . + + +#install: modestmaps/library/modestmaps.jar +install: java6 + cp -r Java6/modestmaps $(LIBRARY_PATH) clean: rm -rf classes/* rm -rf modestmaps + rm -rf Java6 + rm -rf Java7 + rm -rf Java8 diff --git a/README b/README old mode 100644 new mode 100755 diff --git a/examples/modest_maps_interactive/AndroidManifest.xml b/examples/modest_maps_interactive/AndroidManifest.xml new file mode 100755 index 0000000..5dfce5c --- /dev/null +++ b/examples/modest_maps_interactive/AndroidManifest.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/examples/modest_maps_interactive/Button.pde b/examples/modest_maps_interactive/Button.pde old mode 100644 new mode 100755 diff --git a/examples/modest_maps_interactive/code/sketch.properties b/examples/modest_maps_interactive/code/sketch.properties new file mode 100755 index 0000000..cedc49b --- /dev/null +++ b/examples/modest_maps_interactive/code/sketch.properties @@ -0,0 +1,3 @@ +mode=Java +component=app +mode.id=processing.mode.java.JavaMode diff --git a/examples/modest_maps_interactive/modest_maps_interactive.pde b/examples/modest_maps_interactive/modest_maps_interactive.pde old mode 100644 new mode 100755 index f6ee2e0..32af8ad --- a/examples/modest_maps_interactive/modest_maps_interactive.pde +++ b/examples/modest_maps_interactive/modest_maps_interactive.pde @@ -31,8 +31,7 @@ boolean gui = true; double tx, ty, sc; void setup() { - size(640, 480, OPENGL); - smooth(); + size(1280, 720); // create a new map, optionally specify a provider @@ -42,10 +41,11 @@ void setup() { // AOL/MapQuest provides open tiles too // see http://developer.mapquest.com/web/products/open/map for terms - // and this is how to use them: - String template = "http://{S}.mqcdn.com/tiles/1.0.0/osm/{Z}/{X}/{Y}.png"; - String[] subdomains = new String[] { "otile1", "otile2", "otile3", "otile4" }; // optional - map = new InteractiveMap(this, new TemplatedMapProvider(template, subdomains)); + //// and this is how to use them: + //String template = "http://{S}.mqcdn.com/tiles/1.0.0/osm/{Z}/{X}/{Y}.png"; + //String[] subdomains = new String[] { "otile1", "otile2", "otile3", "otile4" }; // optional + //map = new InteractiveMap(this, new TemplatedMapProvider(template, subdomains)); + map = new InteractiveMap(this); // others would be "new Microsoft.HybridProvider()" or "new Microsoft.AerialProvider()" // the Google ones get blocked after a few hundred tiles @@ -58,14 +58,6 @@ void setup() { // set a default font for labels font = createFont("Helvetica", 12); - - // enable the mouse wheel, for zooming - addMouseWheelListener(new java.awt.event.MouseWheelListener() { - public void mouseWheelMoved(java.awt.event.MouseWheelEvent evt) { - mouseWheel(evt.getWheelRotation()); - } - }); - } void draw() { @@ -227,4 +219,3 @@ void mouseClicked() { map.panRight(); } } - diff --git a/examples/modest_maps_static/atkinson.pde b/examples/modest_maps_static/atkinson.pde old mode 100644 new mode 100755 diff --git a/examples/modest_maps_static/modest_maps_lib.pde b/examples/modest_maps_static/modest_maps_static.pde old mode 100644 new mode 100755 similarity index 61% rename from examples/modest_maps_static/modest_maps_lib.pde rename to examples/modest_maps_static/modest_maps_static.pde index 81ddce0..2ef32eb --- a/examples/modest_maps_static/modest_maps_lib.pde +++ b/examples/modest_maps_static/modest_maps_static.pde @@ -14,23 +14,18 @@ import com.modestmaps.providers.*; // void setup() { - size(screen.width/2, screen.height/2); - if (!runTests(false)) { - println("one or more tests failed"); - exit(); - } + size(1280, 720); noLoop(); } void draw() { - StaticMap m = new StaticMap(this, new Microsoft.AerialProvider(), new Point2f(width/2, height), new Location(51.5, -0.137), 12); + StaticMap m = new StaticMap(this, new Microsoft.RoadProvider(), new Point2f(width, height), new Location(46.086292, 14.478332), 16); PImage img = m.draw(true); image(img,0,0); - img = atkinsonDither(img); - image(img,width/2,0); + ellipse(width/2, height/2, 5, 5); println("done"); diff --git a/examples/modest_maps_static/tests.pde b/examples/modest_maps_static/tests.pde old mode 100644 new mode 100755 diff --git a/modestmaps/library/modestmaps.jar b/modestmaps2/library/modestmaps.jar old mode 100644 new mode 100755 similarity index 100% rename from modestmaps/library/modestmaps.jar rename to modestmaps2/library/modestmaps.jar diff --git a/src/com/modestmaps/InteractiveMap.java b/src/com/modestmaps/InteractiveMap.java old mode 100644 new mode 100755 index 6c8469f..6614c8d --- a/src/com/modestmaps/InteractiveMap.java +++ b/src/com/modestmaps/InteractiveMap.java @@ -1,307 +1,472 @@ - package com.modestmaps; - - import processing.core.*; - import java.util.*; - import com.modestmaps.geo.*; - import com.modestmaps.core.*; - import com.modestmaps.providers.*; - - public class InteractiveMap implements PConstants { - - // I have made the dumb mistake of getting these wrong before... - // it's REALLY unlikely you'll want to change them: - public int TILE_WIDTH = 256; - public int TILE_HEIGHT = 256; - - // unavoidable right now, for loadImage and float maths - public PApplet p; - - // pan and zoom - public double tx = -TILE_WIDTH/2; // half the world width, at zoom 0 - public double ty = -TILE_HEIGHT/2; // half the world height, at zoom 0 - public double sc = 1; - - // limit simultaneous calls to loadImage - public int MAX_PENDING = 4; - - // limit tiles in memory - // 256 would be 64 MB, you may want to lower this quite a bit for your app - public int MAX_IMAGES_TO_KEEP = 256; - - // upping this can help appearances when zooming out, but also loads many more tiles - public int GRID_PADDING = 1; - - // what kinda maps? - public AbstractMapProvider provider; - - // how big? - public float width, height; - - // loading tiles - public Hashtable pending = new Hashtable(); // coord -> TileLoader - // loaded tiles - public Hashtable images = new Hashtable(); // coord -> PImage - // coords waiting to load - public Vector queue = new Vector(); - // a list of the most recent MAX_IMAGES_TO_KEEP PImages we've seen - public Vector recentImages = new Vector(); - - // for sorting coordinates by zoom - public ZoomComparator zoomComparator = new ZoomComparator(); - - // for loading tiles from the inside first - public QueueSorter queueSorter = new QueueSorter(); - - /** default to Microsoft Hybrid */ - public InteractiveMap(PApplet p) { - this(p, new Microsoft.HybridProvider()); - } - - /** new map using applet width and height, and given provider */ - public InteractiveMap(PApplet p, AbstractMapProvider provider) { - this(p, provider, p.width, p.height); - } - - /** make a new interactive map, using the given provider, of the given width and height */ - public InteractiveMap(PApplet p, AbstractMapProvider provider, float width, float height) { - - this.p = p; - this.provider = provider; - this.width = width; - this.height = height; - - // fit to screen - sc = p.ceil(p.min(height/(float)TILE_WIDTH, width/(float)TILE_HEIGHT)); - - } - - /** draw the map on the given PApplet */ - public void draw() { - - // remember smooth setting so it can be reset - boolean smooth = p.g.smooth; - int imageMode = p.g.imageMode; - - // !!! VERY IMPORTANT - // (all the renderers apart from OpenGL will choke if you ask for smooth scaling of image calls) - p.noSmooth(); - - // we need this, or our tiles will not be drawn in the right place - p.imageMode(p.CORNER); - - // translate and scale, from the middle - p.pushMatrix(); - p.translate(width/2, height/2); - p.scale((float)sc); - p.translate((float)tx, (float)ty); - - // find the bounds of the ur-tile in screen-space: - float minX = p.screenX(0,0); - float minY = p.screenY(0,0); - float maxX = p.screenX(TILE_WIDTH, TILE_HEIGHT); - float maxY = p.screenY(TILE_WIDTH, TILE_HEIGHT); - - // what power of 2 are we at? - // 0 when scale is around 1, 1 when scale is around 2, - // 2 when scale is around 4, 3 when scale is around 8, etc. - int zoom = bestZoomForScale((float)sc); - - // how many columns and rows of tiles at this zoom? - // (this is basically (int)sc, but let's derive from zoom to be sure - int cols = (int)p.pow(2,zoom); - int rows = (int)p.pow(2,zoom); - - // find the biggest box the screen would fit in:, aligned with the map: - float screenMinX = 0; - float screenMinY = 0; - float screenMaxX = width; - float screenMaxY = height; - // TODO: align this, and fix the next bit to work with rotated maps - - // find start and end columns - int minCol = (int)p.floor(cols * (screenMinX-minX) / (maxX-minX)); - int maxCol = (int)p.ceil(cols * (screenMaxX-minX) / (maxX-minX)) - 1; - int minRow = (int)p.floor(rows * (screenMinY-minY) / (maxY-minY)); - int maxRow = (int)p.ceil(rows * (screenMaxY-minY) / (maxY-minY)) - 1; - - // pad a bit, for luck (well, because we might be zooming out between zoom levels) - minCol -= GRID_PADDING; - minRow -= GRID_PADDING; - maxCol += GRID_PADDING; - maxRow += GRID_PADDING; - - // we don't wrap around the world yet, so: - minCol = p.constrain(minCol, 0, cols); - maxCol = p.constrain(maxCol, 0, cols); - minRow = p.constrain(minRow, 0, rows); - maxRow = p.constrain(maxRow, 0, rows); - - // keep track of what we can see already: - Vector visibleKeys = new Vector(); - - // grab coords for visible tiles - for (int col = minCol; col <= maxCol; col++) { - for (int row = minRow; row <= maxRow; row++) { - - // source coordinate wraps around the world: - Coordinate coord = provider.sourceCoordinate(new Coordinate(row,col,zoom)); - - // let's make sure we still have ints: - coord.row = p.round(coord.row); - coord.column = p.round(coord.column); - coord.zoom = p.round(coord.zoom); - - // keep this for later: - visibleKeys.add(coord); - - if (!images.containsKey(coord)) { - // fetch it if we don't have it - grabTile(coord); - - // see if we have a parent coord for this tile? - boolean gotParent = false; - for (int i = (int)coord.zoom; i > 0; i--) { - Coordinate zoomed = coord.zoomTo(i).container(); - // make sure we still have ints: - zoomed.row = p.round(zoomed.row); - zoomed.column = p.round(zoomed.column); - zoomed.zoom = p.round(zoomed.zoom); - if (images.containsKey(zoomed)) { - visibleKeys.add(zoomed); - gotParent = true; - break; - } - } - - // or if we have any of the children - if (!gotParent) { - Coordinate zoomed = coord.zoomBy(1).container(); - Coordinate[] kids = { zoomed, zoomed.right(), zoomed.down(), zoomed.right().down() }; - for (int i = 0; i < kids.length; i++) { - zoomed = kids[i]; - // make sure we still have ints: - zoomed.row = p.round(zoomed.row); - zoomed.column = p.round(zoomed.column); - zoomed.zoom = p.round(zoomed.zoom); - if (images.containsKey(zoomed)) { - visibleKeys.add(zoomed); - } - } - } - - } - - } // rows - } // columns - - // sort by zoom so we draw small zoom levels (big tiles) first: - Collections.sort(visibleKeys, zoomComparator); - - if (visibleKeys.size() > 0) { - Coordinate previous = (Coordinate)visibleKeys.get(0); - p.pushMatrix(); - // correct the scale for this zoom level: - p.scale(1.0f/p.pow(2, previous.zoom)); - for (int i = 0; i < visibleKeys.size(); i++) { - Coordinate coord = (Coordinate)visibleKeys.get(i); - - if (coord.zoom != previous.zoom) { - p.popMatrix(); - p.pushMatrix(); - // correct the scale for this zoom level: - p.scale(1.0f/p.pow(2,coord.zoom)); - } - - if (images.containsKey(coord)) { - PImage tile = (PImage)images.get(coord); - p.image(tile,coord.column*TILE_WIDTH,coord.row*TILE_HEIGHT,TILE_WIDTH,TILE_HEIGHT); - if (recentImages.contains(tile)) { - recentImages.remove(tile); - } - recentImages.add(tile); - } - } - p.popMatrix(); - } - - p.popMatrix(); - - // stop fetching things we can't see: - // (visibleKeys also has the parents and children, if needed, but that shouldn't matter) - queue.retainAll(visibleKeys); - - // sort what's left by distance from center: - queueSorter.setCenter(new Coordinate( (minRow + maxRow) / 2.0f, (minCol + maxCol) / 2.0f, zoom)); - Collections.sort(queue, queueSorter); - - // load up to 4 more things: - processQueue(); - - // clear some images away if we have too many... - if (recentImages.size() > MAX_IMAGES_TO_KEEP) { - recentImages.subList(0, recentImages.size()-MAX_IMAGES_TO_KEEP).clear(); - images.values().retainAll(recentImages); - } - - // restore smoothing, if needed - if (smooth) { - p.smooth(); - } - // restore image mode - p.imageMode(imageMode); - - } - - /** @return zoom level of currently visible tile layer */ - public int getZoom() { - return bestZoomForScale((float)sc); - } - - public Location getCenter() { - return provider.coordinateLocation(getCenterCoordinate()); - } - - public Coordinate getCenterCoordinate() { - float row = (float)(ty*sc/-TILE_WIDTH); - float column = (float)(tx*sc/-TILE_HEIGHT); - float zoom = zoomForScale((float)sc); - return new Coordinate(row, column, zoom); - } - - public void setCenter(Coordinate center) { - //println("setting center to " + center); - sc = p.pow(2.0f, center.zoom); - tx = -TILE_WIDTH*center.column/sc; - ty = -TILE_HEIGHT*center.row/sc; - } - - public void setCenter(Location location) { - setCenter(provider.locationCoordinate(location).zoomTo(getZoom())); - } - - public void setCenterZoom(Location location, int zoom) { - setCenter(provider.locationCoordinate(location).zoomTo(zoom)); - } - - /** sets scale according to given zoom level, should leave you with pixel perfect tiles */ - public void setZoom(int zoom) { - sc = p.pow(2.0f, zoom); - } - - public void zoom(int dir) { - sc = p.pow(2.0f, getZoom()+dir); - } - - public void zoomIn() { - sc = p.pow(2.0f, getZoom()+1); - } - - public void zoomOut() { - sc = p.pow(2.0f, getZoom()-1); - } - - // public function setExtent(extent:MapExtent):void - // public function getExtent():MapExtent +package com.modestmaps; + +import processing.core.*; +import java.util.*; +import com.modestmaps.geo.*; +import com.modestmaps.core.*; +import com.modestmaps.providers.*; + +import static processing.core.PApplet.floor; + +public class InteractiveMap implements PConstants { + + // I have made the dumb mistake of getting these wrong before... + // it's REALLY unlikely you'll want to change them: + public int TILE_WIDTH = 256; + public int TILE_HEIGHT = 256; + + // unavoidable right now, for loadImage and float maths + public PApplet p; + + // pan and zoom + public double tx = -TILE_WIDTH/2; // half the world width, at zoom 0 + public double ty = -TILE_HEIGHT/2; // half the world height, at zoom 0 + public double sc = 1; + + // limit simultaneous calls to loadImage + public int MAX_PENDING = 4; + + // limit tiles in memory + // 256 would be 64 MB, you may want to lower this quite a bit for your app + public int MAX_IMAGES_TO_KEEP = 256; + + // upping this can help appearances when zooming out, but also loads many more tiles + public int GRID_PADDING = 1; + + // what kinda maps? + public AbstractMapProvider provider; + + // how big? + public float width, height; + + // loading tiles + public Hashtable pending = new Hashtable(); // coord -> TileLoader + // loaded tiles + public Hashtable images = new Hashtable(); // coord -> PImage + // coords waiting to load + public Vector queue = new Vector(); + // a list of the most recent MAX_IMAGES_TO_KEEP PImages we've seen + public Vector recentImages = new Vector(); + + // for sorting coordinates by zoom + public ZoomComparator zoomComparator = new ZoomComparator(); + + // for loading tiles from the inside first + public QueueSorter queueSorter = new QueueSorter(); + + /** default to Microsoft Hybrid */ + public InteractiveMap(PApplet p) { + this(p, new Microsoft.HybridProvider()); + } + + /** new map using applet width and height, and given provider */ + public InteractiveMap(PApplet p, AbstractMapProvider provider) { + this(p, provider, p.width, p.height); + } + + /** make a new interactive map, using the given provider, of the given width and height */ + public InteractiveMap(PApplet p, AbstractMapProvider provider, float width, float height) { + + this.p = p; + this.provider = provider; + this.width = width; + this.height = height; + + // fit to screen + sc = PApplet.ceil(PApplet.min(height/(float)TILE_WIDTH, width/(float)TILE_HEIGHT)); + + } + + /** draw the map on the given PApplet */ + public void draw() { + + // remember smooth setting so it can be reset + int imageMode = p.g.imageMode; + + // we need this, or our tiles will not be drawn in the right place + p.imageMode(p.CORNER); + + // translate and scale, from the middle + p.pushMatrix(); + p.translate(width/2, height/2); + p.scale((float)sc); + p.translate((float)tx, (float)ty); + + // find the bounds of the ur-tile in screen-space: + float minX = p.screenX(0,0); + float minY = p.screenY(0,0); + float maxX = p.screenX(TILE_WIDTH, TILE_HEIGHT); + float maxY = p.screenY(TILE_WIDTH, TILE_HEIGHT); + + // what power of 2 are we at? + // 0 when scale is around 1, 1 when scale is around 2, + // 2 when scale is around 4, 3 when scale is around 8, etc. + int zoom = bestZoomForScale((float)sc); + + // how many columns and rows of tiles at this zoom? + // (this is basically (int)sc, but let's derive from zoom to be sure + int cols = (int)p.pow(2,zoom); + int rows = (int)p.pow(2,zoom); + + // find the biggest box the screen would fit in:, aligned with the map: + float screenMinX = 0; + float screenMinY = 0; + float screenMaxX = width; + float screenMaxY = height; + // TODO: align this, and fix the next bit to work with rotated maps + + // find start and end columns + int minCol = (int) floor(cols * (screenMinX-minX) / (maxX-minX)); + int maxCol = (int)p.ceil(cols * (screenMaxX-minX) / (maxX-minX)) - 1; + int minRow = (int) floor(rows * (screenMinY-minY) / (maxY-minY)); + int maxRow = (int)p.ceil(rows * (screenMaxY-minY) / (maxY-minY)) - 1; + + // pad a bit, for luck (well, because we might be zooming out between zoom levels) + minCol -= GRID_PADDING; + minRow -= GRID_PADDING; + maxCol += GRID_PADDING; + maxRow += GRID_PADDING; + + // we don't wrap around the world yet, so: + minCol = p.constrain(minCol, 0, cols); + maxCol = p.constrain(maxCol, 0, cols); + minRow = p.constrain(minRow, 0, rows); + maxRow = p.constrain(maxRow, 0, rows); + + // keep track of what we can see already: + Vector visibleKeys = new Vector(); + + // grab coords for visible tiles + for (int col = minCol; col <= maxCol; col++) { + for (int row = minRow; row <= maxRow; row++) { + + // source coordinate wraps around the world: + Coordinate coord = provider.sourceCoordinate(new Coordinate(row,col,zoom)); + + // let's make sure we still have ints: + coord.row = p.round(coord.row); + coord.column = p.round(coord.column); + coord.zoom = p.round(coord.zoom); + + // keep this for later: + visibleKeys.add(coord); + + if (!images.containsKey(coord)) { + // fetch it if we don't have it + grabTile(coord); + + // see if we have a parent coord for this tile? + boolean gotParent = false; + for (int i = (int)coord.zoom; i > 0; i--) { + Coordinate zoomed = coord.zoomTo(i).container(); + // make sure we still have ints: + zoomed.row = p.round(zoomed.row); + zoomed.column = p.round(zoomed.column); + zoomed.zoom = p.round(zoomed.zoom); + if (images.containsKey(zoomed)) { + visibleKeys.add(zoomed); + gotParent = true; + break; + } + } + + // or if we have any of the children + if (!gotParent) { + Coordinate zoomed = coord.zoomBy(1).container(); + Coordinate[] kids = { zoomed, zoomed.right(), zoomed.down(), zoomed.right().down() }; + for (int i = 0; i < kids.length; i++) { + zoomed = kids[i]; + // make sure we still have ints: + zoomed.row = p.round(zoomed.row); + zoomed.column = p.round(zoomed.column); + zoomed.zoom = p.round(zoomed.zoom); + if (images.containsKey(zoomed)) { + visibleKeys.add(zoomed); + } + } + } + + } + + } // rows + } // columns + + // sort by zoom so we draw small zoom levels (big tiles) first: + Collections.sort(visibleKeys, zoomComparator); + + if (visibleKeys.size() > 0) { + Coordinate previous = visibleKeys.get(0); + p.pushMatrix(); + // correct the scale for this zoom level: + p.scale(1.0f/p.pow(2, previous.zoom)); + for (int i = 0; i < visibleKeys.size(); i++) { + Coordinate coord = visibleKeys.get(i); + + if (coord.zoom != previous.zoom) { + p.popMatrix(); + p.pushMatrix(); + // correct the scale for this zoom level: + p.scale(1.0f/p.pow(2,coord.zoom)); + } + + if (images.containsKey(coord)) { + PImage tile = images.get(coord); + p.image(tile,coord.column*TILE_WIDTH,coord.row*TILE_HEIGHT,TILE_WIDTH,TILE_HEIGHT); + if (recentImages.contains(tile)) { + recentImages.remove(tile); + } + recentImages.add(tile); + } + } + p.popMatrix(); + } + + p.popMatrix(); + + // stop fetching things we can't see: + // (visibleKeys also has the parents and children, if needed, but that shouldn't matter) + queue.retainAll(visibleKeys); + + // sort what's left by distance from center: + queueSorter.setCenter(new Coordinate( (minRow + maxRow) / 2.0f, (minCol + maxCol) / 2.0f, zoom)); + Collections.sort(queue, queueSorter); + + // load up to 4 more things: + processQueue(); + + // clear some images away if we have too many... + if (recentImages.size() > MAX_IMAGES_TO_KEEP) { + recentImages.subList(0, recentImages.size()-MAX_IMAGES_TO_KEEP).clear(); + images.values().retainAll(recentImages); + } + + // restore image mode + p.imageMode(imageMode); + + } + + /** return the map as a PImage */ + public PImage getImage() { + PGraphics img = p.createGraphics(floor(width), floor(height)); + img.beginDraw(); +// img.fill(51); +// img.rect(0, 0, img.width, img.height); + // remember smooth setting so it can be reset + int imageMode = p.g.imageMode; + + // we need this, or our tiles will not be drawn in the right place + img.imageMode(p.CORNER); + + // translate and scale, from the middle + img.pushMatrix(); + img.translate(width/2, height/2); + img.scale((float)sc); + img.translate((float)tx, (float)ty); + + // find the bounds of the ur-tile in screen-space: + float minX = img.screenX(0,0); + float minY = img.screenY(0,0); + float maxX = img.screenX(TILE_WIDTH, TILE_HEIGHT); + float maxY = img.screenY(TILE_WIDTH, TILE_HEIGHT); + + // what power of 2 are we at? + // 0 when scale is around 1, 1 when scale is around 2, + // 2 when scale is around 4, 3 when scale is around 8, etc. + int zoom = bestZoomForScale((float)sc); + + // how many columns and rows of tiles at this zoom? + // (this is basically (int)sc, but let's derive from zoom to be sure + int cols = (int) PApplet.pow(2,zoom); + int rows = (int) PApplet.pow(2,zoom); + + // find the biggest box the screen would fit in:, aligned with the map: + float screenMinX = 0; + float screenMinY = 0; + float screenMaxX = width; + float screenMaxY = height; + // TODO: align this, and fix the next bit to work with rotated maps + + // find start and end columns + int minCol = (int) floor(cols * (screenMinX-minX) / (maxX-minX)); + int maxCol = (int) PApplet.ceil(cols * (screenMaxX-minX) / (maxX-minX)) - 1; + int minRow = (int) floor(rows * (screenMinY-minY) / (maxY-minY)); + int maxRow = (int) PApplet.ceil(rows * (screenMaxY-minY) / (maxY-minY)) - 1; + + // pad a bit, for luck (well, because we might be zooming out between zoom levels) + minCol -= GRID_PADDING; + minRow -= GRID_PADDING; + maxCol += GRID_PADDING; + maxRow += GRID_PADDING; + + // we don't wrap around the world yet, so: + minCol = PApplet.constrain(minCol, 0, cols); + maxCol = PApplet.constrain(maxCol, 0, cols); + minRow = PApplet.constrain(minRow, 0, rows); + maxRow = PApplet.constrain(maxRow, 0, rows); + + // keep track of what we can see already: + Vector visibleKeys = new Vector(); + + // grab coords for visible tiles + for (int col = minCol; col <= maxCol; col++) { + for (int row = minRow; row <= maxRow; row++) { + + // source coordinate wraps around the world: + Coordinate coord = provider.sourceCoordinate(new Coordinate(row,col,zoom)); + + // let's make sure we still have ints: + coord.row = PApplet.round(coord.row); + coord.column = PApplet.round(coord.column); + coord.zoom = PApplet.round(coord.zoom); + + // keep this for later: + visibleKeys.add(coord); + + if (!images.containsKey(coord)) { + // fetch it if we don't have it + grabTile(coord); + + // see if we have a parent coord for this tile? + boolean gotParent = false; + for (int i = (int)coord.zoom; i > 0; i--) { + Coordinate zoomed = coord.zoomTo(i).container(); + // make sure we still have ints: + zoomed.row = PApplet.round(zoomed.row); + zoomed.column = PApplet.round(zoomed.column); + zoomed.zoom = PApplet.round(zoomed.zoom); + if (images.containsKey(zoomed)) { + visibleKeys.add(zoomed); + gotParent = true; + break; + } + } + + // or if we have any of the children + if (!gotParent) { + Coordinate zoomed = coord.zoomBy(1).container(); + Coordinate[] kids = { zoomed, zoomed.right(), zoomed.down(), zoomed.right().down() }; + for (Coordinate kid : kids) { + zoomed = kid; + // make sure we still have ints: + zoomed.row = PApplet.round(zoomed.row); + zoomed.column = PApplet.round(zoomed.column); + zoomed.zoom = PApplet.round(zoomed.zoom); + if (images.containsKey(zoomed)) { + visibleKeys.add(zoomed); + } + } + } + + } + + } // rows + } // columns + + // sort by zoom so we draw small zoom levels (big tiles) first: + Collections.sort(visibleKeys, zoomComparator); + + if (visibleKeys.size() > 0) { + Coordinate previous = visibleKeys.get(0); + img.pushMatrix(); + // correct the scale for this zoom level: + img.scale(1.0f/ PApplet.pow(2, previous.zoom)); + for (int i = 0; i < visibleKeys.size(); i++) { + Coordinate coord = visibleKeys.get(i); + + if (coord.zoom != previous.zoom) { + img.popMatrix(); + img.pushMatrix(); + // correct the scale for this zoom level: + img.scale(1.0f/ PApplet.pow(2,coord.zoom)); + } + + if (images.containsKey(coord)) { + PImage tile = images.get(coord); + img.image(tile,coord.column*TILE_WIDTH,coord.row*TILE_HEIGHT,TILE_WIDTH,TILE_HEIGHT); + if (recentImages.contains(tile)) { + recentImages.remove(tile); + } + recentImages.add(tile); + } + } + img.popMatrix(); + } + + img.popMatrix(); + + // stop fetching things we can't see: + // (visibleKeys also has the parents and children, if needed, but that shouldn't matter) + queue.retainAll(visibleKeys); + + // sort what's left by distance from center: + queueSorter.setCenter(new Coordinate( (minRow + maxRow) / 2.0f, (minCol + maxCol) / 2.0f, zoom)); + Collections.sort(queue, queueSorter); + + // load up to 4 more things: + processQueue(); + + // clear some images away if we have too many... + if (recentImages.size() > MAX_IMAGES_TO_KEEP) { + recentImages.subList(0, recentImages.size()-MAX_IMAGES_TO_KEEP).clear(); + images.values().retainAll(recentImages); + } + + // restore image mode + img.imageMode(imageMode); + img.endDraw(); + return img; + } + + /** @return zoom level of currently visible tile layer */ + public int getZoom() { + return bestZoomForScale((float)sc); + } + + public Location getCenter() { + return provider.coordinateLocation(getCenterCoordinate()); + } + + public Coordinate getCenterCoordinate() { + float row = (float)(ty*sc/-TILE_WIDTH); + float column = (float)(tx*sc/-TILE_HEIGHT); + float zoom = zoomForScale((float)sc); + return new Coordinate(row, column, zoom); + } + + public void setCenter(Coordinate center) { + //println("setting center to " + center); + sc = p.pow(2.0f, center.zoom); + tx = -TILE_WIDTH*center.column/sc; + ty = -TILE_HEIGHT*center.row/sc; + } + + public void setCenter(Location location) { + setCenter(provider.locationCoordinate(location).zoomTo(getZoom())); + } + + public void setCenterZoom(Location location, int zoom) { + setCenter(provider.locationCoordinate(location).zoomTo(zoom)); + } + + /** sets scale according to given zoom level, should leave you with pixel perfect tiles */ + public void setZoom(int zoom) { + sc = p.pow(2.0f, zoom); + } + + public void zoom(int dir) { + sc = p.pow(2.0f, getZoom()+dir); + } + + public void zoomIn() { + sc = p.pow(2.0f, getZoom()+1); + } + + public void zoomOut() { + sc = p.pow(2.0f, getZoom()-1); + } + + // public function setExtent(extent:MapExtent):void + // public function getExtent():MapExtent /* protected function coordinatePosition(centerCoord:Coordinate):MapPosition @@ -309,94 +474,94 @@ public function locationsPosition(locations:Array):MapPosition protected function extentPosition(extent:MapExtent):MapPosition */ - // public function getCenterZoom():Array - - public AbstractMapProvider getMapProvider() { - return this.provider; - } - - public void setMapProvider(AbstractMapProvider provider) { - if (this.provider.getClass() != provider.getClass()) { - this.provider = provider; - images.clear(); - queue.clear(); - pending.clear(); - } - } - - public Point2f locationPoint(Location location) { - PMatrix2D m = new PMatrix2D(); - m.translate(width/2, height/2); - m.scale((float)sc); - m.translate((float)tx, (float)ty); - - Coordinate coord = provider.locationCoordinate(location).zoomTo(0); - float[] out = new float[2]; - m.mult(new float[] { - coord.column*TILE_WIDTH, coord.row*TILE_HEIGHT } - , out); - - return new Point2f(out[0], out[1]); - } - - public Location pointLocation(Point2f point) { - return pointLocation(point.x, point.y); - } - - public Location pointLocation(float x, float y) { - - // TODO: create this matrix once and keep it around for drawing and projecting - PMatrix2D m = new PMatrix2D(); - m.translate(width/2, height/2); - m.scale((float)sc); - m.translate((float)tx, (float)ty); - - // find top left and bottom right positions of map in screenspace: - float tl[] = new float[2]; - m.mult(new float[] { - 0,0 } - , tl); - float br[] = new float[2]; - m.mult(new float[] { - TILE_WIDTH, TILE_HEIGHT } - , br); - - float col = (x - tl[0]) / (br[0] - tl[0]); - float row = (y - tl[1]) / (br[1] - tl[1]); - Coordinate coord = new Coordinate(row, col, 0); - - return provider.coordinateLocation(coord); - } - - // TODO: pan by proportion of screen size, not by coordinate grid - public void panUp() { - setCenter(getCenterCoordinate().up()); - } - public void panDown() { - setCenter(getCenterCoordinate().down()); - } - public void panLeft() { - setCenter(getCenterCoordinate().left()); - } - public void panRight() { - setCenter(getCenterCoordinate().right()); - } - - public void panAndZoomIn(Location location) { - // TODO: animate - setCenterZoom(location, getZoom() + 1); - } - - public void panTo(Location location) { - // TODO: animate - setCenter(location); - } + // public function getCenterZoom():Array + + public AbstractMapProvider getMapProvider() { + return this.provider; + } + + public void setMapProvider(AbstractMapProvider provider) { + if (this.provider.getClass() != provider.getClass()) { + this.provider = provider; + images.clear(); + queue.clear(); + pending.clear(); + } + } + + public Point2f locationPoint(Location location) { + PMatrix2D m = new PMatrix2D(); + m.translate(width/2, height/2); + m.scale((float)sc); + m.translate((float)tx, (float)ty); + + Coordinate coord = provider.locationCoordinate(location).zoomTo(0); + float[] out = new float[2]; + m.mult(new float[] { + coord.column*TILE_WIDTH, coord.row*TILE_HEIGHT } + , out); + + return new Point2f(out[0], out[1]); + } + + public Location pointLocation(Point2f point) { + return pointLocation(point.x, point.y); + } + + public Location pointLocation(float x, float y) { + + // TODO: create this matrix once and keep it around for drawing and projecting + PMatrix2D m = new PMatrix2D(); + m.translate(width/2, height/2); + m.scale((float)sc); + m.translate((float)tx, (float)ty); + + // find top left and bottom right positions of map in screenspace: + float tl[] = new float[2]; + m.mult(new float[] { + 0,0 } + , tl); + float br[] = new float[2]; + m.mult(new float[] { + TILE_WIDTH, TILE_HEIGHT } + , br); + + float col = (x - tl[0]) / (br[0] - tl[0]); + float row = (y - tl[1]) / (br[1] - tl[1]); + Coordinate coord = new Coordinate(row, col, 0); + + return provider.coordinateLocation(coord); + } + + // TODO: pan by proportion of screen size, not by coordinate grid + public void panUp() { + setCenter(getCenterCoordinate().up()); + } + public void panDown() { + setCenter(getCenterCoordinate().down()); + } + public void panLeft() { + setCenter(getCenterCoordinate().left()); + } + public void panRight() { + setCenter(getCenterCoordinate().right()); + } + + public void panAndZoomIn(Location location) { + // TODO: animate + setCenterZoom(location, getZoom() + 1); + } + + public void panTo(Location location) { + // TODO: animate + setCenter(location); + } /* public function putMarker(location:Location, marker:DisplayObject=null):void public function getMarker(id:String):DisplayObject public function removeMarker(id:String):void - + public function setCopyright(copyright:String):void { */ @@ -404,141 +569,141 @@ public function setCopyright(copyright:String):void { public function onStartZoom():void public function onStopZoom():void public function onZoomed(delta:Number):void - + public function onStartPan():void public function onStopPan():void public function onPanned(delta:Point):void - + public function onResized():void - + public function onExtentChanged(extent:MapExtent):void */ - /////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////// - public float scaleForZoom(int zoom) { - return p.pow(2.0f, zoom); - } - - public float zoomForScale(float scale) { - return p.log(scale) / p.log(2); - } + public float scaleForZoom(int zoom) { + return p.pow(2.0f, zoom); + } - public int bestZoomForScale(float scale) { - return (int)p.min(20, p.max(1, (int)p.round(p.log(scale) / p.log(2)))); - } + public float zoomForScale(float scale) { + return p.log(scale) / p.log(2); + } - ////////////////////////////////////////////////////////////////////////// + public int bestZoomForScale(float scale) { + return (int)p.min(20, p.max(1, (int)p.round(p.log(scale) / p.log(2)))); + } - public void mouseDragged() { - double dx = (double)(p.mouseX - p.pmouseX) / sc; - double dy = (double)(p.mouseY - p.pmouseY) / sc; - // float angle = radians(-a); - // float rx = cos(angle)*dx - sin(angle)*dy; - // float ry = sin(angle)*dx + cos(angle)*dy; - // tx += rx; - // ty += ry; - tx += dx; - ty += dy; - } + ////////////////////////////////////////////////////////////////////////// + + public void mouseDragged() { + double dx = (double)(p.mouseX - p.pmouseX) / sc; + double dy = (double)(p.mouseY - p.pmouseY) / sc; + // float angle = radians(-a); + // float rx = cos(angle)*dx - sin(angle)*dy; + // float ry = sin(angle)*dx + cos(angle)*dy; + // tx += rx; + // ty += ry; + tx += dx; + ty += dy; + } - ///////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////// - public void grabTile(Coordinate coord) { - if (!pending.containsKey(coord) && !queue.contains(coord) && !images.containsKey(coord)) { - // println("adding " + coord.toString() + " to queue"); - queue.add(coord); + public void grabTile(Coordinate coord) { + if (!pending.containsKey(coord) && !queue.contains(coord) && !images.containsKey(coord)) { + // println("adding " + coord.toString() + " to queue"); + queue.add(coord); + } } - } - public class TileLoader implements Runnable { - Coordinate coord; - TileLoader(Coordinate coord) { - this.coord = coord; + public class TileLoader implements Runnable { + Coordinate coord; + TileLoader(Coordinate coord) { + this.coord = coord; + } + public void run() { + String[] urls = provider.getTileUrls(coord); + PImage img = p.loadImage(urls[0]); // use unknown to let loadImage decide + if (img != null) { + for (int i = 1; i < urls.length; i++) { + PImage img2 = p.loadImage(urls[i]); + if (img2 != null) { + img.blend(img2, 0, 0, img.width, img.height, 0, 0, img.width, img.height, BLEND); + } + } + } + tileDone(coord, img); + } } - public void run() { - String[] urls = provider.getTileUrls(coord); - PImage img = p.loadImage(urls[0], "unknown"); // use unknown to let loadImage decide - if (img != null) { - for (int i = 1; i < urls.length; i++) { - PImage img2 = p.loadImage(urls[i], "unknown"); - if (img2 != null) { - img.blend(img2, 0, 0, img.width, img.height, 0, 0, img.width, img.height, BLEND); - } + + // TODO: there could be issues when this is called from within a thread + // probably needs synchronizing on images / pending / queue + public void tileDone(Coordinate coord, PImage img) { + // check if we're still waiting for this (new provider clears pending) + // also check if we got something + if (pending.containsKey(coord) && img != null) { + // p.println("got " + coord + " image"); + images.put(coord, img); + pending.remove(coord); } - } - tileDone(coord, img); - } - } - - // TODO: there could be issues when this is called from within a thread - // probably needs synchronizing on images / pending / queue - public void tileDone(Coordinate coord, PImage img) { - // check if we're still waiting for this (new provider clears pending) - // also check if we got something - if (pending.containsKey(coord) && img != null) { - // p.println("got " + coord + " image"); - images.put(coord, img); - pending.remove(coord); - } - else { - // p.println("failed to get " + coord + " image"); - // if (img == null) { - // p.println("but got a null one"); - // } - // try again? - // but this is a bit risky, TODO: keep track of attempts - queue.add(coord); - pending.remove(coord); - } - } - - public void processQueue() { - while (pending.size() < MAX_PENDING && queue.size() > 0) { - Coordinate coord = (Coordinate)queue.remove(0); - TileLoader tileLoader = new TileLoader(coord); - pending.put(coord, tileLoader); - new Thread(tileLoader).start(); - } - } - - public class QueueSorter implements Comparator { - Coordinate center; - public void setCenter(Coordinate center) { - this.center = center; - } - public int compare(Object o1, Object o2) { - Coordinate c1 = (Coordinate)o1; - Coordinate c2 = (Coordinate)o2; - if (c1.zoom == center.zoom) { - if (c2.zoom == center.zoom) { - float d1 = p.dist(center.column, center.row, c1.column, c1.row); - float d2 = p.dist(center.column, center.row, c2.column, c2.row); - return d1 < d2 ? -1 : d1 > d2 ? 1 : 0; - } else { - return -1; + // p.println("failed to get " + coord + " image"); + // if (img == null) { + // p.println("but got a null one"); + // } + // try again? + // but this is a bit risky, TODO: keep track of attempts + queue.add(coord); + pending.remove(coord); + } + } + + public void processQueue() { + while (pending.size() < MAX_PENDING && queue.size() > 0) { + Coordinate coord = queue.remove(0); + TileLoader tileLoader = new TileLoader(coord); + pending.put(coord, tileLoader); + new Thread(tileLoader).start(); + } + } + + public class QueueSorter implements Comparator { + Coordinate center; + public void setCenter(Coordinate center) { + this.center = center; } - } - else if (c2.zoom == center.zoom) { - return 1; - } - else { - float d1 = p.abs(c1.zoom - center.zoom); - float d2 = p.abs(c2.zoom - center.zoom); - return d1 < d2 ? -1 : d1 > d2 ? 1 : 0; - } - } - } - - public class ZoomComparator implements Comparator { - public int compare(Object o1, Object o2) { - Coordinate c1 = (Coordinate)o1; - Coordinate c2 = (Coordinate)o2; - return c1.zoom < c2.zoom ? -1 : c1.zoom > c2.zoom ? 1 : 0; - } - } + public int compare(Object o1, Object o2) { + Coordinate c1 = (Coordinate)o1; + Coordinate c2 = (Coordinate)o2; + if (c1.zoom == center.zoom) { + if (c2.zoom == center.zoom) { + float d1 = p.dist(center.column, center.row, c1.column, c1.row); + float d2 = p.dist(center.column, center.row, c2.column, c2.row); + return d1 < d2 ? -1 : d1 > d2 ? 1 : 0; + } + else { + return -1; + } + } + else if (c2.zoom == center.zoom) { + return 1; + } + else { + float d1 = p.abs(c1.zoom - center.zoom); + float d2 = p.abs(c2.zoom - center.zoom); + return d1 < d2 ? -1 : d1 > d2 ? 1 : 0; + } + } + } + + public class ZoomComparator implements Comparator { + public int compare(Object o1, Object o2) { + Coordinate c1 = (Coordinate)o1; + Coordinate c2 = (Coordinate)o2; + return c1.zoom < c2.zoom ? -1 : c1.zoom > c2.zoom ? 1 : 0; + } + } } diff --git a/src/com/modestmaps/StaticMap.java b/src/com/modestmaps/StaticMap.java old mode 100644 new mode 100755 index f66bb47..9447b56 --- a/src/com/modestmaps/StaticMap.java +++ b/src/com/modestmaps/StaticMap.java @@ -222,7 +222,7 @@ public PImage render_tiles(TileQueue tiles, int img_width, int img_height, boole // # hang around until they are loaded or we run out of time... // time.sleep(1) - PGraphics mapImg = parent.createGraphics(img_width, img_height, PApplet.JAVA2D); + PGraphics mapImg = parent.createGraphics(img_width, img_height); mapImg.beginDraw(); for (int i = 0; i < tiles.size(); i++) { @@ -400,7 +400,6 @@ public void load(boolean verbose, int attempt) { } - public class TileQueue extends Vector { // List of TileRequest objects, that's sensitive to when they're loaded. public boolean pending() { @@ -412,6 +411,4 @@ public boolean pending() { return false; } } - - } diff --git a/src/com/modestmaps/core/Coordinate.java b/src/com/modestmaps/core/Coordinate.java old mode 100644 new mode 100755 diff --git a/src/com/modestmaps/core/MapCenter.java b/src/com/modestmaps/core/MapCenter.java old mode 100644 new mode 100755 diff --git a/src/com/modestmaps/core/Point2f.java b/src/com/modestmaps/core/Point2f.java old mode 100644 new mode 100755 diff --git a/src/com/modestmaps/geo/AbstractProjection.java b/src/com/modestmaps/geo/AbstractProjection.java old mode 100644 new mode 100755 diff --git a/src/com/modestmaps/geo/LinearProjection.java b/src/com/modestmaps/geo/LinearProjection.java old mode 100644 new mode 100755 diff --git a/src/com/modestmaps/geo/Location.java b/src/com/modestmaps/geo/Location.java old mode 100644 new mode 100755 diff --git a/src/com/modestmaps/geo/MercatorProjection.java b/src/com/modestmaps/geo/MercatorProjection.java old mode 100644 new mode 100755 diff --git a/src/com/modestmaps/geo/Transformation.java b/src/com/modestmaps/geo/Transformation.java old mode 100644 new mode 100755 diff --git a/src/com/modestmaps/package.html b/src/com/modestmaps/package.html old mode 100644 new mode 100755 diff --git a/src/com/modestmaps/providers/AbstractMapProvider.java b/src/com/modestmaps/providers/AbstractMapProvider.java old mode 100644 new mode 100755 diff --git a/src/com/modestmaps/providers/Microsoft.java b/src/com/modestmaps/providers/Microsoft.java old mode 100644 new mode 100755 diff --git a/src/com/modestmaps/providers/Yahoo.java b/src/com/modestmaps/providers/Yahoo.java old mode 100644 new mode 100755 From 226ff2a93b52345d6e112de0ef84f6f945d2669c Mon Sep 17 00:00:00 2001 From: MGlolenstine Date: Sat, 9 Jun 2018 08:29:43 +0200 Subject: [PATCH 2/2] Minor fixes --- Makefile | 6 ++-- .../modest_maps_static/modest_maps_static.pde | 33 ++++++++++-------- modestmaps2/library/modestmaps.jar | Bin 30072 -> 0 bytes 3 files changed, 22 insertions(+), 17 deletions(-) mode change 100755 => 100644 examples/modest_maps_static/modest_maps_static.pde delete mode 100755 modestmaps2/library/modestmaps.jar diff --git a/Makefile b/Makefile index 202d2dc..47afb61 100755 --- a/Makefile +++ b/Makefile @@ -1,8 +1,10 @@ # change these if you're not on a Mac, or don't run "make install" :) #PROCESSING_PATH = "/Applications/Processing.app/Contents/Resources/Java/core.jar" -PROCESSING_PATH = "/home/notyours/processing-3.3.7/core/library/core.jar" #LIBRARY_PATH = "/Users/$(USER)/Documents/Processing/libraries/" -LIBRARY_PATH = "/home/notyours/sketchbook/libraries/" + +# change these if you're on Linux and set them to actual paths +PROCESSING_PATH = "/opt/processing-3.3.7/core/library/core.jar" +LIBRARY_PATH = "/opt/sketchbook/libraries/" #modestmaps/library/modestmaps.jar: java6: diff --git a/examples/modest_maps_static/modest_maps_static.pde b/examples/modest_maps_static/modest_maps_static.pde old mode 100755 new mode 100644 index 2ef32eb..f5a604e --- a/examples/modest_maps_static/modest_maps_static.pde +++ b/examples/modest_maps_static/modest_maps_static.pde @@ -15,18 +15,21 @@ import com.modestmaps.providers.*; void setup() { size(1280, 720); - noLoop(); -} - -void draw() { - - StaticMap m = new StaticMap(this, new Microsoft.RoadProvider(), new Point2f(width, height), new Location(46.086292, 14.478332), 16); - - PImage img = m.draw(true); - image(img,0,0); - - ellipse(width/2, height/2, 5, 5); - - println("done"); - -} + if (!runTests(false)) { + println("one or more tests failed"); + exit(); + } + noLoop(); + } + + void draw() { + StaticMap m = new StaticMap(this, new Microsoft.AerialProvider(), new Point2f(width/2, height), new Location(51.5, -0.137), 12); + + PImage img = m.draw(true); + image(img,0,0); + + img = atkinsonDither(img); + image(img,width/2,0); + + println("done"); + } diff --git a/modestmaps2/library/modestmaps.jar b/modestmaps2/library/modestmaps.jar deleted file mode 100755 index e355d8215bdac6af61413339856475caf89e1055..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30072 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�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 Uy`X`C5rcjb;lRMU&F}vDKj?>i-~a#s