문제

표준 NMEA 형식의 위도 또는 경도 판독 값이 있다면 해당 판독기를 미터로 변환하는 쉬운 방법 / 공식이 있습니까?

편집 : 좋아, 내가하고 싶은 것이 불가능한 것 같습니다. 용이하게, 그러나 내가 정말로하고 싶은 것은 다음과 같습니다.

위도와 길이가 길고 위도와 긴 사용자가 사용자에게 지시 할시기를 결정하기 위해 쉽게 비교할 수있는 방법이 있습니다. 합리적으로 웨이 포인트의 가까운 거리? 나는 합리적이라는 것을 알고 있지만 이것은 쉽게 할 수 있거나 여전히 지나치게 수학입니까?

도움이 되었습니까?

해결책

JavaScript 기능은 다음과 같습니다.

function measure(lat1, lon1, lat2, lon2){  // generally used geo measurement function
    var R = 6378.137; // Radius of earth in KM
    var dLat = lat2 * Math.PI / 180 - lat1 * Math.PI / 180;
    var dLon = lon2 * Math.PI / 180 - lon1 * Math.PI / 180;
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
    Math.sin(dLon/2) * Math.sin(dLon/2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    var d = R * c;
    return d * 1000; // meters
}

설명: https://en.wikipedia.org/wiki/haversine_formula

Haversine 공식은 종단과 위도가 주어진 구역의 두 지점 사이의 큰 원 거리는 결정됩니다.

다른 팁

당신이 간단한 공식을 찾고 있다면, 지구가 주변 40075km의 영역이라고 가정 할 때 이것은 아마도 가장 간단한 방법 일 것입니다.

위도 1 ° 미터의 길이 = 항상 111.32km

1 °의 경도 1 °의 길이 = 40075 km * cos (위도) / 360

두 좌표 사이의 짧은 거리를 근사하기 위해 공식을 사용했습니다. http://en.wikipedia.org/wiki/lat-lon:

m_per_deg_lat = 111132.954 - 559.822 * cos( 2 * latMid ) + 1.175 * cos( 4 * latMid);
m_per_deg_lon = 111132.954 * cos ( latMid );

.

아래 코드에서 Wikipedia의 공식과의 관계를 보여주기 위해 원시 번호를 남겼습니다.

double latMid, m_per_deg_lat, m_per_deg_lon, deltaLat, deltaLon,dist_m;

latMid = (Lat1+Lat2 )/2.0;  // or just use Lat1 for slightly less accurate estimate


m_per_deg_lat = 111132.954 - 559.822 * cos( 2.0 * latMid ) + 1.175 * cos( 4.0 * latMid);
m_per_deg_lon = (3.14159265359/180 ) * 6367449 * cos ( latMid );

deltaLat = fabs(Lat1 - Lat2);
deltaLon = fabs(Lon1 - Lon2);

dist_m = sqrt (  pow( deltaLat * m_per_deg_lat,2) + pow( deltaLon * m_per_deg_lon , 2) );

Wikipedia 항목에 따르면 거리는 거리는 세로에서 100km의 경우 0.6m 이내, 위도 100km의 경우 1cm 이내에 있지만, 나는 그 정확도 근처의 어느 곳에서나 사용하기에 적합하지 않다고 확인하지 않았습니다.

위도와 경도는 거리가 아닌 포인트를 지정하므로 질문은 다소 무의미합니다. 두 개의 (LAT, LON) 지점 사이의 가장 짧은 거리에 대해 묻는다면 이 위키 백과 기사 회로 거리에.

지구는 성가신 불규칙한 표면이므로 정확하게 수행 할 간단한 공식이 없습니다. 당신은 대략적인 지구의 모델로 살고 좌표를 투영해야합니다. 내가 일반적으로 사용하는 모델은 이것입니다 WGS 84. 이것이 바로 GPS 장치가 일반적으로 동일한 문제를 해결하기 위해 사용하는 것입니다.

NOAA에는 이에 도움을주기 위해 다운로드 할 수있는 소프트웨어가 있습니다. 그들의 웹 사이트에서.

쉽게 만들 수있는 도구가 많이 있습니다. 보다 Monjardin의 대답 관련된 내용에 대한 자세한 내용.

그러나 이것을하는 것이 반드시 어렵지는 않습니다. Java를 사용하는 것처럼 들리므로 같은 것을 살펴 보는 것이 좋습니다. gdal. Java 래퍼에게 루틴에 대한 Java 래퍼를 제공하며 LAT/LON (지리적 좌표)에서 UTM (투사 좌표 시스템)으로 변환하는 데 필요한 모든 도구가 있습니다.

UTM은 미터이기 때문에 작업하기가 쉽습니다. 그러나 적절한 것을 얻어야합니다 UTM 구역 좋은 일을하기 위해. Googling을 통해 사용할 수있는 간단한 코드가 있습니다.

다음은 R 버전입니다 BH-'s 기능, 만일을 대비하여 :

measure <- function(lon1,lat1,lon2,lat2) {
    R <- 6378.137                                # radius of earth in Km
    dLat <- (lat2-lat1)*pi/180
    dLon <- (lon2-lon1)*pi/180
    a <- sin((dLat/2))^2 + cos(lat1*pi/180)*cos(lat2*pi/180)*(sin(dLon/2))^2
    c <- 2 * atan2(sqrt(a), sqrt(1-a))
    d <- R * c
    return (d * 1000)                            # distance in meters
}

1 개의 해상 마일 (1852 미터)은 하나로 정의됩니다. Arcminute 적도에서의 경도. 그러나 a를 정의해야합니다 지도 투영 (또한보십시오 UTM) 당신은 전환을 위해 실제로 이해하기 위해 노력하고 있습니다.

이것을 계산하는 몇 가지 방법이 있습니다. 그들 모두는 반경이 지구의 하나 인 구형 삼각법의 aproximations를 사용합니다.

노력하다 http://www.movable-type.co.uk/scripts/latlong.html 다른 언어로 약간의 방법과 코드를 위해.

지구의 탈지에 대한 평균 거리를 기준으로합니다.

1 ° = 111km;

라디안을 위해 이것을 변환하고 미터로 나누기 위해, 테이크는 0.000008998719243599958;

그 다음에:

const RAD = 0.000008998719243599958;
Math.sqrt(Math.pow(lat1 - lat2, 2) + Math.pow(long1 - long2, 2)) / RAD;
    'below is from
'http://www.zipcodeworld.com/samples/distance.vbnet.html
Public Function distance(ByVal lat1 As Double, ByVal lon1 As Double, _
                         ByVal lat2 As Double, ByVal lon2 As Double, _
                         Optional ByVal unit As Char = "M"c) As Double
    Dim theta As Double = lon1 - lon2
    Dim dist As Double = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) + _
                            Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * _
                            Math.Cos(deg2rad(theta))
    dist = Math.Acos(dist)
    dist = rad2deg(dist)
    dist = dist * 60 * 1.1515
    If unit = "K" Then
        dist = dist * 1.609344
    ElseIf unit = "N" Then
        dist = dist * 0.8684
    End If
    Return dist
