3 điểm bởi GN⁺ 2023-08-28 | 1 bình luận | Chia sẻ qua WhatsApp
  • Khi cộng lượng dịch chuyển x,y theo mét vào tọa độ vĩ độ/kinh độ, nếu khoảng cách di chuyển từ vài km trở xuống và không ở gần các cực, có thể tính nhanh chỉ bằng công thức xấp xỉ đơn giản
  • Cách tính cơ bản xem 111.111 m theo hướng y là 1 độ vĩ độ, và 111111 * cos(latitude) m theo hướng x là 1 độ kinh độ; di chuyển 100 m về phía bắc thì cộng thêm 100 / 111111 độ
  • Cũng có thể diễn đạt cùng ý tưởng bằng cách coi Trái Đất là hình cầu có bán kính R=6378137 và tính dLat=dn/R, dLon=de/(R*cos(lat)); ở vĩ độ 51 độ, nếu dn=100, de=100 thì nhận được latO=51.00089832, lonO=0.001427437
  • Nếu yêu cầu độ chính xác trong vòng 10 m và offset tới 1 km, có thể dùng các công thức phức tạp hơn như Aviation Formulary, nhưng xấp xỉ mặt phẳng đơn giản cũng được dự đoán có sai số dưới 50 m với offset 1 km
  • Nếu cần xử lý cả hiệu ứng độ dài 1 độ thay đổi theo vĩ độ, nên dùng công thức meters per degree, hoặc chuyển sang hệ tọa độ chiếu cục bộ, cộng lượng dịch chuyển rồi chuyển ngược lại về vĩ độ/kinh độ sẽ an toàn hơn

Với dịch chuyển khoảng cách nhỏ, xấp xỉ 111.111 m/độ là đủ

  • Với lượng dịch chuyển nhỏ, có thể tính độ thay đổi vĩ độ/kinh độ bằng xấp xỉ sau
    • 111.111 m theo hướng y ≈ 1 độ vĩ độ
    • 111111 * cos(latitude) m theo hướng x ≈ 1 độ kinh độ
  • Tọa độ mới được tính đại khái như sau
    • lat_new = lat + dy / 111111
    • lon_new = lon + dx / (111111 * cos(latitude))
  • Với cos(latitude), cần đưa vào đơn vị phù hợp với môi trường thực thi
    • Trong môi trường cần radian, phải chuyển đổi latitude * pi / 180
  • Xấp xỉ này phù hợp khi lượng dịch chuyển không quá lớn, không ở ngay gần cực và yêu cầu độ chính xác không quá cao

Cơ sở của con số 111.111 m và phạm vi sai số

  • Giá trị 111.111 có liên quan đến định nghĩa lịch sử của mét
    • Vì ban đầu Pháp định nghĩa mét là 1/10^7 của khoảng cách đo dọc theo kinh tuyến Paris từ xích đạo đến Bắc Cực
    • 10^7 / 90 = 111.111,1 m tương ứng với 1 độ vĩ độ
  • Trong phần kiểm chứng ở bình luận, khi so sánh kết quả với tính toán UTM cho x,y mỗi hướng 1.400 m, tổng dịch chuyển 2 km, kết quả khớp với sai số không quá 8,6 m
    • Vĩ độ tệ nhất trong điều kiện đó là 81 độ
    • Sai số được giữ dưới 10 m cho đến quá 89,6 độ
  • Công thức đơn giản phản ánh hiệu ứng kinh độ hẹp dần khi tiến về vùng cực bằng cos(latitude)
    • Vì khoảng cách thực tế của 1 độ kinh độ giảm xuống, cùng một dịch chuyển theo mét hướng x sẽ được chuyển đổi thành thay đổi kinh độ lớn hơn ở vĩ độ cao

Cùng phép tính dùng bán kính Trái Đất

  • Cùng phép tính cũng có thể được biểu diễn bằng công thức dựa trên bán kính Trái Đất
//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
  • Ví dụ này trả về kết quả sau
