Ignore:
Timestamp:
2009-06-26T22:04:43+02:00 (15 years ago)
Author:
lvarga
Message:

Deleted second mail from repository to same author, Dave Hansen <dave@…>.
Merged another three patches. Look previous logs.

Now you can start to see how the TileSet gets used. In this
case, we're replacing the loadAllTiles() iteration with a
TileSet instead. Saves something like 50% of the lines of
code in that function.

In addition to using a TileSet, this also uses the Tile
class's pixelPos() function.

imgToTile is here to make the imageUpdate()
function simpler.
This also adds a nice little message about how many
tiles we've been downloading.

Just another two to be complete.

Location:
applications/editors/josm/plugins/slippymap/src/org/openstreetmap/josm/plugins/slippymap
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/slippymap/src/org/openstreetmap/josm/plugins/slippymap/SlippyMapKey.java

    r16153 r16161  
    1212 * @author LuVar <lubomir.varga@freemap.sk>
    1313 * @author Dave Hansen <dave@sr71.net>
    14  * @author Dave Hansen <dave@linux.vnet.ibm.com>
    1514 *
    1615 */
  • applications/editors/josm/plugins/slippymap/src/org/openstreetmap/josm/plugins/slippymap/SlippyMapLayer.java

    r16158 r16161  
    55import java.awt.Color;
    66import java.awt.Component;
     7import java.awt.Dimension;
    78import java.awt.Graphics;
    89import java.awt.Image;
    910import java.awt.Point;
     11import java.awt.Rectangle;
    1012import java.awt.event.ActionEvent;
    1113import java.awt.event.MouseAdapter;
     
    1416import java.util.ArrayList;
    1517import java.util.Comparator;
     18import java.util.Enumeration;
    1619import java.util.Hashtable;
    1720import java.util.List;
     
    4245 * @author LuVar <lubomir.varga@freemap.sk>
    4346 * @author Dave Hansen <dave@sr71.net>
    44  * @author Dave Hansen <dave@linux.vnet.ibm.com>
    4547 *
    4648 */
     
    296298    void loadAllTiles() {
    297299        MapView mv = Main.map.mapView;
    298         int zoom = currentZoomLevel;
    299300        LatLon topLeft = mv.getLatLon(0, 0);
    300301        LatLon botRight = mv.getLatLon(mv.getWidth(), mv.getHeight());
    301         z12x0 = lonToTileX(topLeft.lon(), zoom);
    302         z12x1 = lonToTileX(botRight.lon(), zoom);
    303         z12y0 = latToTileY(topLeft.lat(), zoom);
    304         z12y1 = latToTileY(botRight.lat(), zoom);
    305         if (z12x0 > z12x1) {
    306             int tmp = z12x0;
    307             z12x0 = z12x1;
    308             z12x1 = tmp;
    309         }
    310         if (z12y0 > z12y1) {
    311             int tmp = z12y0;
    312             z12y0 = z12y1;
    313             z12y1 = tmp;
    314         }
     302
     303        TileSet ts = new TileSet(topLeft, botRight, currentZoomLevel);
     304       
    315305        // if there is more than 18 tiles on screen in any direction, do not
    316306        // load all tiles!
    317         if (z12x1 - z12x0 > 18) {
    318             System.out
    319                     .println("Not downloading all tiles because there is more than 18 tiles on X axis!");
    320             return;
    321         }
    322         if (z12y1 - z12y0 > 18) {
    323             System.out
    324                     .println("Not downloading all tiles because there is more than 18 tiles on Y axis!");
    325             return;
    326         }
    327 
    328         for (int x = z12x0 - 1; x <= z12x1; x++) {
    329             for (int y = z12y0 - 1; y <= z12y1; y++) {
    330                 SlippyMapKey key = new SlippyMapKey(x, y, currentZoomLevel);
    331                 SlippyMapTile tile = tileStorage.get(key);
    332                 if (!key.valid) {
    333                         System.out.println("paint-1() made invalid key");
    334                         continue;
    335                 }
    336                 if (tile == null)
    337                     tileStorage.put(key,
    338                             tile = new SlippyMapTile(x, y, currentZoomLevel));
    339                 if (tile.getImage() == null) {
    340                     this.loadSingleTile(tile);
    341                 }
    342             }
    343         }
     307        if (ts.tilesSpanned() > (18*18)) {
     308                System.out.println("Not downloading all tiles because there is more than 18 tiles on an axis!");
     309                return;
     310        }
     311
     312        for (Tile t : ts.allTiles()) {
     313                SlippyMapTile tile = getOrCreateTile(t.x, t.y, currentZoomLevel);
     314                if (tile.getImage() == null) {
     315                        this.loadSingleTile(tile);
     316                }
     317        }//end of for Tile t
    344318    }
    345319
     
    655629        g.setColor(Color.black);
    656630        g.drawString("currentZoomLevel=" + currentZoomLevel, 120, 120);
    657     }// end of paint metod
    658 
     631    }// end of paint method
     632
     633    /**
     634     * This isn't very efficient, but it is only used when the
     635     * user right-clicks on the map.
     636     */
    659637    SlippyMapTile getTileForPixelpos(int px, int py) {
    660         int tilex = z12x1;
    661         int tiley = z12y1;
    662         for (int x = z12x0; x <= z12x1; x++) {
    663 
    664             if (pixelpos[x - z12x0 + 1][0].x > px) {
    665                 tilex = x - 1;
    666                 break;
    667             }
    668         }
    669         if (tilex == -1)
    670             return null;
    671         for (int y = z12y0; y <= z12y1; y++) {
    672 
    673             if (pixelpos[0][y - z12y0 + 1].y > py) {
    674                 tiley = y - 1;
    675                 break;
    676             }
    677         }
    678         if (tiley == -1) {
    679             return null;
    680         }
    681 
    682         SlippyMapKey key = new SlippyMapKey(tilex, tiley, currentZoomLevel);
    683         if (!key.valid) {
    684             System.err.println("getTileForPixelpos("+px+","+py+") made invalid key");
    685             return null;
    686         }
    687         SlippyMapTile tile = tileStorage.get(key);
    688         if (tile == null)
    689             tileStorage.put(key, tile = new SlippyMapTile(tilex, tiley, currentZoomLevel));
     638        MapView mv = Main.map.mapView;
     639        Point clicked = new Point(px, py);
     640        LatLon topLeft = mv.getLatLon(0, 0);
     641        LatLon botRight = mv.getLatLon(mv.getWidth(), mv.getHeight());
     642        TileSet ts = new TileSet(topLeft, botRight, currentZoomLevel);
     643        int z = currentZoomLevel;
     644       
     645        Tile clickedTile = null;
     646        for (Tile t1 : ts.allTiles()) {
     647            Tile t2 = new Tile(t1.x+1, t1.y+1);
     648            Point p1 = t1.pixelPos(z);
     649            Point p2 = t2.pixelPos(z);
     650            Rectangle r = new Rectangle(p1,new Dimension(p2.x, p2.y));
     651            if (!r.contains(clicked))
     652                continue;
     653            clickedTile  = t1;
     654            break;
     655        }
     656        if (clickedTile == null)
     657             return null;
     658        System.out.println("clicked on tile: " + clickedTile.x + " " + clickedTile.y);
     659        SlippyMapTile tile = getOrCreateTile(clickedTile.x, clickedTile.y, currentZoomLevel);
    690660        checkTileStorage();
    691661        return tile;
     
    752722    }
    753723
    754     public boolean imageUpdate(Image img, int infoflags, int x, int y,
    755             int width, int height) {
    756         boolean done = ((infoflags & (ERROR | FRAMEBITS | ALLBITS)) != 0);
    757         if ((infoflags & ERROR) != 0) {
    758                 String url = "unknown";
    759                 for (SlippyMapTile tile : tileStorage.values()) {
    760                         if (tile.getImage() != img)
    761                                 continue;
    762                         url = tile.getImageURL().toString();
    763                 }
    764                 System.err.println("imageUpdate(" + img + ") error " + url +")");
    765         }
    766         if ((infoflags & SOMEBITS) != 0) {
    767                 //if (y%100 == 0)
    768                 //    System.out.println("imageUpdate("+img+") SOMEBITS ("+x+","+y+")");
    769         }
    770         // Repaint immediately if we are done, otherwise batch up
    771         // repaint requests every 100 milliseconds
    772         needRedraw = true;
    773         Main.map.repaint(done ? 0 : 100);
    774         return !done;
    775     }
     724    private SlippyMapTile imgToTile(Image img) {
     725                // we use the enumeration to avoid ConcurrentUpdateExceptions
     726                // with other users of the tileStorage
     727                Enumeration<SlippyMapTile> e = tileStorage.elements();
     728                while (e.hasMoreElements()) {
     729                        SlippyMapTile t = e.nextElement();
     730                        if (t.getImageNoTimestamp() != img) {
     731                                continue;
     732                        }
     733                        return t;
     734                }
     735                return null;
     736        }
     737   
     738    private static int nr_loaded = 0;
     739    private static int at_zoom = -1;
     740   
     741    public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) {
     742                boolean done = ((infoflags & (ERROR | FRAMEBITS | ALLBITS)) != 0);
     743                SlippyMapTile imageTile = imgToTile(img);
     744                if (imageTile == null) {
     745                        return false;
     746                }
     747
     748                if ((infoflags & ERROR) != 0) {
     749                        String url; // = "unknown";
     750                        url = imageTile.getImageURL().toString();
     751                        System.err.println("imageUpdate(" + img + ") error " + url + ")");
     752                }
     753                if (((infoflags & ALLBITS) != 0)) {
     754                        int z = imageTile.getZoom();
     755                        if (z == at_zoom) {
     756                                nr_loaded++;
     757                        } else {
     758                                System.out.println("downloaded " + nr_loaded + " at: " + at_zoom + " now going to " + z);
     759                                nr_loaded = 0;
     760                                at_zoom = z;
     761                        }
     762                        imageTile.markAsDownloaded();
     763                }
     764                if ((infoflags & SOMEBITS) != 0) {
     765                        // if (y%100 == 0)
     766                        //System.out.println("imageUpdate("+img+") SOMEBITS ("+x+","+y+")");
     767                }
     768                // Repaint immediately if we are done, otherwise batch up
     769                // repaint requests every 100 milliseconds
     770                needRedraw = true;
     771                Main.map.repaint(done ? 0 : 100);
     772                return !done;
     773        }
    776774
    777775    /*
  • applications/editors/josm/plugins/slippymap/src/org/openstreetmap/josm/plugins/slippymap/SlippyMapTile.java

    r16153 r16161  
    1717 * @author LuVar <lubomir.varga@freemap.sk>
    1818 * @author Dave Hansen <dave@sr71.net>
    19  * @author Dave Hansen <dave@linux.vnet.ibm.com>
    2019 *
    2120 */
Note: See TracChangeset for help on using the changeset viewer.