Какой самый простой способ преобразовать широту и долготу в двойные значения - PullRequest
9 голосов
/ 19 сентября 2008

У меня есть CSV-файл, содержащий значения широты и долготы, такие как:

"25 ° 36'55.57" "Е", "45 ° 39'12.52" "N"

У кого-нибудь есть быстрый и простой фрагмент кода на C # для преобразования его в двойные значения?

Спасибо

Ответы [ 3 ]

11 голосов
/ 19 сентября 2008

Если вы имеете в виду код C # для этого:

результат = 25 + (36/60) + (55,57 / 3600)

Сначала вам нужно проанализировать выражение с помощью Regex или какого-либо другого механизма и разделить его на отдельные части. Тогда:

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/Longitude)

8 голосов
/ 19 сентября 2008

Спасибо за все быстрые ответы. Основываясь на ответе 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;
}
0 голосов
/ 19 сентября 2008

Что вы хотите представить? Секунды дуги? Затем 60 минут в каждом градусе, 60 секунд в каждую минуту. Тогда вам придется держать E и N самостоятельно.

Обычно это не так.

Самое простое представление, с которым я когда-либо работал, - это точка, нанесенная на глобус в системе координат, которая берет свое начало через центр Земли. [Таким образом, хороший вектор положения.] данные легко использовать, правильно вводить их в систему и выводить из нее может быть сложно, потому что земля не круглая или, по сути, однородная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...