위도 또는 경도를 미터로 변환하는 방법은 무엇입니까?


127

표준 NMEA 형식의 위도 또는 경도 판독 값이있는 경우 해당 판독 값을 미터로 변환하는 쉬운 방법 / 공식이 있습니까? 그런 다음 Java (J9)에서 구현할 수 있습니까?

편집 : 좋아 내가하고 싶은 것이 쉽게 불가능한 것 같지만 내가 정말로하고 싶은 것은 다음과 같습니다.

경유지의 위도와 경도가 있고 사용자의 위도와 경도를 비교하여 사용자에게 합리적 으로 알릴시기를 결정할 수있는 쉬운 방법이 있다고 가정 해 보겠습니다. 가까운 거리 있는 방법이 있습니까? 나는 합리적이라는 것을 알고 있지만 이것은 쉽게 할 수 있는가 아니면 여전히 지나치게 수학적인가?


2
UTM을 의미합니까? en.wikipedia.org/wiki/…
Adrian Archer

1
위도 / 경도를 미터로 변환한다는 것은 무엇을 의미합니까? 어디에서 미터? 한 좌표에서 다른 좌표까지 지구 표면을 따라 거리를 계산하는 방법을 찾고 있습니까?
Baltimark

2
"웨이 포인트"를 정의합니다. "합리적"을 정의하십시오. 이것이 정말로 당신이 알고 싶은 것입니까 : "위도와 경도를 고려하여 두 지점 사이의 거리를 어떻게 계산합니까?"
Baltimark

2
위도 및 경도에 대한 SQL 쿼리를 수행하려는이 질문을 우연히 발견 하고 하단에 Java 코드가있는 이 훌륭한 기사 를 발견 했습니다 . 그것은 당신에게도 흥미로울 것입니다.
Kristof Van Landschoot

답변:


173

다음은 자바 스크립트 함수입니다.

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 공식은 경도와 위도가 주어진 구의 두 점 사이의 대원 거리를 결정합니다.


2
wgs와 utm간에 변환 할 라이브러리를 찾는 사람들을 위해 : github.com/urbanetic/utm-converter
Aram Kocharyan

3
누군가가 위 코드에 대한 설명을 추가 할 수 있다면 정말 감사 할 것입니다. 미리 감사드립니다!
Ravindranath Akila

이 댓글이 채택 된 것으로 보이는 것을 발견 했습니다 . 링크는 또한 거리 계산에 대한 이 기사 를 기반으로 합니다 . 따라서 답이없는 질문은 원래 링크에서 찾을 수 있습니다. :)
Joachim

이 계산에 고도를 어떻게 추가합니까?
당 갈그

62

간단한 공식을 찾고 있다면 지구가 둘레가 40075km 인 구체라고 가정 할 때 이것이 아마도 가장 간단한 방법 일 것입니다.

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

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


2
경도 방정식은 어떻게 작동합니까? 위도가 90도이면 111km 근처에 표시 될 것으로 예상됩니다. 그러나 대신 0을 표시합니다. 유사하게, 값은 0 근처도 여기에있다 닫습니다
리스

9
위도는 적도에서 0 °이고 극에서 90 °입니다 (반대가 아님). 적도의 경우 공식은 40075km * cos (0 °) / 360 = 111km를 제공합니다. 극의 경우 공식은 40075 * cos (90 °) / 360 = 0km를 제공합니다.
Ben

이 방법은 특히 두 지점 사이의 정확한 거리를 묻지 않고 "충분히 가까움"을 묻는 질문이 아니기 때문에 간단하다고 생각합니다.이 공식을 사용하면 사용자가 웨이 포인트 중앙에있는 사각형 내에 있는지 쉽게 확인할 수 있습니다. . 원보다 사각형을 확인하는 것이 훨씬 간단합니다.
Ben

29

두 좌표 사이의 짧은 거리를 대략적으로 계산하기 위해 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 );

.

아래 코드에서 나는 위키피디아의 공식과의 관계를 보여주기 위해 원시 숫자를 남겼습니다.

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) );

위키 백과 항목에 따르면 거리 계산은 세로 100km의 경우 0.6m, 위도 100km의 경우 1cm 이내이지만 정확도 근처의 어느 곳에서도 사용하기에 괜찮다는 것을 확인하지 않았습니다.


3
2017 년에는 Wikipedia 페이지에 또 다른 (정련 된 것처럼 보임) 공식이 있습니다.
Gorka Llona

3
예, Wikipedia의 공식은 약간 다르지만 다른 Wikipedia 공식은 누군가가 실제로 계산 을 수행 한이 훌륭한 SO 답변 의 유사한 결과를 기반으로하는 것 같습니다 .
not2qubit

10

위도와 경도는 거리가 아닌 지점을 지정하므로 질문은 다소 무의미합니다. 두 점 (위도, 경도) 사이의 최단 거리에 대해 묻는 경우 대원 거리에 대한 이 Wikipedia 기사 를 참조하십시오 .