latO = 51,00089832
lonO = 0,001427437
  • Cách này gần như là cùng một lời giải với xấp xỉ 111.111 m/độ, khác ở chỗ dùng giá trị dựa trên bán kính gần với 111.319,5 m
  • Dịch chuyển x nên gần với hướng đông-tây thật, dịch chuyển y nên gần với hướng bắc-nam
    • Nếu easting/northing của hệ tọa độ chiếu cục bộ bị xoay, trước tiên phải chuyển đổi thành các thành phần đông-tây và bắc-nam

Các lựa chọn khi cần độ chính xác cao hơn

  • Công thức “lat/long given radial and distance” của Aviation Formulary có thể dùng để tính vĩ độ/kinh độ mới từ khoảng cách và góc phương vị
    • Có thể hơi phức tạp đối với môi trường nhúng muốn giảm dùng hàm lượng giác
    • Tham số khoảng cách được xử lý dưới dạng giá trị radian theo dạng distance / earth radius
  • Cũng có thể chiếu sang hệ tọa độ phẳng phù hợp với khu vực rồi cộng offset
flat_coordinate = latlon_to_utm(original_coordinate)
new_flat_coordinate = flat_coordinate + (x,y)
result_coordinate = utm_to_latlon(new_flat_coordinate)
  • Cách này không nhất thiết chỉ dùng UTM; có thể dùng bất kỳ hệ tọa độ phẳng nào phù hợp với khu vực đó
  • Tuy nhiên, nếu sau khi dịch chuyển ở ranh giới zone UTM mà chuyển sang zone UTM khác, sẽ khó áp dụng nguyên trạng

Ví dụ triển khai theo ngôn ngữ và công thức chính xác theo từng vĩ độ

  • Ví dụ Python đóng gói nguyên xấp xỉ 111.111 m/độ thành hàm
from math import cos, radians

def meters_to_lat_lon_displacement(m, origin_latitude):
    lat = m / 111111
    lon = m / (111111 * cos(radians(origin_latitude)))
    return lat, lon
  • Ví dụ R cũng thực hiện cùng phép tính
deg2rad = function(deg) {(deg * pi) / (180)}

meters_to_lat_lon_displacement = function(m, origin_latitude){
  lat = m / 111111
  lon = m / (111111 * cos((deg2rad(origin_latitude))))
  return(list(lat=lat,lon=lon))
}
  • Công thức meters per degree chính xác hơn theo từng vĩ độ có thể viết như sau
meters_per_degree_lat = (111132.92 - 559.82 * np.cos(2 * lat0_rad) +
                             1.175 * np.cos(4 * lat0_rad) - 0.0023 * np.cos(6 * lat0_rad))

meters_per_degree_lon = (111412.84 * np.cos(lat0_rad) -
                            93.5 * np.cos(3 * lat0_rad) + 0.118 * np.cos(5 * lat0_rad))
  • Công thức chính xác này phản ánh việc độ dài của 1 độ vĩ độ và 1 độ kinh độ liên tục thay đổi theo vĩ độ
  • Ví dụ Swift sử dụng cách tính bán kính Trái Đất theo vĩ độ, rồi tính CLLocationCoordinate2D mới từ khoảng cách và góc phương vị

