下面是我開始寫的一些代碼,墨卡託投影基於this answer。如何做逆墨卡託投影
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)。
墨卡託反演工作得很好(但是,我懷疑它在北極/南極地區不是很準確)。
但逆墨卡託投影真的讓我感到困惑。我玩弄了another question中提出的解決方案,但無法獲得任何地方。尤其是我不明白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;
// ...
所以DEGREES_PER_RADIAN是360 /(2 * Math.PI)和RADIANS_PER_DEGREE是(2 * Math.PI)/ 360? – DavWEB
嗯,我總是用'180/pi'和'pi/180'去,但是,是的,你的價值觀是正確的。 –
你的第二點正是我第一次嘗試的。 '非'規模的部分並不困難。但是,我想,因爲它沒有像預期的那樣工作,所以我在努力處理'不'轉換部分。我會用我得到的東西更新我的問題。 – DavWEB