Вот код, который я начал писать, проекция Меркатора основана на 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, но никуда не мог добраться. Особенно я не понимаю гудерманновскую (и обратную) функцию, константы DEGREES_PER_RADIAN и RADIANS_PER_DEGREE, и как я должен преобразовать значение y в широту, чтобы вызвать функцию GudermannianInv().
РЕДАКТИРОВАТЬ: Вот как я пытался, как сделать обратную проекцию:
Запуск с yScaled (параметр у в функции FromMercator):
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', но да, у вас есть значения правильно. –
Ваш второй пункт - это именно то, что я пробовал в первую очередь. «Не-масштабная часть не была сложной. Но потом я боролся с частью «un'-transform», я думаю, потому что это не сработало, как ожидалось. Я уточню свой вопрос, что именно я получил. – DavWEB