/*
* MercatorUtils.java
*
* Created on October 7, 2006, 6:02 PM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package org.jdesktop.swingx.mapviewer.util;
/**
* A utility class of methods that help when
* dealing with standard Mercator projections.
* @author joshua.marinacci@sun.com
*/
public final class MercatorUtils
{
/**
* Creates a new instance of MercatorUtils
*/
private MercatorUtils()
{
}
/**
* @param longitudeDegrees the longitude in degrees
* @param radius the world radius in pixels
* @return the x value
*/
public static int longToX(double longitudeDegrees, double radius)
{
double longitude = Math.toRadians(longitudeDegrees);
return (int) (radius * longitude);
}
/**
* @param latitudeDegrees the latitude in degrees
* @param radius the world radius in pixels
* @return the y value
*/
public static int latToY(double latitudeDegrees, double radius)
{
double latitude = Math.toRadians(latitudeDegrees);
double y = radius / 2.0 * Math.log((1.0 + Math.sin(latitude)) / (1.0 - Math.sin(latitude)));
return (int) y;
}
/**
* @param x the x value
* @param radius the world radius in pixels
* @return the longitude in degrees
*/
public static double xToLong(int x, double radius)
{
double longRadians = x / radius;
double longDegrees = Math.toDegrees(longRadians);
/*
* The user could have panned around the world a lot of times. Lat long goes from -180 to 180. So every time a
* user gets to 181 we want to subtract 360 degrees. Every time a user gets to -181 we want to add 360 degrees.
*/
int rotations = (int) Math.floor((longDegrees + 180) / 360);
double longitude = longDegrees - (rotations * 360);
return longitude;
}
/**
* @param y the y value
* @param radius the world radius in pixels
* @return the latitude in degrees
*/
public static double yToLat(int y, double radius)
{
double latitude = (Math.PI / 2) - (2 * Math.atan(Math.exp(-1.0 * y / radius)));
return Math.toDegrees(latitude);
}
}