Ignore:
Timestamp:
2008-10-09T20:16:57+02:00 (16 years ago)
Author:
stotz
Message:

Increased maximum zoom and other minor modifications (thanks for the patch "r_x")

Location:
applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/Demo.java

    r9846 r11103  
    109109                map.addMapMarker(new MapMarkerDot(49.71, 8.64));
    110110                map.addMapMarker(new MapMarkerDot(48.71, -1));
    111                 map.addMapMarker(new MapMarkerDot(49.807, 8.644));
     111                map.addMapMarker(new MapMarkerDot(49.8588, 8.643));
    112112
    113113                // map.setDisplayPositionByLatLon(49.807, 8.6, 11);
  • applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/JMapViewer.java

    r9846 r11103  
    4545         * Vectors for clock-wise tile painting
    4646         */
    47         protected static final Point[] move =
    48                         { new Point(1, 0), new Point(0, 1), new Point(-1, 0), new Point(0, -1) };
    49 
    50         public static final int MAX_ZOOM = 18;
     47        protected static final Point[] move = { new Point(1, 0), new Point(0, 1),
     48                        new Point(-1, 0), new Point(0, -1) };
     49
     50        public static final int MAX_ZOOM = 22;
    5151        public static final int MIN_ZOOM = 0;
    5252
     
    107107                setPreferredSize(new Dimension(400, 400));
    108108                try {
    109                         loadingImage =
    110                                         ImageIO.read(JMapViewer.class.getResourceAsStream("images/hourglass.png"));
     109                        loadingImage = ImageIO.read(JMapViewer.class
     110                                        .getResourceAsStream("images/hourglass.png"));
    111111                } catch (Exception e1) {
    112112                        loadingImage = null;
     
    128128                int size = 18;
    129129                try {
    130                         ImageIcon icon = new ImageIcon(getClass().getResource("images/plus.png"));
     130                        ImageIcon icon = new ImageIcon(getClass().getResource(
     131                                        "images/plus.png"));
    131132                        zoomInButton = new JButton(icon);
    132133                } catch (Exception e) {
     
    144145                add(zoomInButton);
    145146                try {
    146                         ImageIcon icon = new ImageIcon(getClass().getResource("images/minus.png"));
     147                        ImageIcon icon = new ImageIcon(getClass().getResource(
     148                                        "images/minus.png"));
    147149                        zoomOutButton = new JButton(icon);
    148150                } catch (Exception e) {
     
    173175         */
    174176        public void setDisplayPositionByLatLon(double lat, double lon, int zoom) {
    175                 setDisplayPositionByLatLon(new Point(getWidth() / 2, getHeight() / 2), lat, lon, zoom);
     177                setDisplayPositionByLatLon(new Point(getWidth() / 2, getHeight() / 2),
     178                                lat, lon, zoom);
    176179        }
    177180
     
    192195         *            {@link TileSource#getMaxZoom()}
    193196         */
    194         public void setDisplayPositionByLatLon(Point mapPoint, double lat, double lon, int zoom) {
     197        public void setDisplayPositionByLatLon(Point mapPoint, double lat,
     198                        double lon, int zoom) {
    195199                int x = OsmMercator.LonToX(lon, zoom);
    196200                int y = OsmMercator.LatToY(lat, zoom);
     
    199203
    200204        public void setDisplayPosition(int x, int y, int zoom) {
    201                 setDisplayPosition(new Point(getWidth() / 2, getHeight() / 2), x, y, zoom);
     205                setDisplayPosition(new Point(getWidth() / 2, getHeight() / 2), x, y,
     206                                zoom);
    202207        }
    203208
     
    236241                int x_max = Integer.MIN_VALUE;
    237242                int y_max = Integer.MIN_VALUE;
     243                int mapZoomMax = tileSource.getMaxZoom();
    238244                for (MapMarker marker : mapMarkerList) {
    239                         int x = OsmMercator.LonToX(marker.getLon(), MAX_ZOOM);
    240                         int y = OsmMercator.LatToY(marker.getLat(), MAX_ZOOM);
     245                        int x = OsmMercator.LonToX(marker.getLon(), mapZoomMax);
     246                        int y = OsmMercator.LatToY(marker.getLat(), mapZoomMax);
    241247                        x_max = Math.max(x_max, x);
    242248                        y_max = Math.max(y_max, y);
     
    249255                // System.out.println(y_min + " < y < " + y_max);
    250256                // System.out.println("tiles: " + width + " " + height);
    251                 int newZoom = MAX_ZOOM;
     257                int newZoom = mapZoomMax;
    252258                int x = x_max - x_min;
    253259                int y = y_max - y_min;
     
    260266                x = x_min + (x_max - x_min) / 2;
    261267                y = y_min + (y_max - y_min) / 2;
    262                 int z = 1 << (MAX_ZOOM - newZoom);
     268                int z = 1 << (mapZoomMax - newZoom);
    263269                x /= z;
    264270                y /= z;
     
    346352                                        x++;
    347353                                for (int j = 0; j < x; j++) {
    348                                         if (x_min <= posx && posx <= x_max && y_min <= posy && posy <= y_max) {
     354                                        if (x_min <= posx && posx <= x_max && y_min <= posy
     355                                                        && posy <= y_max) {
    349356                                                // tile is visible
    350357                                                Tile tile = getTile(tilex, tiley, zoom);
     
    463470                }
    464471                if (!tile.isLoaded()) {
    465                         jobDispatcher.addJob(tileLoader.createTileLoaderJob(tileSource, tilex, tiley, zoom));
     472                        jobDispatcher.addJob(tileLoader.createTileLoaderJob(tileSource,
     473                                        tilex, tiley, zoom));
    466474                }
    467475                return tile;
     
    544552
    545553        public void setTileSource(TileSource tileSource) {
     554                if (tileSource.getMaxZoom() > MAX_ZOOM)
     555                        throw new RuntimeException("Zoom level too high");
    546556                this.tileSource = tileSource;
    547557                zoomSlider.setMaximum(tileSource.getMaxZoom());
     
    552562        }
    553563
     564        public void tileLoadingFinished(Tile tile) {
     565                repaint();
     566        }
     567
    554568}
  • applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/OsmFileCacheTileLoader.java

    r9937 r11103  
    3030public class OsmFileCacheTileLoader extends OsmTileLoader {
    3131
    32         private static final String TILE_FILE_EXT = ".png";
    3332        private static final String ETAG_FILE_EXT = ".etag";
    3433
     
    5958        }
    6059
    61         public Runnable createTileLoaderJob(final TileSource source, final int tilex, final int tiley,
    62                         final int zoom) {
     60        public Runnable createTileLoaderJob(final TileSource source,
     61                        final int tilex, final int tiley, final int zoom) {
    6362                return new FileLoadJob(source, tilex, tiley, zoom);
    6463        }
     
    121120                                        case LastModified:
    122121                                                if (!isOsmTileNewer(fileAge)) {
    123                                                         System.out
    124                                                                         .println("LastModified: Local version is up to date: " + tile);
     122                                                        // System.out.println(
     123                                                        // "LastModified: Local version is up to date: " +
     124                                                        // tile);
    125125                                                        tile.setLoaded(true);
    126                                                         tileFile.setLastModified(System.currentTimeMillis() - maxCacheFileAge
    127                                                                         + recheckAfter);
     126                                                        tileFile.setLastModified(System.currentTimeMillis()
     127                                                                        - maxCacheFileAge + recheckAfter);
    128128                                                        return;
    129129                                                }
     
    138138                                                        switch (source.getTileUpdate()) {
    139139                                                        case IfNoneMatch:
    140                                                                 urlConn.addRequestProperty("If-None-Match", fileETag);
     140                                                                urlConn.addRequestProperty("If-None-Match",
     141                                                                                fileETag);
    141142                                                                break;
    142143                                                        case ETag:
    143144                                                                if (hasOsmTileETag(fileETag)) {
    144145                                                                        tile.setLoaded(true);
    145                                                                         tileFile.setLastModified(System.currentTimeMillis()
     146                                                                        tileFile.setLastModified(System
     147                                                                                        .currentTimeMillis()
    146148                                                                                        - maxCacheFileAge + recheckAfter);
    147149                                                                        return;
     
    159161                                        System.out.println("Local version is up to date: " + tile);
    160162                                        tile.setLoaded(true);
    161                                         tileFile.setLastModified(System.currentTimeMillis() - maxCacheFileAge
    162                                                         + recheckAfter);
     163                                        tileFile.setLastModified(System.currentTimeMillis()
     164                                                        - maxCacheFileAge + recheckAfter);
    163165                                        return;
    164166                                }
     
    168170                                        tile.loadImage(new ByteArrayInputStream(buffer));
    169171                                        tile.setLoaded(true);
    170                                         listener.repaint();
     172                                        listener.tileLoadingFinished(tile);
    171173                                        saveTileToFile(buffer);
    172174                                } else {
     
    175177                        } catch (Exception e) {
    176178                                if (input == null /* || !input.isStopped() */)
    177                                         System.err.println("failed loading " + zoom + "/" + tilex + "/" + tiley + " "
    178                                                         + e.getMessage());
     179                                        System.err.println("failed loading " + zoom + "/" + tilex
     180                                                        + "/" + tiley + " " + e.getMessage());
    179181                        } finally {
    180182                                tile.loading = false;
     
    196198                                if (!oldTile) {
    197199                                        tile.setLoaded(true);
    198                                         listener.repaint();
     200                                        listener.tileLoadingFinished(tile);
    199201                                        fileTilePainted = true;
    200202                                        return true;
    201203                                }
    202                                 listener.repaint();
     204                                listener.tileLoadingFinished(tile);
    203205                                fileTilePainted = true;
    204206                        } catch (Exception e) {
     
    216218                }
    217219
    218                 protected byte[] loadTileInBuffer(URLConnection urlConn) throws IOException {
     220                protected byte[] loadTileInBuffer(URLConnection urlConn)
     221                                throws IOException {
    219222                        input = urlConn.getInputStream();
    220                         ByteArrayOutputStream bout = new ByteArrayOutputStream(input.available());
     223                        ByteArrayOutputStream bout = new ByteArrayOutputStream(input
     224                                        .available());
    221225                        byte[] buffer = new byte[2048];
    222226                        boolean finished = false;
     
    252256                        URL url;
    253257                        url = new URL(tile.getUrl());
    254                         HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
     258                        HttpURLConnection urlConn = (HttpURLConnection) url
     259                                        .openConnection();
    255260                        urlConn.setRequestMethod("HEAD");
    256261                        urlConn.setReadTimeout(30000); // 30 seconds read timeout
     
    267272                        URL url;
    268273                        url = new URL(tile.getUrl());
    269                         HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
     274                        HttpURLConnection urlConn = (HttpURLConnection) url
     275                                        .openConnection();
    270276                        urlConn.setRequestMethod("HEAD");
    271277                        urlConn.setReadTimeout(30000); // 30 seconds read timeout
     
    280286
    281287                protected File getTileFile() throws IOException {
    282                         return new File(tileCacheDir + "/" + tile.getZoom() + "_" + tile.getXtile() + "_"
    283                                         + tile.getYtile() + TILE_FILE_EXT);
     288                        return new File(tileCacheDir + "/" + tile.getZoom() + "_"
     289                                        + tile.getXtile() + "_" + tile.getYtile() + "."
     290                                        + source.getTileType());
    284291                }
    285292
    286293                protected void saveTileToFile(byte[] rawData) {
    287294                        try {
    288                                 FileOutputStream f =
    289                                                 new FileOutputStream(tileCacheDir + "/" + tile.getZoom() + "_"
    290                                                                 + tile.getXtile() + "_" + tile.getYtile() + TILE_FILE_EXT);
     295                                FileOutputStream f = new FileOutputStream(tileCacheDir + "/"
     296                                                + tile.getZoom() + "_" + tile.getXtile() + "_"
     297                                                + tile.getYtile() + "." + source.getTileType());
    291298                                f.write(rawData);
    292299                                f.close();
    293300                                // System.out.println("Saved tile to file: " + tile);
    294301                        } catch (Exception e) {
    295                                 System.err.println("Failed to save tile content: " + e.getLocalizedMessage());
     302                                System.err.println("Failed to save tile content: "
     303                                                + e.getLocalizedMessage());
    296304                        }
    297305                }
     
    299307                protected void saveETagToFile(String eTag) {
    300308                        try {
    301                                 FileOutputStream f =
    302                                                 new FileOutputStream(tileCacheDir + "/" + tile.getZoom() + "_"
    303                                                                 + tile.getXtile() + "_" + tile.getYtile() + ETAG_FILE_EXT);
     309                                FileOutputStream f = new FileOutputStream(tileCacheDir + "/"
     310                                                + tile.getZoom() + "_" + tile.getXtile() + "_"
     311                                                + tile.getYtile() + ETAG_FILE_EXT);
    304312                                f.write(eTag.getBytes(ETAG_CHARSET.name()));
    305313                                f.close();
    306314                        } catch (Exception e) {
    307                                 System.err.println("Failed to save ETag: " + e.getLocalizedMessage());
     315                                System.err.println("Failed to save ETag: "
     316                                                + e.getLocalizedMessage());
    308317                        }
    309318                }
     
    311320                protected String loadETagfromFile() {
    312321                        try {
    313                                 FileInputStream f =
    314                                                 new FileInputStream(tileCacheDir + "/" + tile.getZoom() + "_"
    315                                                                 + tile.getXtile() + "_" + tile.getYtile() + ETAG_FILE_EXT);
     322                                FileInputStream f = new FileInputStream(tileCacheDir + "/"
     323                                                + tile.getZoom() + "_" + tile.getXtile() + "_"
     324                                                + tile.getYtile() + ETAG_FILE_EXT);
    316325                                byte[] buf = new byte[f.available()];
    317326                                f.read(buf);
  • applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/OsmTileLoader.java

    r9846 r11103  
    4646                                        tile.loadImage(input);
    4747                                        tile.setLoaded(true);
    48                                         listener.repaint();
     48                                        listener.tileLoadingFinished(tile);
    4949                                        input.close();
    5050                                        input = null;
  • applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/OsmTileSource.java

    r9846 r11103  
    2323                        return getName();
    2424                }
     25
     26                public String getTileType() {
     27                        return "png";
     28                }
     29               
    2530        }
    2631
    2732        public static class Mapnik extends AbstractOsmTileSource {
    2833
     34                public static String NAME = "Mapnik";
     35               
    2936                public String getName() {
    30                         return "Mapnik";
     37                        return NAME;
    3138                }
    3239
     
    4350
    4451        public static class CycleMap extends AbstractOsmTileSource {
     52               
     53                public static String NAME = "OSM Cycle Map";
    4554
    4655                public String getName() {
    47                         return "OSM Cycle Map";
     56                        return NAME;
    4857                }
    4958
     
    6170        public static class TilesAtHome extends AbstractOsmTileSource {
    6271
     72                public static String NAME = "TilesAtHome";
     73
    6374                public int getMaxZoom() {
    6475                        return 17;
     
    6677
    6778                public String getName() {
    68                         return "TilesAtHome";
     79                        return NAME;
    6980                }
    7081
  • applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/interfaces/TileLoaderListener.java

    r9846 r11103  
    11package org.openstreetmap.gui.jmapviewer.interfaces;
     2
     3import org.openstreetmap.gui.jmapviewer.Tile;
    24
    35//License: GPL. Copyright 2008 by Jan Peter Stotz
    46
    57public interface TileLoaderListener {
    6        
    7         public void repaint();
     8
     9        /**
     10         * Will be called if a new {@link Tile} has been loaded successfully.
     11         * Loaded can mean downloaded or loaded from file cache.
     12         *
     13         * @param tile
     14         */
     15        public void tileLoadingFinished(Tile tile);
    816
    917        public TileCache getTileCache();
  • applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/interfaces/TileSource.java

    r9846 r11103  
    6161
    6262        /**
     63         * Constructs the tile url.
     64         *
    6365         * @param zoom
    6466         * @param tilex
     
    6769         */
    6870        public String getTileUrl(int zoom, int tilex, int tiley);
     71
     72        /**
     73         * Specifies the tile image type. For tiles rendered by Mapnik or
     74         * Osmarenderer this is usually <code>"png"</code>.
     75         *
     76         * @return file extension of the tile image type
     77         */
     78        public String getTileType();
    6979}
Note: See TracChangeset for help on using the changeset viewer.