package com.mutu.mapapi.tilesystem;
/*
* http://msdn.microsoft.com/en-us/library/bb259689.aspx
*
* Copyright (c) 2006-2009 Microsoft Corporation. All rights reserved.
*
*
*/
import com.mutu.mapapi.util.GeoPoint;
import com.mutu.mapapi.util.TileLooper;
import android.graphics.Point;
/**
* This class provides methods to handle the Mercator projection that is used for the osmdroid tile
* system.
*/
public final class WGSTileSystem extends TileSystem{
public WGSTileSystem(){
EarthRadius = 6378137;
MinLatitude = -90.0;
MaxLatitude = 90.0;
MinLongitude = -180;
MaxLongitude = 180;
}
public String name(){
return "WGS";
}
public int MapWidthPixelSize(final int levelOfDetail) {
return (mTileSize << levelOfDetail) * 2;
}
public int MapHeigthPixelSize(final int levelOfDetail) {
return mTileSize << levelOfDetail;
}
public int MapWidthTileSize(final int levelOfDetail) {
return (1 << levelOfDetail) * 2;
}
public int MapHeigthTileSize(final int levelOfDetail) {
return 1 << levelOfDetail;
}
/**
* Converts a point from latitude/longitude WGS-84 coordinates (in degrees) into pixel XY
* coordinates at a specified level of detail.
*
* @param latitude
* Latitude of the point, in degrees
* @param longitude
* Longitude of the point, in degrees
* @param levelOfDetail
* Level of detail, from 1 (lowest detail) to 23 (highest detail)
* @param reuse
* An optional Point to be recycled, or null to create a new one automatically
* @return Output parameter receiving the X and Y coordinates in pixels
*/
public Point LatLongToPixelXY(double latitude, double longitude,
final int levelOfDetail, final Point reuse) {
final Point out = (reuse == null ? new Point() : reuse);
latitude = Clip(latitude, MinLatitude, MaxLatitude);
longitude = Clip(longitude, MinLongitude, MaxLongitude);
final int mapWidthPixelSize = MapWidthPixelSize(levelOfDetail);
final int mapHeigthPixelSize = MapHeigthPixelSize(levelOfDetail);
out.x = (int) ((longitude + 180) / 360 * mapWidthPixelSize);
out.y = (int) ((90 - latitude) / 180 * mapHeigthPixelSize);
return out;
}
/**
* Converts a pixel from pixel XY coordinates at a specified level of detail into
* latitude/longitude WGS-84 coordinates (in degrees).
*
* @param pixelX
* X coordinate of the point, in pixels
* @param pixelY
* Y coordinate of the point, in pixels
* @param levelOfDetail
* Level of detail, from 1 (lowest detail) to 23 (highest detail)
* @param reuse
* An optional GeoPoint to be recycled, or null to create a new one automatically
* @return Output parameter receiving the latitude and longitude in degrees.
*/
public GeoPoint PixelXYToLatLong(final int pixelX, final int pixelY,
final int levelOfDetail, final GeoPoint reuse) {
final GeoPoint out = (reuse == null ? new GeoPoint(0, 0) : reuse);
final double mapWidthPixelSize = MapWidthPixelSize(levelOfDetail);
final double mapHeigthPixelSize = MapHeigthPixelSize(levelOfDetail);
final double latitude = 90 - pixelY / mapHeigthPixelSize * 180;
final double longitude = pixelX / mapWidthPixelSize * 360 - 180;
out.setLatitudeE6((int) (latitude * 1E6));
out.setLongitudeE6((int) (longitude * 1E6));
return out;
}
}