001    package org.openstreetmap.gui.jmapviewer.interfaces;
002    
003    import java.awt.Image;
004    import java.io.IOException;
005    
006    import org.openstreetmap.gui.jmapviewer.Coordinate;
007    import org.openstreetmap.gui.jmapviewer.JMapViewer;
008    
009    //License: GPL. Copyright 2008 by Jan Peter Stotz
010    
011    /**
012     *
013     * @author Jan Peter Stotz
014     */
015    public interface TileSource extends Attributed {
016    
017        /**
018         * Specifies the different mechanisms for detecting updated tiles
019         * respectively only download newer tiles than those stored locally.
020         *
021         * <ul>
022         * <li>{@link #IfNoneMatch} Server provides ETag header entry for all tiles
023         * and <b>supports</b> conditional download via <code>If-None-Match</code>
024         * header entry.</li>
025         * <li>{@link #ETag} Server provides ETag header entry for all tiles but
026         * <b>does not support</b> conditional download via
027         * <code>If-None-Match</code> header entry.</li>
028         * <li>{@link #IfModifiedSince} Server provides Last-Modified header entry
029         * for all tiles and <b>supports</b> conditional download via
030         * <code>If-Modified-Since</code> header entry.</li>
031         * <li>{@link #LastModified} Server provides Last-Modified header entry for
032         * all tiles but <b>does not support</b> conditional download via
033         * <code>If-Modified-Since</code> header entry.</li>
034         * <li>{@link #None} The server does not support any of the listed
035         * mechanisms.</li>
036         * </ul>
037         *
038         */
039        public enum TileUpdate {
040            IfNoneMatch, ETag, IfModifiedSince, LastModified, None
041        }
042    
043        /**
044         * Specifies the maximum zoom value. The number of zoom levels is [0..
045         * {@link #getMaxZoom()}].
046         *
047         * @return maximum zoom value that has to be smaller or equal to
048         *         {@link JMapViewer#MAX_ZOOM}
049         */
050        int getMaxZoom();
051    
052        /**
053         * Specifies the minimum zoom value. This value is usually 0.
054         * Only for maps that cover a certain region up to a limited zoom level
055         * this method should return a value different than 0.
056         *
057         * @return minimum zoom value - usually 0
058         */
059        int getMinZoom();
060    
061        /**
062         * @return The supported tile update mechanism
063         * @see TileUpdate
064         */
065        TileUpdate getTileUpdate();
066    
067        /**
068         * A tile layer name has to be unique and has to consist only of characters
069         * valid for filenames.
070         *
071         * @return Name of the tile layer
072         */
073        String getName();
074    
075        /**
076         * Constructs the tile url.
077         *
078         * @param zoom
079         * @param tilex
080         * @param tiley
081         * @return fully qualified url for downloading the specified tile image
082         */
083        String getTileUrl(int zoom, int tilex, int tiley) throws IOException;
084    
085        /**
086         * Specifies the tile image type. For tiles rendered by Mapnik or
087         * Osmarenderer this is usually <code>"png"</code>.
088         *
089         * @return file extension of the tile image type
090         */
091        String getTileType();
092    
093        /**
094         * Specifies how large each tile is.
095         * @return The size of a single tile in pixels.
096         */
097        int getTileSize();
098    
099        double latToTileY(double lat, int zoom);
100    
101        double lonToTileX(double lon, int zoom);
102    
103        double tileYToLat(int y, int zoom);
104    
105        double tileXToLon(int x, int zoom);
106    }