1 bình luận

 
GN⁺ 2023-08-28
Các ý kiến trên Hacker News
  • Mét được định nghĩa lại vào năm 1791 là một phần mười triệu của một phần tư kinh tuyến đi qua Paris, tức độ dài cung 90 độ
    Vì vậy 1° ≡ 1/90 × 10^7 m = 111.111,111... m, và chu vi Trái Đất cũng xấp xỉ 40 triệu m, tức 40.000 km
    Định nghĩa ban đầu của mét là con lắc giây, tức chiều dài của con lắc có chu kỳ 2 giây; nếu thay T = 2, L = 1 vào T ≈ 2π√(L/g) thì được 1 = π√(1/g), 1 = π²/g
    Vì thế việc g gần bằng π² cũng không hoàn toàn là ngẫu nhiên, và việc 1 cm³ nước bằng 1 g cũng là vì điều đó từng là định nghĩa của gram trong một thời gian dài

    • Giây là đơn vị có trước việc định nghĩa lại mét, và vì nó xuất phát từ việc chia một ngày theo cách “đẹp mắt”, nên có vẻ vẫn còn một chút ngẫu nhiên
      Khi mét được định nghĩa bằng con lắc giây, nó bị ràng buộc hoàn toàn vào định nghĩa của giây và giá trị g; viết thành công thức thì 1 m = 1 s² × g / π²
      g ≈ π² xuất hiện một cách tự nhiên, nhưng việc chu vi Trái Đất đủ gần 40.000 km để có thể định nghĩa lại mét theo lũy thừa của 10 mà không thay đổi quá lớn thì có vẻ là ngẫu nhiên
      https://en.wikipedia.org/wiki/Second#Fraction_of_solar_day
    • Có thể biểu diễn vĩ độ hoặc kinh độ với độ chính xác khoảng 1 cm chỉ bằng một số nguyên 32-bit :D
    • Mét thực ra cũng gần tương đương 3 foot Paris, khoảng 0,97 m
      3 foot Anh chỉ khoảng 0,91 m
      Người thời đó không phải đã suy ra một đơn vị độ dài nguyên tắc nhất hay đẹp đẽ ở tầm vũ trụ trong chân không, mà gần như chỉ đang cố định nghĩa đơn vị vốn đã dùng theo một cách khác với “độ dài của cây thước đằng kia”
    • Tôi nghĩ sẽ hay nếu hệ tọa độ GPS đơn giản dùng kilomet
      Dùng 40.000 km thay vì 360 độ, còn tính toán thực tế thì dùng khoảng cách thực, trong khi giá trị xấp xỉ vẫn đủ gần
      Như vậy, ít nhất với người dùng hệ mét, sẽ không cần phép chuyển đổi sang khoảng cách nữa
      Vấn đề của đơn vị độ là khó đổi sang khoảng cách hữu ích; mẹo kiểu này có giúp, nhưng ngay từ đầu không phải chuyển đổi vẫn tốt hơn
    • Pháp cũng đã áp dụng thập phân hóa cho góc, nên thực ra 1 gon = 100 km và 1 km chỉ là 1 centigon
  • 1 hải lý, khoảng 6076 ft, tương ứng chính xác với 1 phút cung trên xích đạo Trái Đất
    Từ góc nhìn hàng hải, tôi ước mọi mile đều là hải lý
    Hải lý có ý nghĩa thực sự, còn 5280 ft thì rốt cuộc có ý nghĩa gì?

    • Lý do một mile là 5280 ft là vì đó là độ dài của 80 chain
      Độ dài chain là sản phẩm phụ của luật thuế đất ở Anh, nơi đánh thuế theo đơn vị acre
      Mile La Mã là 1000 bước đôi, tức 5000 ft, nên cái đó còn hợp lý hơn một chút
      https://en.wikipedia.org/wiki/Gunter%27s_chain
    • Hầu hết các “mile” khác bắt nguồn từ mile La Mã, và phát triển phần nào độc lập với các đơn vị Anh như foot, yard, inch, barleycorn, nên hệ số chuyển đổi trở nên kỳ lạ
      Mile La Mã ban đầu bằng 5000 foot La Mã
      Thực tế 1 nmi ≡ 1,852 km được định nghĩa chính xác như vậy
      Từ định nghĩa ban đầu của mét cũng ra 1/60 × 1/90 × 10^7 = 1851,85185185... m
      Đặc trưng cốt lõi của SI và các tiền thân của nó là MKS, CGS là ngay từ đầu đã có khả năng chuyển đổi giữa các đơn vị, nên có các quan hệ như 1 m ≡ 1 s ≡ 1 kg ≡ 1 N ≡ 1 Pa ≡ 1 J ≡ 1 A ≡ 1 C ≡ 1 V ≡ 1 Ω ≡ 1 F ≡ 1 W ≡ 1 Wb ≡ 1 T ≡ 1 H ≡ 1 Hz
      Ở đây ≡ không được dùng theo nghĩa tương đương nghiêm ngặt, mà là chỉ lỏng lẻo hệ số chuyển đổi
      Những thứ gần như ngoại lệ trong SI là kelvin, mole, candela và các đơn vị dẫn xuất của chúng; hai đơn vị đầu có thể xử lý gọn gàng bằng hằng số Boltzmann và hằng số Avogadro
      Cá nhân tôi không hài lòng với việc candela nằm trong SI
    • Thú vị là mile ban đầu là 5000 ft, ít kỳ lạ hơn
      Nhưng vào thập niên 1500, Anh đã đổi mile thành 8 furlong để việc tính toán đo đạc nông nghiệp thời đó dễ hơn nhiều
      https://en.m.wikipedia.org/wiki/Furlong
    • Giá mà người thời Trung cổ định nghĩa mile là 5040 ft thì hay, vì khi đó nó chia hết cho 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 28, 30, 35, 36, 40, 42, 45, 48, 56, 60, 63, 70, 72, 80, 84, 90, 105, 112, 120, 126, 140, 144, 168, 180, 210, 240, 252, 280, 315, 336, 360, 420, 504, 560, 630, 720, 840, 1008, 1260, 1680, 2520
    • Tôi thắc mắc thực sự trong câu “hải lý có ý nghĩa thực sự” nghĩa là gì
      Nghe giống kiểu lập luận rằng đơn vị truyền thống tốt hơn vì không thể chia 10 cho 3 chỉ bằng số nguyên
      Có vẻ như nếu chia đường tròn thành 360 cung thì một cung như vậy được xem là có ý nghĩa nào đó tại một điểm cách tiêu điểm một khoảng nhất định
      Nhưng xét việc khoảng 2000 năm trước người Hy Lạp đã tiếp nhận cách dùng 360 của Babylon, và người Babylon cũng đạt tới con số đó bằng cách tinh chỉnh phép đo xấp xỉ số ngày trong một năm từng được dùng trong thiên văn học suốt 2000 năm trước đó, thì ý nghĩa của hải lý có lẽ mang tính phái sinh và ngẫu nhiên hơn là “thực sự”
      Hơn nữa, nếu tính cả việc Trái Đất là một hình phỏng cầu dẹt, độ dài của hải lý còn thay đổi theo vị trí
  • Tôi đã sống ở Mỹ hơn 10 năm nhưng vẫn chưa quen với hệ đo lường Anh-Mỹ, và chắc sau này cũng vậy
    Nó hoàn toàn vô lý
    Hệ mét giống như vàng ròng: 1cm = 10mm, 1m = 100cm, 1km = 1000m, 1kg = 1000g, 1ton = 1000kg
    Còn hệ Anh-Mỹ thì kiểu “chờ chút” rồi 1in = ???, 1ft = 12in, 1yd = 3ft, 1mile = 5280ft, 1lb = 16oz
    Thật không biết ai đã tạo ra sự điên rồ này

    • Điều tôi nhận ra khi sống ở Mỹ là hầu hết người Mỹ không chuyển đổi giữa các đơn vị nếu không thật sự cần
      Vì vậy vấn đề không lộ ra thường xuyên như tưởng tượng
      Ngay cả khi tình cờ gặp cách ghi theo hệ mét, họ cũng rõ ràng là không đổi đơn vị
      Ví dụ viết 1000mL thay vì 1L, hay 3500g thay vì 3.5kg
      Người châu Âu có thể nói “phía này 600m, phía kia 1.2km”, nhưng người Mỹ hầu như không nói “phía này 800 yard, phía kia 1 dặm”
      Người châu Âu có thể nói “phải mang 4L nước nên túi nặng thêm 4kg”
      Người Mỹ có thể nói “chai của tôi là 24 ounce chất lỏng, nên chắc khoảng 24 ounce trọng lượng”, nhưng nếu là gallon thì nhiều khả năng họ chỉ nói nó nặng cỡ một gallon
      Rốt cuộc vấn đề đổi đơn vị ít nghiêm trọng hơn tôi tưởng, vì người Mỹ không đi đâu cũng chuyển đổi đơn vị trong từng câu nói
    • Tôi nghĩ ngay cả trong số những người lớn lên ở Mỹ cũng có khá nhiều người không hiểu hoàn toàn hệ này
      Tôi sẽ ngạc nhiên nếu hơn 50% dân số biết một cốc nước có bao nhiêu ounce, hay 1 dặm bằng bao nhiêu foot
      Dù vậy, may là ở Mỹ giới khoa học vẫn dùng hệ mét làm chuẩn
    • Có vài đơn vị trung gian đã bị bỏ qua, biết chúng thì mọi thứ có thể giải thích được phần nào
      Chain xuất phát từ dụng cụ đo đạc, bằng 22 yard
      Một chain cũng bằng 4 rod, nên một rod là 5½ yard, khá kỳ lạ
      10 chain là một furlong, và 8 furlong là 1 dặm
      Nhân tiện, acre là 1 furlong × 1 chain
      Trông như điên rồ, nhưng bên trong vẫn có một hệ thống riêng
    • Rốt cuộc phải đổi inch sang cái gì?
      Tại sao lại có lúc cần đổi inch sang dặm?
      Trong đời không có việc gì cần đổi inch, hoặc foot và inch, sang dặm cả
    • Đổi đơn vị đã bất tiện, nhưng tôi nghĩ tệ nhất thật sự là cách ghi độ dài bằng phân số
      Trong nghề mộc hay thủ công thì xét về nguồn gốc có thể còn hợp lý, nhưng với các mục đích khác thì sao?
      Hãy thử đọc 2 3/16" trên thước Anh-Mỹ nhanh như đọc 5.6cm xem
      Kích cỡ ốc vít cũng bị ảnh hưởng bởi điều này
  • Quãng đường ánh sáng đi trong 1 nano giây cũng xấp xỉ 1 foot

    • Gần với thực tế đến mức đáng ngạc nhiên
      Ấn tượng thật :)
      Kết quả của $ units c ft/ns* 0.98357106
    • Quãng đường âm thanh đi trong 1 mili giây cũng xấp xỉ 1 foot
    • Nếu đổi cách đo thời gian và định nghĩa 1 chrono = thời gian ánh sáng đi được 1e9 m thì có vẻ rất hay
      1 kilochrono là 55 phút, khá hữu dụng trong những tình huống như du hành vũ trụ, nơi không thể phụ thuộc vào đơn vị dựa trên ngày Mặt Trời
    • Số giây trong 1 năm cũng đủ gần với π*10^7
    • 1 googol femtobarns cũng xấp xỉ 1 square teraparsecs
  • Nếu Trái Đất là hình phỏng cầu dẹt thì độ dài cung thực tế của 1 độ vĩ tuyến chẳng phải sẽ thay đổi sao?
    Tôi thắc mắc “đáng tin cậy” có phải chỉ nghĩa là “đủ gần để dùng được” không
    Có lẽ tôi đã làm những việc không liên quan đến địa lý quá lâu nên quên mất điều từng biết

    • Đáng tin cậy nghĩa là đủ gần để dùng được, và ở những khu vực có đông dân cư thì ước tính cũng khá chính xác
      Trường hợp sử dụng khiến tôi biết điều này cũng được tôi viết phần nào ở đây: https://twitter.com/mholt6/status/1695685022710477043
      Ngay cả nếu trong trường hợp của tôi có sai số vài km, thì nhiều khả năng đó không phải gần vùng cực; còn nếu đúng là vùng cực thì chỉ cần coi như “ừ, hiểu rồi, bạn đang ở cực” là được
    • Đường kính xích đạo của Trái Đất lớn hơn đường kính cực 43 km
      Quỹ đạo Trái Đất cũng tương tự
      Ở trường ta học rằng đó là hình elip, nhưng hầu như không có cảm giác đúng về hình dạng thực tế, và phần lớn hình minh họa gây ấn tượng hoàn toàn sai
    • Chỉ nhìn tiêu đề bài viết có thể nghĩ độ dài của 1 độ vĩ tuyến thay đổi chưa đến 1 decimet, nhưng dĩ nhiên không phải vậy
      Dù thế, với nhiều mục đích thực tế thì vẫn đủ gần
  • Bài viết này cũng có một quy tắc kinh nghiệm hay rằng 111,111 * cos(latitude) m là 1 độ kinh tuyến
    Tôi thích phần hiệu chỉnh này
    Thực tế cũng có thể dùng các hằng số đơn giản: 25° xấp xỉ 100,000m, 44° xấp xỉ 80,000m, 57° xấp xỉ 60,000m