/******************************************************************************* * Copyright (c) MOBAC developers * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. ******************************************************************************/ package mobac.mapsources; import java.awt.geom.Point2D; import mobac.program.interfaces.MapSource; import mobac.program.interfaces.MapSpace; /** * Utility methods used by several map sources. */ public class MapSourceTools { 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); } /** * Calculates latitude and longitude of the upper left corner of the specified tile of <code>mapsource</code> * regarding the zoom level specified by <code>zoom</code>. * * @param mapSource * @param zoom * @param tilex * horizontal tile number * @param tiley * vertical tile number * @return <code>double[] {lon_min , lat_min , lon_max , lat_max}</code> */ public static double[] calculateLatLon(MapSource mapSource, int zoom, int tilex, int tiley) { MapSpace mapSpace = mapSource.getMapSpace(); int tileSize = mapSpace.getTileSize(); double[] result = new double[4]; tilex *= tileSize; tiley *= tileSize; //result[0] = mapSpace.cXToLon(tilex, zoom); // lon_min //result[1] = mapSpace.cYToLat(tiley + tileSize, zoom); // lat_max //result[2] = mapSpace.cXToLon(tilex + tileSize, zoom); // lon_min //result[3] = mapSpace.cYToLat(tiley, zoom); // lat_max Point2D.Double p1 = mapSpace.cXYToLonLat(tilex, tiley, zoom); Point2D.Double p2 = mapSpace.cXYToLonLat(tilex + tileSize, tiley + tileSize, zoom); result[0] = p1.x; // lon_min result[1] = p2.y; // lat_max result[2] = p2.x; // lon_min result[3] = p1.y; // lat_max return result; } public static String formatMapUrl(String mapUrl, int zoom, int tilex, int tiley) { String tmp = mapUrl; tmp = tmp.replace("{$x}", Integer.toString(tilex)); tmp = tmp.replace("{$y}", Integer.toString(tiley)); tmp = tmp.replace("{$z}", Integer.toString(zoom)); tmp = tmp.replace("{$q}", MapSourceTools.encodeQuadTree(zoom, tilex, tiley)); int antiy = (1 << zoom) - tiley - 1; tmp = tmp.replace("{$-y}", Integer.toString(antiy)); tmp = tmp.replace("{$sx}", Integer.toString(tilex / 16)); tmp = tmp.replace("{$sy}", Integer.toString(antiy / 16)); tmp = tmp.replace("{$part}", Integer.toString((antiy % 10) % 4)); return tmp; } public static String formatMapUrl(String mapUrl, int serverNum, int zoom, int tilex, int tiley) { String tmp = mapUrl; tmp = tmp.replace("{$servernum}", Integer.toString(serverNum)); return formatMapUrl(tmp, zoom, tilex, tiley); } public static String formatMapUrl(String mapUrl, String serverPart, int zoom, int tilex, int tiley) { String tmp = mapUrl; tmp = tmp.replace("{$serverpart}", serverPart); return formatMapUrl(tmp, zoom, tilex, tiley); } }