All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jxmapviewer.viewer.util.MercatorUtils Maven / Gradle / Ivy

There is a newer version: 2.8
Show newest version
/*
 * 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.jxmapviewer.viewer.util;

/**
 * A utility class of methods that help when 
 * dealing with standard Mercator projections.
 * @author [email protected]
 */
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);
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy