Thuật toán bù đắp vĩ độ / kinh độ bằng một số mét


108

Tôi đang tìm kiếm một thuật toán mà khi đưa ra một cặp vĩ độ và kinh độ và một bản dịch vectơ tính bằng mét theo tọa độ Cartesian (x, y) sẽ cho tôi một tọa độ mới. Sắp xếp giống như một Haversine ngược. Tôi cũng có thể làm việc với một khoảng cách và một chuyển đổi tiêu đề, nhưng điều này có thể sẽ chậm hơn và không chính xác. Lý tưởng nhất là thuật toán nên nhanh khi tôi làm việc trên một hệ thống nhúng. Độ chính xác là không quan trọng, trong vòng 10 mét sẽ tốt.


Vì vậy, bạn sẽ được mô hình tốt trái đất như một hình cầu?
underdark

1
Vâng, điều đó sẽ ổn vì tôi đang mong đợi <1km bù đắp.
Thomas O

Câu trả lời:


107

Nếu chuyển vị của bạn không quá lớn (dưới vài km) và bạn không ở ngay cực, hãy sử dụng ước tính nhanh và bẩn rằng 111.111 mét (111.111 km) theo hướng y là 1 độ (vĩ độ) và 111.111 * cos (vĩ độ) mét theo hướng x là 1 độ (kinh độ).


3
@Thomas: Thật ra, bạn có thể rất gần với cực. Tôi đã kiểm tra tính toán UTM bằng các chuyển vị x và y bằng nhau là 1400 m (vì vậy tổng dịch chuyển là 2 km). Kết quả tốt đến 8,6 mét hoặc tốt hơn. Vĩ độ tồi tệ nhất (đối với hướng này và lượng dịch chuyển) là 81 độ: phép tính gần đúng thực sự chính xác hơn khi bạn di chuyển về phía bắc và sai số của nó ở dưới 10 mét cho đến khi bạn vượt quá 89,6 độ!
whuber

60
Ngẫu nhiên, những con số ma thuật 111.111 này rất dễ nhớ bằng cách biết một số lịch sử: người Pháp ban đầu xác định mét để 10 ^ 7 mét sẽ là khoảng cách dọc theo kinh tuyến Paris từ xích đạo đến cực bắc. Do đó, 10 ^ 7/90 = 111.111,1 mét tương đương với một độ vĩ độ trong khả năng của các nhà khảo sát Pháp hai thế kỷ trước.
whuber

3
Vậy với công thức nếu tôi muốn di chuyển + 100m theo hướng y từ 10.0 N, 10.0 E, tôi có thể thêm 100/111111 không? Nếu di chuyển theo hướng x + 100m, nó sẽ là 100 (111.111 × (cos 10))? Chỉ cần chắc chắn rằng tôi đã làm đúng.
Thomas O

5
@Thomas Vâng, đúng vậy. Lưu ý cách công thức thứ hai mở rộng độ dịch chuyển x rõ ràng (nhờ cách chia cho một số nhỏ hơn 1), bởi vì mức độ kinh độ sẽ nhỏ hơn khi bạn di chuyển về phía cực từ xích đạo. Khó khăn tiềm năng duy nhất là đảm bảo rằng bạn và nền tảng phần mềm của bạn đồng ý về "cos" nghĩa là gì: nó đã diễn giải tốt hơn cos (10) là cosin 10 độ chứ không phải 10 radian! (Nếu không, 10 độ = 10 * pi / 180 radian minh họa cho việc chuyển đổi đơn giản.) Tại thời điểm này, mã được cung cấp bởi @haakon_d sẽ hoàn toàn có ý nghĩa với bạn.
whuber

