1

これが私が書き始めたコードです。メルカトル図法はこの回答に基づいています。

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;
// ...
4

1 に答える 1

1

ここにあなたが求めるもののいくつかがあります:

  1. radians * degrees/radians == degrees: Degrees_per_radian はdegrees/radians、「数学」ではなく「英語」で表現する方法にすぎません。radians_per_degree は、読者の演習として残されています。したがって、これら 2 つの定数は、度単位の角度とラジアン単位の角度を変換するときに使用する数値を表します。

  2. 投稿したコードを見ると、latRadiansy に変換する行があります。これらの操作を逆にするコードを実装するのは簡単に見えます。'yScaled' を 'un'-scale および 'un'-transform する必要があります。たとえば、線 (部分) を処理します。

    yScaled = ((height / 2.0) - (width * yTransformed / (2 * Math.PI)))

    yTransformed数学方程式として、を に関して解く必要がありますyScaled

  3. グデルマンに関しては、あなたが参照する質問は、それを1行のコードで実装し、逆グデルマンを3行で実装しています。Gudermannian は、円形の測定値 (度またはラジアンでの測定値など) を線形の測定値 (紙に公開されるチャートのセンチメートル単位など) に変換する方法です。特に、ここに関連して、Gudermannian は緯度を 0 からの直線距離に変換します。

編集

OK、もう少し詳しく見てみると、元のコードでは、次の行を使用して緯度を角度測定から線形測定に変換します。

yTransformed = Math.Log(Math.Tan((latRadians / 2) + (Math.PI / 4)))

リンク先の質問への回答に示されているように、おそらくこれを逆Gudermannianの呼び出しに置き換える必要があると思います。あなたの自家製の変換は、tan/arctan 関数の極端な点でつまずいていると思われます。もちろん、非変換で直接グデルマンを使用します。

于 2012-05-14T09:17:15.243 に答える