Какой самый простой способ преобразовать широту и долготу в двойные значения?
Вопрос
У меня есть файл CSV, содержащий значения широты и долготы, например:
"25°36'55,57""В","45°39'12,52""С"
У кого-нибудь есть быстрый и простой фрагмент кода 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/Долгота)
Другие советы
Спасибо за все быстрые ответы.Основываясь на ответе 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;
}
Как вы хотите это представить?Угловые секунды?Затем 60 минут в каждом градусе, 60 секунд в каждой минуте.Тогда вам придется оставить E и N себе.
Однако в целом это делается не так.
Самое простое представление, с которым мне приходилось работать, — это точка, нанесенная на земной шар в сетке, начало которой проходит через центр Земли. [Таким образом, хороший вектор положения.] Проблема в том, что, хотя его легко использовать данные, правильно вводить их в систему и извлекать из нее может быть сложно, потому что земля не круглая и, если уж на то пошло, однородная.