7
Ai đó đã cố gắng chỉnh sửa câu trả lời này để thay thế "mét" bằng "km." Có lẽ họ đang đọc dấu phẩy "," theo nghĩa châu Âu của một dấu thập phân. Tôi cũng tuân theo quy ước của Mỹ (mà tôi tin là quy ước của các ấn phẩm quốc tế) về việc sử dụng dấu phẩy để tách các chuỗi chữ số dài thành các nhóm ba và một dấu thập phân "." thay vì dấu phẩy. (Cách sử dụng này được hiển thị rõ ràng trong các bình luận trước.) Để tránh bất kỳ sự mơ hồ nào, tôi đã chỉnh sửa câu trả lời để hiển thị rõ ràng dấu phẩy và điểm có nghĩa là gì.
whuber

56

Như Liedman nói trong câu trả lời của mình, các công thức hàng không của Williams là một nguồn vô giá, và để giữ độ chính xác trong phạm vi 10 mét cho các chuyển vị lên tới 1 km, bạn có thể cần phải sử dụng những thứ phức tạp hơn.

Nhưng nếu bạn sẵn sàng chấp nhận sai số trên 10m cho điểm bù hơn 200m, bạn có thể sử dụng phép tính phẳng đơn giản. Tôi nghĩ rằng các lỗi vẫn sẽ dưới 50m cho các khoảng cách lên tới 1km.

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

Điều này sẽ trở lại:

 latO = 51,00089832
 lonO = 0,001427437

7
Tôi chỉ muốn chỉ ra rằng điều này giống hệt với câu trả lời tôi đã cung cấp ngoại trừ bạn đã thay thế giá trị của tôi là 111.111 mét mỗi độ bằng 111.319,5. Giá trị của bạn tốt hơn một chút ở vĩ độ cao nhưng kém hơn một chút ở vĩ độ thấp (từ 0 đến khoảng 40 độ). Giá trị đáp ứng các yêu cầu chính xác đã nêu.
whuber

1
+1 để cung cấp mã. Lưu ý rằng nó chính xác hơn bạn nghi ngờ (lỗi thường nhỏ hơn 5 m trên 2000 m).
whuber

1
Tôi tự hỏi liệu tôi có nên thêm một nhận xét trong câu trả lời của mình rằng đây là một giải pháp giống hệt với bạn ngoại trừ giá trị của R, nhưng bỏ qua nó do sự ngắn gọn. Khi nói đến độ chính xác, bạn đúng miễn là bạn không thêm bất kỳ lỗi xoay nào vào hệ thống. Sử dụng các độ lệch được đo trong hệ tọa độ dự kiến ​​cục bộ, các lỗi quay có thể tăng lên khá lớn.
haakon_d

1
Đó là một điểm tuyệt vời: chúng tôi đã ngầm giả định rằng dịch chuyển x ít nhất là gần với đông-tây thực sự và dịch chuyển y gần với bắc-nam. Nếu không, chúng phải được chuyển đổi thành các chuyển vị EW và NS tương đương (không chỉ là "hướng đông" và "hướng bắc") trước khi tính toán các tương đương lat-lon của chúng.
whuber

Tham số khoảng cách d của các phương trình Công thức Hàng không được tính bằng radian, ví dụ (khoảng cách / bán kính trái đất).
1089933

23

Tôi thấy rằng Công thức hàng không, ở đây là tuyệt vời cho các loại công thức và thuật toán. Đối với vấn đề của bạn, hãy xem "lat / long radial and distance": tại đây

Lưu ý rằng thuật toán này có thể hơi phức tạp đối với việc sử dụng của bạn, nếu bạn muốn tiếp tục sử dụng các hàm lượng giác thấp, v.v.


Cảm ơn vì điều này - có vẻ lý tưởng. Mặc dù tôi không thể tìm ra nếu khoảng cách tính bằng mét hoặc một số phép đo khác.
Thomas O

2

Nó có thể có ý nghĩa để chiếu điểm đầu tiên. Bạn có thể tạo một cái gì đó giống như mã giả này:

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

trong đó (x, y) là phần bù mong muốn.

Bạn không cần phải sử dụng utm, bất kỳ hệ tọa độ phẳng nào, điều đó có ý nghĩa trong khu vực của bạn sẽ làm.

Bạn đang làm việc với phần mềm nào?


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.