001package org.openstreetmap.gui.jmapviewer.tilesources;
002
003//License: GPL.
004
005import java.awt.Image;
006import java.io.IOException;
007
008import javax.swing.ImageIcon;
009
010import org.openstreetmap.gui.jmapviewer.Coordinate;
011import org.openstreetmap.gui.jmapviewer.interfaces.TileSource;
012
013public abstract class AbstractTMSTileSource extends AbstractTileSource {
014
015    protected String name;
016    protected String baseUrl;
017
018    public AbstractTMSTileSource(String name, String base_url) {
019        this.name = name;
020        this.baseUrl = base_url;
021        if(baseUrl.endsWith("/")) {
022            baseUrl = baseUrl.substring(0,baseUrl.length()-1);
023        }
024    }
025
026    @Override
027    public String getName() {
028        return name;
029    }
030
031    @Override
032    public int getMaxZoom() {
033        return 21;
034    }
035
036    @Override
037    public int getMinZoom() {
038        return 0;
039    }
040
041    public String getExtension() {
042        return "png";
043    }
044
045    /**
046     * @throws IOException when subclass cannot return the tile URL
047     */
048    public String getTilePath(int zoom, int tilex, int tiley) throws IOException {
049        return "/" + zoom + "/" + tilex + "/" + tiley + "." + getExtension();
050    }
051
052    public String getBaseUrl() {
053        return this.baseUrl;
054    }
055
056    @Override
057    public String getTileUrl(int zoom, int tilex, int tiley) throws IOException {
058        return this.getBaseUrl() + getTilePath(zoom, tilex, tiley);
059    }
060
061    @Override
062    public String toString() {
063        return getName();
064    }
065
066    @Override
067    public String getTileType() {
068        return "png";
069    }
070
071    @Override
072    public int getTileSize() {
073        return 256;
074    }
075
076    @Override
077    public double latToTileY(double lat, int zoom) {
078        double l = lat / 180 * Math.PI;
079        double pf = Math.log(Math.tan(l) + (1 / Math.cos(l)));
080        return Math.pow(2.0, zoom - 1) * (Math.PI - pf) / Math.PI;
081    }
082
083    @Override
084    public double lonToTileX(double lon, int zoom) {
085        return Math.pow(2.0, zoom - 3) * (lon + 180.0) / 45.0;
086    }
087
088    @Override
089    public double tileYToLat(int y, int zoom) {
090        return Math.atan(Math.sinh(Math.PI - (Math.PI * y / Math.pow(2.0, zoom - 1)))) * 180 / Math.PI;
091    }
092
093    @Override
094    public double tileXToLon(int x, int zoom) {
095        return x * 45.0 / Math.pow(2.0, zoom - 3) - 180.0;
096    }
097}