package org.osmdroid.util;
import android.graphics.Point;
/**
* Proxy class for TileSystem. For coordinate conversions (tile to lat/lon and reverse) TileSystem
* only accepts input parameters within certain ranges and crops any values outside of it. For
* lat/lon the range is ~(-85,+85) / (-180,+180) and for tile coordinates (0,mapsize-1). Under
* certain conditions osmdroid creates values outside of these ranges, for example when zooming out
* and displaying the earth more that once side by side or when scrolling across the 180 degree
* longitude (international date line). This class fixes this by wrapping input coordinates into a
* valid range by adding/subtracting the valid span. Example: longitude +185 => -175
*
* @author Oliver Seiler
*/
public final class TileSystem {
/** @see microsoft.mappoint.TileSystem#setTileSize(int) */
public static void setTileSize(final int tileSize) {
microsoft.mappoint.TileSystem.setTileSize(tileSize);
}
/** @see microsoft.mappoint.TileSystem#getTileSize() */
public static int getTileSize() {
return microsoft.mappoint.TileSystem.getTileSize();
}
/** @see microsoft.mappoint.TileSystem#MapSize(int) */
public static int MapSize(final int levelOfDetail) {
return microsoft.mappoint.TileSystem.MapSize(levelOfDetail);
}
/** @see microsoft.mappoint.TileSystem#GroundResolution(double, int) */
public static double GroundResolution(final double latitude, final int levelOfDetail) {
return microsoft.mappoint.TileSystem.GroundResolution(wrap(latitude, -90, 90, 180), levelOfDetail);
}
/** @see microsoft.mappoint.TileSystem#MapScale(double, int, int) */
public static double MapScale(final double latitude, final int levelOfDetail, final int screenDpi) {
return microsoft.mappoint.TileSystem.MapScale(latitude, levelOfDetail, screenDpi);
}
/** @see microsoft.mappoint.TileSystem#LatLongToPixelXY(double, double, int, Point) */
public static Point LatLongToPixelXY(
final double latitude, final double longitude, final int levelOfDetail, final Point reuse) {
return microsoft.mappoint.TileSystem.LatLongToPixelXY(
wrap(latitude, -90, 90, 180),
wrap(longitude, -180, 180, 360),
levelOfDetail, reuse);
}
/** @see microsoft.mappoint.TileSystem#PixelXYToLatLong(int, int, int, GeoPoint) */
public static GeoPoint PixelXYToLatLong(
final int pixelX, final int pixelY, final int levelOfDetail, final GeoPoint reuse) {
final int mapSize = MapSize(levelOfDetail);
return microsoft.mappoint.TileSystem.PixelXYToLatLong(
(int) wrap(pixelX, 0, mapSize - 1, mapSize),
(int) wrap(pixelY, 0, mapSize - 1, mapSize),
levelOfDetail, reuse);
}
/** @see microsoft.mappoint.TileSystem#PixelXYToTileXY(int, int, Point) */
public static Point PixelXYToTileXY(final int pixelX, final int pixelY, final Point reuse) {
return microsoft.mappoint.TileSystem.PixelXYToTileXY(pixelX, pixelY, reuse);
}
/** @see microsoft.mappoint.TileSystem#TileXYToPixelXY(int, int, Point) */
public static Point TileXYToPixelXY(final int tileX, final int tileY, final Point reuse) {
return microsoft.mappoint.TileSystem.TileXYToPixelXY(tileX, tileY, reuse);
}
/** @see microsoft.mappoint.TileSystem#TileXYToQuadKey(int, int, int) */
public static String TileXYToQuadKey(final int tileX, final int tileY, final int levelOfDetail) {
return microsoft.mappoint.TileSystem.TileXYToQuadKey(tileX, tileY, levelOfDetail);
}
/** @see microsoft.mappoint.TileSystem#QuadKeyToTileXY(String, Point) */
public static Point QuadKeyToTileXY(final String quadKey, final Point reuse) {
return microsoft.mappoint.TileSystem.QuadKeyToTileXY(quadKey, reuse);
}
/**
* Returns a value that lies within <code>minValue</code> and <code>maxValue</code> by
* subtracting/adding <code>interval</code>.
*
* @param n
* the input number
* @param minValue
* the minimum value
* @param maxValue
* the maximum value
* @param interval
* the interval length
* @return a value that lies within <code>minValue</code> and <code>maxValue</code> by
* subtracting/adding <code>interval</code>
*/
private static double wrap(double n, final double minValue, final double maxValue, final double interval) {
if (minValue > maxValue) {
throw new IllegalArgumentException("minValue must be smaller than maxValue: "
+ minValue + ">" + maxValue);
}
if (interval > maxValue - minValue + 1) {
throw new IllegalArgumentException(
"interval must be equal or smaller than maxValue-minValue: " + "min: "
+ minValue + " max:" + maxValue + " int:" + interval);
}
while (n < minValue) {
n += interval;
}
while (n > maxValue) {
n -= interval;
}
return n;
}
}