9
그는 참조 변환에 대해 이야기하고 있으므로 귀하의 답변은 요점에 맞지 않습니다 (말장난 의도 없음)
Paulo Neves

1
그리고 GPS 위치의 데이터 변환을위한 변환 가이드를 참조하십시오. www.microem.ru/pages/u_blox/tech/dataconvert/GPS.G1-X-00006.pdf
Paulo Neves

2
그는 두 지점 사이의 거리를 찾을 수 있도록 미터당 몇 도인 지 알고 싶습니다. 행간을 읽다.
theAnonymous dec.

1
그리고 당신의 대답은 훨씬 더 무의미합니다
jerinho.com

7

이 작업을 쉽게 할 수있는 많은 도구가 있습니다. 참조 monjardin의 답변을 관련 기능에 대한 자세한 내용을.

그러나이를 수행하는 것이 반드시 어려운 것은 아닙니다. Java를 사용하는 것 같으므로 GDAL 과 같은 것을 살펴 보는 것이 좋습니다. . 루틴에 대한 자바 래퍼를 제공하며 Lat / Lon (지리 좌표)에서 UTM (투영 좌표계) 또는 기타 합리적인지도 투영으로 변환하는 데 필요한 모든 도구를 갖추고 있습니다.

UTM은 미터이기 때문에 작업하기가 매우 쉽습니다. 그러나 제대로 작동하려면 적절한 UTM 영역가져와야합니다 . 위도 / 경도 쌍에 적합한 구역을 찾기 위해 인터넷 검색을 통해 사용할 수있는 몇 가지 간단한 코드가 있습니다.


7

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

NOAA에는 웹 사이트에서 이를 지원하기 위해 다운로드 할 수있는 소프트웨어가 있습니다 .


6

다음은 bh- 함수 의 R 버전입니다 .

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
    '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

링크가 깨진 것으로 가득 차 있습니다.
tshepang

1

x 및 y 표현의 위도와 경도를 변환하려면 사용할지도 투영 유형을 결정해야합니다. 저에게는 Elliptical Mercator가 아주 잘 보입니다. 여기 에서 구현을 찾을 수 있습니다 (Java에서도 가능).


0

충분히 가까우면 평면에서 좌표로 취급하여 벗어날 수 있습니다. 이것은 완벽한 정확도가 필요하지 않고 임의의 한계와 비교하기 위해 관련된 거리를 대략적으로 추측하는 것이라면 거리 또는 도시 수준에서 작동합니다.


3
아니요, 작동하지 않습니다! m 단위의 x 거리는 위도 값에 따라 다릅니다. 적도에서 벗어날 수는 있지만 극점에 가까울수록 타원체가 더 극도로 커집니다.
RickyA 2011

3
귀하의 의견은 합리적이지만 위도 / 경도 차이를 미터로 변환하는 것에 대한 사용자의 질문에는 대답하지 않습니다.
JivanAmara 2013 년

0

지구에서의 평균 추락 거리를 기준으로합니다.

1 ° = 111km;

이것을 라디안으로 변환하고 미터로 나누면 RAD에 대한 매직 넘버를 미터 단위로 취합니다. 0.000008998719243599958;

그때:

const RAD = 0.000008998719243599958;
Math.sqrt(Math.pow(lat1 - lat2, 2) + Math.pow(long1 - long2, 2)) / RAD;

3
마지막으로, 간단한 답 :
벤 허치슨

위도가 -179이고 다른 하나가 179이면 x 거리는 358 대신 2 도가되어야합니다
OMGPOP

7
이 답변을 사용하지 마십시오 (어떤 이유에서든 찬성되었습니다). 경도와 거리 사이에는 단일 스케일링이 없습니다. 지구는 평평하지 않습니다.
CPBL

1
나는 그것이 111.1 믿는다
아벨 Callejo

6
경도의 1 도는 적도에서 111km이지만 다른 위도에서는 더 적습니다. 위도 함수에서 경도 1 °의 길이를 km 단위로 구하는 간단한 근사 공식이 있습니다. 경도 1 ° = 40000km * cos (위도) / 360 (물론 위도 = 90 ° 인 경우 111km). 또한 경도 1 °는 위도 1 °와 거의 항상 다른 거리에 있습니다.
Ben

-1

간단한 해결책을 원하면 다른 주석에 설명 된대로 Haversine 공식 을 사용하십시오 . 정확도에 민감한 응용 프로그램이있는 경우 Haversine 공식은 지구가 구체라고 가정하므로 0.5 %보다 더 나은 정확도를 보장하지 않습니다. 지구가 편원 스페 로이드라고 생각하려면 Vincenty의 공식을 사용하는 것이 좋습니다. 또한 Haversine 공식 : {적도 : 6,378.137km, 극지 : 6,356.752km, 체적 : 6,371.0088km}에 어떤 반경을 사용해야하는지 잘 모르겠습니다.


it is assuming the earth is a circle^^ 요즘 어떤 이상한 사람들이이 일을합니다 ...하지만 당신이 의미하는 것은 아마 오히려 it is assuming the earth is a sphere;)
derHugo

-2

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.