End Function
Public Function Haversine(ByVal lat1 As Double, ByVal lon1 As Double, _
                         ByVal lat2 As Double, ByVal lon2 As Double, _
                         Optional ByVal unit As Char = "M"c) As Double
    Dim R As Double = 6371 'earth radius in km
    Dim dLat As Double
    Dim dLon As Double
    Dim a As Double
    Dim c As Double
    Dim d As Double
    dLat = deg2rad(lat2 - lat1)
    dLon = deg2rad((lon2 - lon1))
    a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) + Math.Cos(deg2rad(lat1)) * _
            Math.Cos(deg2rad(lat2)) * Math.Sin(dLon / 2) * Math.Sin(dLon / 2)
    c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a))
    d = R * c
    Select Case unit.ToString.ToUpper
        Case "M"c
            d = d * 0.62137119
        Case "N"c
            d = d * 0.5399568
    End Select
    Return d
End Function
Private Function deg2rad(ByVal deg As Double) As Double
    Return (deg * Math.PI / 180.0)
End Function
Private Function rad2deg(ByVal rad As Double) As Double
    Return rad / Math.PI * 180.0
End Function

X 및 Y 표현의 위도와 경도를 변환하려면 사용할 맵 투사 유형을 결정해야합니다. 나에 관해서는, 타원형 메르카토르가 아주 잘 보입니다. 여기 (Java에서도) 구현을 찾을 수 있습니다.

충분히 가까워지면 평평한 평면에서 좌표로 취급 할 수 있습니다. 이것은 완벽한 정확도가 필요하지 않은 경우 거리 또는 도시 수준에서 작동하며 임의의 한계와 비교하기 위해 관련된 거리에 대한 거친 추측 만 있으면됩니다.

간단한 솔루션을 원한다면 사용하십시오 Haversine 공식 다른 의견에 의해 설명 된대로. 정확도에 민감한 애플리케이션이있는 경우 지구가 원이라고 가정하므로 Haversine 공식이 정확도를 더 잘 보장하지는 않습니다. 지구를 고려하기 위해서 Vincenty의 공식. 또한 Haversine Formula에서 어떤 반경을 사용해야하는지 잘 모르겠습니다. {적도 : 6,378.137 km, 극 : 6,356.752km, 부피 : 6,371.0088 km}.

구형 기하학을 수행하기 위해 좌표를 라디안으로 변환해야합니다. 일단 변환되면 두 지점 사이의 거리를 계산할 수 있습니다. 그런 다음 거리는 원하는 측정 값으로 변환 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top