緯度と経度を double 値に変換する最も簡単な方法は何ですか?

StackOverflow https://stackoverflow.com/questions/103006

  •  01-07-2019
  •  | 
  •  

質問

次のような緯度と経度の値を含む CSV ファイルがあります。

"25°36'55.57""E"、"45°39'12.52""N"

これを double 値に変換するための簡単で簡単な C# コードを持っている人はいますか?

ありがとう

役に立ちましたか?

解決

これを行うための C# コードを意味する場合:

結果 = 25 + (36 / 60) + (55.57 / 3600)

まず、正規表現またはその他のメカニズムを使用して式を解析し、個々の部分に分割する必要があります。それから:

String hour = "25";
String minute = "36";
String second = "55.57";
Double result = (hour) + (minute) / 60 + (second) / 3600;

そしてもちろん、N/S または E/S に応じて符号を反転するスイッチも付いています。ウィキペディアにはそれについて少し書かれています:

計算では、西半球では西/東の接尾辞が負の符号に置き換えられます。紛らわしいことに、東を否定する慣例も時々見られます。東が正であるという優先規則は、北極を上にした右手のデカルト座標系と一致しています。特定の経度を特定の緯度 (通常は北半球では正) と組み合わせることで、地表上の正確な位置が得られます。(http://en.wikipedia.org/wiki/経度)

他のヒント

素早い回答ありがとうございます。amdfan の回答に基づいて、C# で機能するこのコードをまとめました。

/// <summary>The regular expression parser used to parse the lat/long</summary>
private static Regex Parser = new Regex("^(?<deg>[-+0-9]+)[^0-9]+(?<min>[0-9]+)[^0-9]+(?<sec>[0-9.,]+)[^0-9.,ENSW]+(?<pos>[ENSW]*)$");

/// <summary>Parses the lat lon value.</summary>
/// <param name="value">The value.</param>
/// <remarks>It must have at least 3 parts 'degrees' 'minutes' 'seconds'. If it 
/// has E/W and N/S this is used to change the sign.</remarks>
/// <returns></returns>
public static double ParseLatLonValue(string value)
{
    // If it starts and finishes with a quote, strip them off
    if (value.StartsWith("\"") && value.EndsWith("\""))
    {
        value = value.Substring(1, value.Length - 2).Replace("\"\"", "\"");
    }

    // Now parse using the regex parser
    Match match = Parser.Match(value);
    if (!match.Success)
    {
        throw new ArgumentException(string.Format(CultureInfo.CurrentUICulture, "Lat/long value of '{0}' is not recognised", value));
    }

    // Convert - adjust the sign if necessary
    double deg = double.Parse(match.Groups["deg"].Value);
    double min = double.Parse(match.Groups["min"].Value);
    double sec = double.Parse(match.Groups["sec"].Value);
    double result = deg + (min / 60) + (sec / 3600);
    if (match.Groups["pos"].Success)
    {
        char ch = match.Groups["pos"].Value[0];
        result = ((ch == 'S') || (ch == 'W')) ? -result : result;
    }
    return result;
}

それを何として表現したいのでしょうか?アーク秒?次に、1 度ごとに 60 分、1 分ごとに 60 秒になります。その場合、E と N を自分で保持する必要があります。

ただし、これは一般的に行われる方法ではありません。

私がこれまでに見た中で最も簡単な表現は、地球の中心を通る原点を持つグリッド システム上の地球上にプロットされた点です。[したがって、優れた位置ベクトルになります]。これの問題は、これは簡単ですが、データを使用する場合、データをシステムに正しく出し入れするのは難しい場合があります。地球は丸くなく、さらに言えば均一ではないためです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top