2010-04-30 16:35:33 +02:00
package com.osmand.map ;
import java.text.MessageFormat ;
import java.util.ArrayList ;
public class TileSourceManager {
2010-06-14 12:53:07 +02:00
// transport "http://tile.xn--pnvkarte-m4a.de/tilegen/${z}/${x}/${y}.png", {numZoomLevels: 19,displayInLayerSwitcher:true,buffer:0});
// var navdebug = new OpenLayers.Layer.OSM("Navigation Debug", "http://ec2-184-73-15-218.compute-1.amazonaws.com/6700/256/${z}/${x}/${y}.png", {numZoomLevels: 18,displayInLayerSwitcher:true,buffer:0});
// "Mapsurfer Road", "http://tiles1.mapsurfer.net/tms_r.ashx?", { numZoomLevels: 19, isBaseLayer: true, type: 'png', getURL: osm_getTileURL, displayOutsideMaxExtent: true })
2010-04-30 16:35:33 +02:00
public static class TileSourceTemplate implements ITileSource {
private int maxZoom ;
private int minZoom ;
private String name ;
private int tileSize ;
private String urlToLoad ;
private String ext ;
private int avgSize ;
public TileSourceTemplate ( String name , String urlToLoad , String ext , int maxZoom , int minZoom , int tileSize , int avgSize ) {
this . maxZoom = maxZoom ;
this . minZoom = minZoom ;
this . name = name ;
this . tileSize = tileSize ;
this . urlToLoad = urlToLoad ;
this . ext = ext ;
this . avgSize = avgSize ;
}
public int getAverageSize ( ) {
return avgSize ;
}
@Override
public int getMaximumZoomSupported ( ) {
return maxZoom ;
}
@Override
public int getMinimumZoomSupported ( ) {
return minZoom ;
}
@Override
public String getName ( ) {
return name ;
}
@Override
public int getTileSize ( ) {
return tileSize ;
}
public String getTileFormat ( ) {
return ext ;
}
@Override
public String getUrlToLoad ( int x , int y , int zoom ) {
2010-06-21 00:15:47 +02:00
// use int to string not format numbers! (non-nls)
return MessageFormat . format ( urlToLoad , zoom + " " , x + " " , y + " " ) ; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
2010-04-30 16:35:33 +02:00
}
2010-05-14 13:44:35 +02:00
@Override
public int hashCode ( ) {
final int prime = 31 ;
int result = 1 ;
result = prime * result + ( ( name = = null ) ? 0 : name . hashCode ( ) ) ;
return result ;
}
@Override
public boolean equals ( Object obj ) {
if ( this = = obj )
return true ;
if ( obj = = null )
return false ;
if ( getClass ( ) ! = obj . getClass ( ) )
return false ;
TileSourceTemplate other = ( TileSourceTemplate ) obj ;
if ( name = = null ) {
if ( other . name ! = null )
return false ;
} else if ( ! name . equals ( other . name ) )
return false ;
return true ;
}
2010-04-30 16:35:33 +02:00
}
static java . util . List < TileSourceTemplate > list ;
public static java . util . List < TileSourceTemplate > getKnownSourceTemplates ( ) {
if ( list = = null ) {
list = new ArrayList < TileSourceTemplate > ( ) ;
list . add ( getMapnikSource ( ) ) ;
list . add ( getOsmaRenderSource ( ) ) ;
list . add ( getCycleMapSource ( ) ) ;
2010-06-14 12:53:07 +02:00
list . add ( getMapSurferSource ( ) ) ;
list . add ( getNavigationDebugSource ( ) ) ;
2010-04-30 16:35:33 +02:00
// list.add(getAerialMapSource());
2010-06-14 12:53:07 +02:00
2010-04-30 16:35:33 +02:00
list . add ( getCloudMadeSource ( ) ) ;
list . add ( getOpenPisteMapSource ( ) ) ;
list . add ( getGoogleMapsSource ( ) ) ;
2010-05-02 01:35:00 +02:00
list . add ( getGoogleMapsSatelliteSource ( ) ) ;
list . add ( getGoogleMapsTerrainSource ( ) ) ;
2010-06-14 12:53:07 +02:00
2010-05-02 01:35:00 +02:00
list . add ( getMicrosoftMapsSource ( ) ) ;
list . add ( getMicrosoftEarthSource ( ) ) ;
list . add ( getMicrosoftHybridSource ( ) ) ;
2010-04-30 16:35:33 +02:00
}
return list ;
}
public static TileSourceTemplate getMapnikSource ( ) {
2010-06-19 19:13:52 +02:00
return new TileSourceTemplate ( " Mapnik " , " http://tile.openstreetmap.org/{0}/{1}/{2}.png " , " .png " , 18 , 1 , 256 , 18000 ) ; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
2010-04-30 16:35:33 +02:00
}
public static TileSourceTemplate getOsmaRenderSource ( ) {
2010-06-19 19:13:52 +02:00
return new TileSourceTemplate ( " OsmaRender " , " http://tah.openstreetmap.org/Tiles/tile/{0}/{1}/{2}.png " , " .png " , 17 , 1 , 256 , 18000 ) ; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
2010-04-30 16:35:33 +02:00
}
public static TileSourceTemplate getCycleMapSource ( ) {
2010-06-19 19:13:52 +02:00
return new TileSourceTemplate ( " CycleMap " , " http://b.andy.sandbox.cloudmade.com/tiles/cycle/{0}/{1}/{2}.png " , " .png " , 17 , 0 , 256 , 18000 ) ; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
2010-04-30 16:35:33 +02:00
}
public static TileSourceTemplate getAerialMapSource ( ) {
2010-06-19 19:13:52 +02:00
return new TileSourceTemplate ( " OpenAerialMap " , " http://tile.openaerialmap.org/tiles/1.0.0/openaerialmap-900913/{0}/{1}/{2}.jpg " , " .jpg " , 13 , 0 , 256 , 18000 ) ; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
2010-04-30 16:35:33 +02:00
}
public static TileSourceTemplate getCloudMadeSource ( ) {
2010-06-19 19:13:52 +02:00
return new TileSourceTemplate ( " Cloudmade " , " http://tile.cloudmade.com/7ded028e030c5929b28bf823486ce84f/1/256/{0}/{1}/{2}.png " , " .png " , 18 , 0 , 256 , 18000 ) ; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
2010-04-30 16:35:33 +02:00
}
2010-06-14 12:53:07 +02:00
public static TileSourceTemplate getMapSurferSource ( ) {
2010-06-19 19:13:52 +02:00
return new TileSourceTemplate ( " MapSurfer " , " http://tiles1.mapsurfer.net/tms_r.ashx?z={0}&x={1}&y={2} " , " .png " , 19 , 0 , 256 , 18000 ) ; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
2010-06-14 12:53:07 +02:00
}
public static TileSourceTemplate getNavigationDebugSource ( ) {
2010-06-19 19:13:52 +02:00
return new TileSourceTemplate ( " NavigationDebug " , " http://ec2-184-73-15-218.compute-1.amazonaws.com/6700/256/{0}/{1}/{2}.png " , " .png " , 18 , 0 , 256 , 18000 ) ; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
2010-06-14 12:53:07 +02:00
}
2010-04-30 16:35:33 +02:00
public static TileSourceTemplate getOpenPisteMapSource ( ) {
2010-06-19 19:13:52 +02:00
return new TileSourceTemplate ( " OpenPisteMap " , " http://openpistemap.org/tiles/contours/{0}/{1}/{2}.png " , " .png " , 17 , 0 , 256 , 18000 ) ; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
2010-04-30 16:35:33 +02:00
}
public static TileSourceTemplate getGoogleMapsSource ( ) {
2010-06-19 19:13:52 +02:00
return new TileSourceTemplate ( " GoogleMaps " , " http://mt3.google.com/vt/v=w2.97&x={1}&y={2}&z={0} " , " .png " , 19 , 0 , 256 , 18000 ) ; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
2010-04-30 16:35:33 +02:00
}
public static TileSourceTemplate getGoogleMapsSatelliteSource ( ) {
2010-06-19 19:13:52 +02:00
return new TileSourceTemplate ( " GoogleMaps Satellite " , " http://khm1.google.com/kh/v=59&x={1}&y={2}&z={0} " , " .jpg " , 20 , 0 , 256 , 18000 ) ; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
2010-04-30 16:35:33 +02:00
}
public static TileSourceTemplate getGoogleMapsTerrainSource ( ) {
2010-06-19 19:13:52 +02:00
return new TileSourceTemplate ( " GoogleMaps Terrain " , " http://mt3.google.com/vt/v=w2p.111&hl=en&x={1}&y={2}&z={0} " , " .jpg " , 15 , 0 , 256 , 18000 ) ; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
2010-04-30 16:35:33 +02:00
}
2010-05-02 01:35:00 +02:00
public static TileSourceTemplate getMicrosoftMapsSource ( ) {
2010-06-19 19:13:52 +02:00
return new MicrosoftTileSourceTemplate ( " Microsoft Maps " , 'r' , " png " , " .png " , 19 , 1 , 256 , 18000 ) ; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
2010-05-02 01:35:00 +02:00
}
public static TileSourceTemplate getMicrosoftEarthSource ( ) {
2010-06-19 19:13:52 +02:00
return new MicrosoftTileSourceTemplate ( " Microsoft Earth " , 'a' , " jpg " , " .jpg " , 19 , 1 , 256 , 18000 ) ; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
2010-05-02 01:35:00 +02:00
}
public static TileSourceTemplate getMicrosoftHybridSource ( ) {
2010-06-19 19:13:52 +02:00
return new MicrosoftTileSourceTemplate ( " Microsoft Hybrid " , 'h' , " jpg " , " .jpg " , 19 , 1 , 256 , 18000 ) ; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
2010-05-02 01:35:00 +02:00
}
protected static final char [ ] NUM_CHAR = { '0' , '1' , '2' , '3' } ;
/ * *
* See : http : //msdn.microsoft.com/en-us/library/bb259689.aspx
* @param zoom
* @param tilex
* @param tiley
* @return quadtree encoded tile number
*
* /
public static String encodeQuadTree ( int zoom , int tilex , int tiley ) {
char [ ] tileNum = new char [ zoom ] ;
for ( int i = zoom - 1 ; i > = 0 ; i - - ) {
// Binary encoding using ones for tilex and twos for tiley. if a bit
// is set in tilex and tiley we get a three.
int num = ( tilex % 2 ) | ( ( tiley % 2 ) < < 1 ) ;
tileNum [ i ] = NUM_CHAR [ num ] ;
tilex > > = 1 ;
tiley > > = 1 ;
}
return new String ( tileNum ) ;
}
public static class MicrosoftTileSourceTemplate extends TileSourceTemplate {
private final char mapTypeChar ;
int serverNum = 0 ; // 0..3
2010-06-19 19:13:52 +02:00
protected String urlBase = " .ortho.tiles.virtualearth.net/tiles/ " ; //$NON-NLS-1$
protected String urlAppend = " ?g=45 " ; //$NON-NLS-1$
2010-05-02 01:35:00 +02:00
private final String tileType ;
public MicrosoftTileSourceTemplate ( String name , char mapTypeChar , String type ,
String ext , int maxZoom , int minZoom , int tileSize , int avgSize ) {
super ( name , null , ext , maxZoom , minZoom , tileSize , avgSize ) ;
this . mapTypeChar = mapTypeChar ;
this . tileType = type ;
}
@Override
public String getUrlToLoad ( int x , int y , int zoom ) {
String tileNum = encodeQuadTree ( zoom , x , y ) ;
// serverNum = (serverNum + 1) % serverNumMax;
2010-06-19 19:13:52 +02:00
return " http:// " + mapTypeChar + serverNum + urlBase + mapTypeChar + tileNum + " . " //$NON-NLS-1$ //$NON-NLS-2$
2010-05-02 01:35:00 +02:00
+ tileType + urlAppend ;
}
}
2010-04-30 16:35:33 +02:00
}