package org.androad.osm.views.util; import org.osmdroid.ResourceProxy; import org.osmdroid.ResourceProxy.string; import org.osmdroid.tileprovider.MapTile; import org.osmdroid.tileprovider.tilesource.OnlineTileSourceBase; public class OSMMapMicrosoftRenderer extends OnlineTileSourceBase { protected static final char[] NUM_CHAR = { '0', '1', '2', '3' }; private final int mOrdinal; public OSMMapMicrosoftRenderer(String aName, final string aResourceId, int aZoomMinLevel, int aZoomMaxLevel, int aMaptileZoom, String aImageFilenameEnding, int ordinal, String ...aBaseUrl) { super(aName, aResourceId, aZoomMinLevel, aZoomMaxLevel, aMaptileZoom, aImageFilenameEnding, aBaseUrl); mOrdinal = ordinal; } @Override public String localizedName(ResourceProxy proxy) { return name(); } @Override public int ordinal() { return mOrdinal; } @Override public String getTileURLString(MapTile aTile) { int zoom = aTile.getZoomLevel(); int x = aTile.getX(); int y = aTile.getY(); String tileNum = encodeQuadTree(zoom, x, y); return new StringBuilder().append(getBaseUrl()).append(tileNum) .append(imageFilenameEnding()).append("?g=45") .toString(); } /** * 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); } }