001// License: GPL. For details, see Readme.txt file.
002package org.openstreetmap.gui.jmapviewer.tilesources;
003
004import java.io.IOException;
005
006import org.openstreetmap.gui.jmapviewer.OsmMercator;
007
008public abstract class AbstractTMSTileSource extends AbstractTileSource {
009
010    protected String name;
011    protected String baseUrl;
012    protected String id;
013
014    public AbstractTMSTileSource(String name, String base_url, String id) {
015        this.name = name;
016        this.baseUrl = base_url;
017        if(baseUrl.endsWith("/")) {
018            baseUrl = baseUrl.substring(0,baseUrl.length()-1);
019        }
020        this.id = id;
021    }
022
023    @Override
024    public String getName() {
025        return name;
026    }
027
028    @Override
029    public String getId() {
030        return id;
031    }
032
033    @Override
034    public int getMaxZoom() {
035        return 21;
036    }
037
038    @Override
039    public int getMinZoom() {
040        return 0;
041    }
042
043    public String getExtension() {
044        return "png";
045    }
046
047    /**
048     * @throws IOException when subclass cannot return the tile URL
049     */
050    public String getTilePath(int zoom, int tilex, int tiley) throws IOException {
051        return "/" + zoom + "/" + tilex + "/" + tiley + "." + getExtension();
052    }
053
054    public String getBaseUrl() {
055        return this.baseUrl;
056    }
057
058    @Override
059    public String getTileUrl(int zoom, int tilex, int tiley) throws IOException {
060        return this.getBaseUrl() + getTilePath(zoom, tilex, tiley);
061    }
062
063    @Override
064    public String toString() {
065        return getName();
066    }
067
068    @Override
069    public String getTileType() {
070        return "png";
071    }
072
073    /*
074     * Most tilesources use OsmMercator projection.
075     */
076    @Override
077    public int getTileSize() {
078        return OsmMercator.TILE_SIZE;
079    }
080
081    @Override
082    public double getDistance(double lat1, double lon1, double lat2, double lon2) {
083        return OsmMercator.getDistance(lat1, lon1, lat2, lon2);
084    }
085
086    @Override
087    public int LonToX(double lon, int zoom) {
088        return (int )OsmMercator.LonToX(lon, zoom);
089    }
090
091    @Override
092    public int LatToY(double lat, int zoom) {
093        return (int )OsmMercator.LatToY(lat, zoom);
094    }
095
096    @Override
097    public double XToLon(int x, int zoom) {
098        return OsmMercator.XToLon(x, zoom);
099    }
100
101    @Override
102    public double YToLat(int y, int zoom) {
103        return OsmMercator.YToLat(y, zoom);
104    }
105
106    @Override
107    public double latToTileY(double lat, int zoom) {
108        return OsmMercator.LatToY(lat, zoom) / OsmMercator.TILE_SIZE;
109    }
110
111    @Override
112    public double lonToTileX(double lon, int zoom) {
113        return OsmMercator.LonToX(lon, zoom) / OsmMercator.TILE_SIZE;
114    }
115
116    @Override
117    public double tileYToLat(int y, int zoom) {
118        return OsmMercator.YToLat(y * OsmMercator.TILE_SIZE, zoom);
119    }
120
121    @Override
122    public double tileXToLon(int x, int zoom) {
123        return OsmMercator.XToLon(x * OsmMercator.TILE_SIZE, zoom);
124    }
125}