001 package org.openstreetmap.gui.jmapviewer.tilesources; 002 003 //License: GPL. 004 005 import java.awt.Image; 006 import java.io.IOException; 007 008 import javax.swing.ImageIcon; 009 010 import org.openstreetmap.gui.jmapviewer.Coordinate; 011 import org.openstreetmap.gui.jmapviewer.interfaces.TileSource; 012 013 public 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 }