위도와 경도를 이중 값으로 변환하는 가장 쉬운 방법은 무엇입니까

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)

먼저 Regex나 다른 메커니즘을 사용하여 표현식을 구문 분석하고 이를 개별 부분으로 분할해야 합니다.그 다음에:

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

물론 N/S 또는 E/S에 따라 기호를 뒤집는 스위치도 있습니다.Wikipedia에는 ​​이에 대한 약간의 내용이 있습니다.

계산을 위해 West/East 접미사는 서반구에서 음수 기호로 대체됩니다.혼란스럽게도 동양에 대한 부정의 관습도 가끔 보입니다.선호되는 관례(동쪽은 양수)는 북극이 위로 향하는 오른쪽 직교 좌표계와 일치합니다.특정 경도는 특정 위도(보통 북반구에서는 양수)와 결합되어 지구 표면의 정확한 위치를 제공할 수 있습니다.(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