这是我开始编写的一些代码,墨卡托投影基于此答案。
using System;
using System.Drawing;
namespace CoordinatesTool
{
public class GeoPoint
{
public double Longitude { get; set; }
public double Latitude { get; set; }
public string ToString()
{
return Latitude + "," + Longitude;
}
public PointF ToMercator(int width, int height)
{
var x = (float)((Longitude + 180) * width / 360);
var latRadians = Latitude * Math.PI / 180;
var yTransformed = Math.Log(Math.Tan((latRadians / 2) + (Math.PI / 4)));
var yScaled = (float)((height / 2.0) - (width * yTransformed / (2 * Math.PI)));
return new PointF(x, yScaled);
}
public static GeoPoint FromMercator(PointF point, int width, int height)
{
return FromMercator(point.X, point.Y, width, height);
}
public static GeoPoint FromMercator(double x, double y, int width, int height)
{
// No clue what to do here
}
}
}
我的目标是在 WinForms 应用程序中使用这个实用程序类。我在这张地图上使用它: http ://en.wikipedia.org/wiki/File:Mercator-projection.jpg (宽度:2048,高度:1588)。
墨卡托反演工作得很好(但是,我怀疑它在北极/南极地区不是很准确)。
但是墨卡托逆投影真的让我很困惑。我玩弄了另一个问题中提出的解决方案,但无处可去。特别是我不了解 Gudermannian(和逆)函数、DEGREES_PER_RADIAN 和 RADIANS_PER_DEGREE 常量,以及我应该如何将 y 值转换为纬度以调用 GudermannianInv() 函数。
编辑:这是我尝试如何进行逆投影的方法:
从 yScaled(FromMercator 函数中的参数 y)开始:
var yTransformed = 2 * Math.PI * (height / 2.0 - yScaled) / width;
var latRadians = Math.Arctan(Math.Pow(Math.E, yTransformed) - Math.PI / 4) / 2;
// ...