これが私が書き始めたコードです。メルカトル図法はこの回答に基づいています。
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;
// ...