/// <summary>
/// Convert mercator X/Y points to geographic latitude and longitude points
/// </summary>
/// <param name="mercatorX"></param>
/// <param name="mercatorY"></param>
/// <param name="lon"></param>
/// <param name="lat"></param>
private static void WebMercatorToGeographic(double mercatorX, double mercatorY, out double lon, out double lat)
{
if ((mercatorX < -20037508.3427892) || (mercatorX > 20037508.3427892))
{
throw new ArgumentException("Point does not fall within a valid range of the mercator projection.");
}
double x = mercatorX;
double y = mercatorY;
double num3 = x / 6378137.0;
double num4 = num3 * 57.295779513082323;
double num5 = Math.Floor((double)((num4 + 180.0) / 360.0));
double num6 = num4 - (num5 * 360.0);
double num7 = 1.5707963267948966 - (2.0 * Math.Atan(Math.Exp((-1.0 * y) / 6378137.0)));
lat = num6;
lon = num7 * 57.295779513082323;
}
/// <summary>
/// Convert geographic latitude and longitude points to mercator X/Y
/// </summary>
/// <param name="lat"></param>
/// <param name="lon"></param>
/// <param name="mercatorX"></param>
/// <param name="mercatorY"></param>
private static void GeographicToWebMercator(double lat, double lon, out double mercatorX, out double mercatorY)
{
if ((lat < -90.0) || (lon > 90.0))
{
throw new ArgumentException("Point does not fall within a valid range of a geographic coordinate system.");
}
double num = lon * 0.017453292519943295;
double x = 6378137.0 * num;
double a = lat * 0.017453292519943295;
mercatorX = x;
mercatorY = 3189068.5 * Math.Log((1.0 + Math.Sin(a)) / (1.0 - Math.Sin(a)));
}