미터 단위로 위도 / 경도를 상쇄하기위한 알고리즘


108

위도 및 경도 쌍과 직교 좌표계 (x, y)로 미터 단위의 벡터 변환이 주어지면 새로운 좌표를 줄 알고리즘을 찾고 있습니다. 역 Haversine과 같습니다. 나는 또한 거리와 표제 변환으로 작업 할 수 있지만 아마도 느리고 정확하지 않을 것입니다. 이상적으로는 임베디드 시스템에서 작업 할 때 알고리즘이 빠릅니다. 정확도는 중요하지 않으며 10 미터 이내에 있으면 좋습니다.


지구를 구체로 모델링하는 것이 좋을까요?
underdark

1
예, 1km 미만의 오프셋을 예상하면 괜찮을 것입니다.
Thomas O

답변:


107

변위가 너무 크지 않고 (몇 킬로미터 미만) 극에 맞지 않으면 y 방향의 111,111 미터 (111.111 km)가 위도 1 도인 빠르고 더러운 추정치를 사용하십시오. 111,111 * x 방향의 cos (latitude) 미터는 1도 (경도)입니다.


3
@ 토마스 : 실제로, 당신은 극에 매우 가까이있을 수 있습니다. 1400m의 동일한 x 및 y 변위를 사용하여 UTM 계산을 확인했습니다 (따라서 총 변위는 2km입니다). 결과는 8.6 미터 이상으로 좋습니다. 최악의 위도 (이 방향과 변위량)는 81 도입니다. 북쪽으로 이동할 때 근사값이 실제로 더 정확 해지며 오류가 89.6도를 초과 할 때까지 10 미터 미만으로 유지됩니다!
whuber

60
우연히도, 111,111의이 마법 번호는 몇 가지 역사를 알면 기억하기 쉽습니다. 프랑스 인은 원래 미터를 10 ^ 7 미터가 파리 자오선을 따라 적도에서 북극까지의 거리가되도록 정의 했습니다. 따라서 10 ^ 7 / 90 = 111,111.1 미터는 2 세기 전 프랑스 측량사의 능력 내에서 위도 1도에 해당합니다.
whuber

3
따라서 수식을 사용하여 10.0 N, 10.0 E에서 y 방향으로 + 100m을 이동하려면 100/111111을 추가하면됩니까? x 방향 + 100m으로 이동하면 100 ÷ (111,111 × (cos 10))입니까? 내가이 권리를 가지고 있는지 확인하십시오.
Thomas O

5
@ 토마스 그래, 맞아. 두 번째 공식 이 적도에서 극쪽으로 이동할 때 경도의 정도가 작아지기 때문에 명백한 x 변위가 1보다 작은 수로 나눠서 어떻게 확장 되는지 주목하십시오 . 유일한 잠재적 장애는 당신과 당신의 소프트웨어 플랫폼이 "cos"의 의미에 동의하도록하는 것입니다 : cos (10)을 10 라디안이 아닌 10 도의 코사인으로 더 잘 해석했습니다 ! (그렇지 않으면 10도 = 10 * pi / 180 라디안은 간단한 변환을 나타냅니다.)이 시점에서 @haakon_d에서 제공하는 코드는 당신에게 완벽하게 이해 될 것입니다.
whuber

7
누군가 "meters"를 "km"로 대체하기 위해이 답변을 편집하려고했습니다. 그들은 아마도 유럽의 의미에서 쉼표 ","를 읽었을 것입니다. 쉼표를 사용하여 긴 자릿수 문자열을 3과 소수점 "."의 그룹으로 구분하는 미국의 규칙 (국제 출판물의 규칙이라고 생각합니다)을 따릅니다. 쉼표 대신. (이 사용법은 이전 주석에 명확하게 표시되어 있습니다.) 모호성을 피하기 위해 쉼표와 포인트가 무엇을 의미하는지 명확하게 표시하도록 답변을 편집했습니다.
whuber

56

Liedman이 그의 답변에서 Williams의 항공 공식은 귀중한 원천이며, 최대 1km의 변위에 대해 10 미터 이내의 정확도를 유지하려면 아마도 더 복잡한 것을 사용해야 할 것입니다.

그러나 약 200m 이상의 포인트 오프셋에 대해 10m 이상의 오류를 기꺼이 받아들이려면 단순화 된 평지 계산을 사용할 수 있습니다. 최대 1km의 오프셋에서 오류가 여전히 50m 미만이라고 생각합니다.

 //Position, decimal degrees
 lat = 51.0
 lon = 0.0

 //Earth’s radius, sphere
 R=6378137

 //offsets in meters
 dn = 100
 de = 100

 //Coordinate offsets in radians
 dLat = dn/R
 dLon = de/(R*Cos(Pi*lat/180))

 //OffsetPosition, decimal degrees
 latO = lat + dLat * 180/Pi
 lonO = lon + dLon * 180/Pi 

이것은 다음을 반환해야합니다.

 latO = 51,00089832
 lonO = 0,001427437

7
나는 이것이 학위 당 111,111 미터의 값을 111,319.5로 바꾼 것을 제외하고는 내가 제공 한 답변과 동일하다는 것을 지적하고 싶습니다. 위도가 높을수록 값이 약간 좋아 지지만 위도가 낮을수록 (0도에서 약 40도) 약간 나쁩니다. 어느 값이든 명시된 정확도 요구 사항을 충족합니다.
whuber

1
코드 제공에 +1 생각보다 정확합니다 (오류는 일반적으로 2000m 이상 5m 미만).
whuber

1
나는 이것이 R의 가치를 제외하고는 당신과 동일한 해결책이라는 말에 대답을 추가 해야하는지 궁금해했지만 간결함으로 인해 그것을 생략했습니다. 정밀도에 관해서는 시스템에 회전 오류를 추가하지 않는 한 옳습니다. 로컬 투영 좌표계에서 측정 된 오프셋을 사용하면 회전 오류가 상당히 커질 수 있습니다.
haakon_d

1
즉 훌륭한 점이다 : 우리는 암시 적으로 X-변위가 적어도 가까운입니다 가정 한 사실 동서과 Y 변위 남북 가깝습니다. 그렇지 않은 경우, 위도-론 등가물을 계산하기 전에 등가 EW 및 NS 변위 ( "동위"및 "노어"가 아닌)로 변환해야합니다.
whuber

항공 공식 방정식의 d 거리 매개 변수는 라디안 (예 : (거리 / 지구))입니다.
user1089933

23

나는 항공 처방집는 것을 발견 여기에 수식과 알고리즘 이러한 유형에 좋은 곳입니다. 문제가 발생하면 "lat / long given radial and distance"를 확인 하십시오 . 여기

삼각법 함수를 낮게 사용하려는 경우이 알고리즘은 사용하기에 너무 복잡 할 수 있습니다.


이것에 감사합니다-이상적으로 보입니다. 거리가 미터 또는 다른 측정인지 여부를 알 수는 없지만.
Thomas O

2

포인트를 먼저 투영하는 것이 좋습니다. 이 의사 코드와 같은 것을 만들 수 있습니다.

falt_coordinate = latlon_to_utm(original_koordinate)
new_flat_coordinate = flat_coordinate + (x,y)
result_coordinate = utm_to_latlon(new_flat_coordinate)

여기서 (x, y)는 원하는 오프셋입니다.

귀하의 지역에 적합한 평면 좌표계 인 utm을 사용할 필요는 없습니다.

어떤 소프트웨어를 사용하고 있습니까?


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