001// License: GPL. For details, see Readme.txt file.
002package org.openstreetmap.gui.jmapviewer.tilesources;
003
004import java.awt.Point;
005
006import org.openstreetmap.gui.jmapviewer.Coordinate;
007import org.openstreetmap.gui.jmapviewer.OsmMercator;
008import org.openstreetmap.gui.jmapviewer.TileXY;
009import org.openstreetmap.gui.jmapviewer.interfaces.ICoordinate;
010
011/**
012 * TMS tile source.
013 */
014public class TMSTileSource extends AbstractTMSTileSource {
015
016    protected int maxZoom;
017    protected int minZoom;
018    protected OsmMercator osmMercator;
019
020    /**
021     * Constructs a new {@code TMSTileSource}.
022     * @param info tile source information
023     */
024    public TMSTileSource(TileSourceInfo info) {
025        super(info);
026        minZoom = info.getMinZoom();
027        maxZoom = info.getMaxZoom();
028        this.osmMercator = new OsmMercator(this.getTileSize());
029    }
030
031    @Override
032    public int getMinZoom() {
033        return (minZoom == 0) ? super.getMinZoom() : minZoom;
034    }
035
036    @Override
037    public int getMaxZoom() {
038        return (maxZoom == 0) ? super.getMaxZoom() : maxZoom;
039    }
040
041    @Override
042    public double getDistance(double lat1, double lon1, double lat2, double lon2) {
043        return osmMercator.getDistance(lat1, lon1, lat2, lon2);
044    }
045
046    @Override
047    public Point latLonToXY(double lat, double lon, int zoom) {
048        return new Point(
049                (int) osmMercator.lonToX(lon, zoom),
050                (int) osmMercator.latToY(lat, zoom)
051                );
052    }
053
054    @Override
055    public ICoordinate xyToLatLon(int x, int y, int zoom) {
056        return new Coordinate(
057                osmMercator.yToLat(y, zoom),
058                osmMercator.xToLon(x, zoom)
059                );
060    }
061
062    @Override
063    public TileXY latLonToTileXY(double lat, double lon, int zoom) {
064        return new TileXY(
065                osmMercator.lonToX(lon, zoom) / getTileSize(),
066                osmMercator.latToY(lat, zoom) / getTileSize()
067                );
068    }
069
070    @Override
071    public ICoordinate tileXYToLatLon(int x, int y, int zoom) {
072        return new Coordinate(
073                osmMercator.yToLat(y * getTileSize(), zoom),
074                osmMercator.xToLon(x * getTileSize(), zoom)
075                );
076    }
077}