Công thức Haversine là gì?
Công thức haversine tính khoảng cách ngắn nhất giữa hai điểm trên bề mặt một mặt cầu — ở đây là Trái Đất — khi biết vĩ độ và kinh độ. Nó trả về khoảng cách cung lớn (đường orthodrome): độ dài đường cong ngắn nhất nối hai điểm và nằm hoàn toàn trên mặt cầu.
Đây là công thức mà điều hướng GPS, lập đường bay, ứng dụng gọi xe, tối ưu giao hàng, lớp phủ radar thời tiết, và hầu hết mọi API bản đồ dựa vào mỗi khi cần trả lời nhanh «hai điểm này cách nhau bao xa?». Nó tính đến độ cong của Trái Đất, nên vẫn chính xác cả với khoảng cách liên lục địa, nơi coi hành tinh là phẳng sẽ sai vài trăm km.
Công thức được suy ra từ định lý haversine trong lượng giác cầu. Hàm haversine định nghĩa là:
hav(θ) = sin²(θ/2) = (1 − cos(θ))/2
Các tính chất và ứng dụng then chốt của công thức haversine:
- Hình học cầu: làm việc trên mặt cong của Trái Đất, không phải bản đồ phẳng làm biến dạng khoảng cách
- Điều hướng: thiết yếu cho lộ trình bay, hàng hải, lập kế hoạch drone, dẫn đường GPS
- Độ chính xác: kết quả sai khác dưới 0,5 % so với mô hình cầu — đủ tốt cho hầu hết ứng dụng phổ thông
- Số học ổn định: dạng sin² nửa góc tránh được mất độ chính xác mà công thức «định lý cosin cầu» tương đương mắc phải khi khoảng cách nhỏ
- Phạm vi phổ quát: dùng được cho bất kỳ hai điểm nào trên Trái Đất, kể cả cặp đối xứng tâm (hai phía đối diện hành tinh)
Các ứng dụng hiện đại gồm khớp tài xế/khách trong app gọi xe, ước lượng thời gian giao hàng, quảng cáo siêu địa phương, dự báo thời tiết, và mọi hệ thống cần xác định độ gần hoặc khoảng cách giữa các vị trí địa lý.
Công thức Haversine hoạt động thế nào?
Công thức haversine tính khoảng cách cung lớn giữa hai điểm trên mặt cầu từ vĩ độ và kinh độ của chúng. Nó dùng sin, cos và arcsin, và giả định mặt cầu có bán kính đã biết — thường là bán kính trung bình của Trái Đất, 6.371 km.
Công thức haversine đầy đủ:
d = 2r · arcsin(√(sin²(Δφ/2) + cos(φ₁) · cos(φ₂) · sin²(Δλ/2)))
Trong đó:
- d = khoảng cách cung lớn giữa hai điểm
- r = bán kính Trái Đất (khoảng 6.371 km hoặc 3.959 dặm)
- φ₁, φ₂ = vĩ độ điểm 1 và 2 (theo radian)
- Δφ = φ₂ − φ₁ (chênh lệch vĩ độ)
- Δλ = λ₂ − λ₁ (chênh lệch kinh độ)
- λ₁, λ₂ = kinh độ điểm 1 và 2 (theo radian)
Công thức hoạt động bằng cách:
- Chuyển vĩ độ và kinh độ từ độ sang radian (nhân với π/180)
- Tính haversine nửa góc của chênh lệch vĩ độ và kinh độ
- Kết hợp với cos(φ₁)·cos(φ₂) để chiếu lên mặt cầu
- Lấy haversine nghịch (arcsin của căn bậc hai) để khôi phục góc trung tâm theo radian
- Nhân góc trung tâm với bán kính để có khoảng cách thực dọc theo bề mặt
Vì phép tính dùng sin nửa góc thay vì cosin của góc đầy đủ, nó vẫn ổn định về số học ngay cả khi hai điểm rất gần nhau — tính chất mà công thức cosin cầu cũ kỹ không có.
Ví dụ khoảng cách Haversine thường gặp
Vài khoảng cách cung lớn điển hình tính theo công thức haversine:
- New York đến Los Angeles: ~3.944 km (2.451 dặm)
- London đến Tokyo: ~9.560 km (5.940 dặm) — và chuyến bay thực tế đi theo đường gần cực sát với đường trắc địa này
- Sydney đến Melbourne: ~713 km (443 dặm)
- Paris đến Roma: ~1.103 km (685 dặm)
- Hà Nội đến TP. Hồ Chí Minh: ~1.137 km (706 dặm)
Câu hỏi thường gặp
Vì Trái Đất tròn, không phẳng. Khoảng cách Pythagoras √((Δx)² + (Δy)²) chỉ đúng trên mặt phẳng, nơi tọa độ độc lập với vị trí. Vĩ độ và kinh độ là góc trên một mặt cầu, nên chênh lệch 1° kinh độ ở xích đạo ứng với ~111 km mặt đất thật, nhưng chỉ ~78 km ở vĩ độ 45° và ~0 km ở cực. Nếu coi lat/lon là tọa độ (x, y) thường và áp Pythagoras, bạn sẽ sai rất nhiều khi xa xích đạo. Với khoảng cách rất nhỏ (vài km trong một quốc gia), xấp xỉ hình chữ nhật d ≈ r·√(Δφ² + (cos(φ_TB)·Δλ)²) đủ tốt; nhưng với khoảng cách liên lục địa, bạn cần haversine hoặc công thức elipsoid đầy đủ kiểu Vincenty. Haversine xử lý độ cong đúng cách: nó tính độ dài cung giữa hai điểm trên bề mặt một mặt cầu, chính là quãng đường thực bạn sẽ đi (hoặc bay) trên một Trái Đất tròn hoàn hảo. Không có nó, app bản đồ sẽ bảo bạn rằng London gần Sydney qua Singapore hơn là qua Hong Kong, trong khi thực tế ngược lại.
Haversine giả định Trái Đất là một mặt cầu hoàn hảo bán kính 6.371 km. Trái Đất thật là một elipsoid dẹt — rộng hơn ở xích đạo (6.378 km) so với hai cực (6.357 km) — nên công thức lệch tới ~0,5 % trong trường hợp xấu nhất. Với chuyến bay 10.000 km, đó là khoảng 50 km sai số, đủ lớn để có ý nghĩa với phi công dùng hải đồ giấy, nhưng vô hình với tài xế Uber đi qua thành phố. Với các tác vụ cần độ chính xác cao hơn — trắc địa, đo đạc, dẫn đường tên lửa, theo dõi mảng kiến tạo — kỹ sư dùng các công thức Vincenty, coi Trái Đất là elipsoid và hội tụ tới độ chính xác cỡ centimét. Cho ứng dụng hằng ngày (khoảng cách giao hàng, ghép xe, mạng xã hội «người gần đây») haversine quá đủ. Một nguồn sai số khác là việc chọn bán kính: 6.371 km là bán kính trung bình (mặt cầu cùng thể tích); nếu bạn đang ở gần xích đạo, dùng 6.378 km cho kết quả tốt hơn chút, gần cực thì 6.357 km. Đa số mã chỉ dùng 6.371 km vì chênh lệch nằm hoàn toàn trong sai số nội tại của haversine.
Cung lớn là bất kỳ đường tròn nào trên mặt cầu có tâm trùng với tâm cầu — đường xích đạo là một, mỗi cặp kinh tuyến đối xứng là một, và đường trắc địa duy nhất giữa bất kỳ hai điểm không đối xứng tâm đều nằm trên đúng một cung lớn. Khoảng cách cung lớn, thứ haversine tính, là đường đi ngắn nhất giữa hai điểm trên mặt cầu. Một đường rumb (loxodrome) là đường cắt mọi kinh tuyến với cùng một góc không đổi — «hướng la bàn cố định». Đường rumb nhìn thẳng trên bản đồ Mercator, vì thế thủy thủ xưa rất ưa chúng: «đi hướng đông-bắc» dễ làm theo mà không cần liên tục hiệu chỉnh. Nhưng đường rumb dài hơn cung lớn, đôi khi rất dài. New York–Tokyo theo rumb khoảng 11.500 km; theo cung lớn 10.800 km. Máy bay hiện đại bay cung lớn dù phải liên tục điều chỉnh hướng. Haversine trả về khoảng cách cung lớn; nếu muốn khoảng cách rumb, bạn dùng một công thức khác dựa trên hiệu Mercator được chiếu.
Vì ĐÓ chính là đường ngắn nhất trên mặt cầu. New York ở khoảng 40° N, Tokyo ở 35° N — cả hai đều thuộc Bắc bán cầu. Nếu kẻ đường thẳng giữa chúng trên quả địa cầu, nó quét lên phía bắc qua Alaska, đôi khi qua Nga, không bao giờ qua Thái Bình Dương trung tâm. Phép chiếu Mercator — phép chiếu mà gần như mọi bản đồ tường đều dùng — biến dạng cực mạnh vùng cực: Greenland trông to hơn châu Phi dù nhỏ hơn 14 lần. Vì thế đường «thẳng» trên Mercator (đường rumb) cong xuống và sang đông, ôm sát Thái Bình Dương. Trắc địa thật, mà công thức haversine biểu diễn, lại cong qua cực. Cũng vì thế các tuyến bay liên lục địa nhìn cong kỳ lạ trên bản đồ phẳng nhưng thẳng trên quả địa cầu. Logic tương tự áp dụng cho Sydney–Santiago (qua Nam Cực), Johannesburg–Sydney (qua đại dương Nam Cực), London–Auckland (qua Bắc Cực). Công thức haversine không cho đường đi, chỉ cho khoảng cách, nhưng khoảng cách đó chỉ có nghĩa trong bối cảnh đường cung lớn ấy.
Quy ước chuẩn là 6.371.000 m (6.371 km, hay 3.959 dặm thường, hay 3.440 hải lý). Đây là bán kính trung bình thể tích — bán kính của hình cầu có cùng thể tích với Trái Đất. Có ba giá trị chính xác hơn: bán kính xích đạo (6.378,137 km, dùng trong datum WGS84), bán kính cực (6.356,752 km) và bán kính trung bình (6.371,009 km, trung bình địa lý). Chênh lệch nhỏ (~0,3 % đỉnh-đỉnh) nhưng quan trọng khi đối chiếu với dữ liệu tham chiếu. Phi công và hoa tiêu thường dùng 6.371 km và chấp nhận sai số nhỏ; khảo sát trắc địa dùng elipsoid WGS84. Với dặm, công thức haversine không đổi — chỉ cần thay r = 3.959 (dặm thường) hoặc r = 3.440 (hải lý) thì kết quả ra ngay đơn vị đó. Lựa chọn đơn giản và phổ biến nhất là r = 6.371.008,8 m (bán kính trung bình IUGG), và gần như mọi triển khai haversine trên Internet đều hard-code giá trị này hoặc 6.371 km đã làm tròn.
Haversine cho khoảng cách; phương vị là phép tính riêng. Phương vị ban đầu từ điểm 1 (φ₁, λ₁) tới điểm 2 (φ₂, λ₂) là θ = atan2(sin(Δλ)·cos(φ₂), cos(φ₁)·sin(φ₂) − sin(φ₁)·cos(φ₂)·cos(Δλ)), theo radian. Đổi sang độ rồi chuẩn hóa về [0, 360) bằng cách cộng 360 và lấy modulo. Kết quả là hướng la bàn bạn sẽ bắt đầu đi — 0° = bắc, 90° = đông, 180° = nam, 270° = tây. Trên đường cung lớn, phương vị thực tế thay đổi liên tục dọc đường (vì thế bản đồ trên máy bay cho thấy hướng từ từ trôi), nên công thức cho phương vị ban đầu ở điểm 1. Với phương vị cuối khi tới điểm 2, đổi chỗ hai điểm, tính phương vị ban đầu, rồi cộng 180° modulo 360°. Dùng atan2, không phải atan(y/x) — phiên bản 4 góc phần tư xử lý đúng mọi tổ hợp dấu. Công thức này cùng haversine là cặp chủ lực của hầu hết thư viện địa lý: PostGIS, Turf.js, geopy, GeoTools.
JavaScript: function haversine(lat1, lon1, lat2, lon2) { const R = 6371; const toRad = d => d * Math.PI / 180; const dLat = toRad(lat2 - lat1); const dLon = toRad(lon2 - lon1); const a = Math.sin(dLat/2)**2 + Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * Math.sin(dLon/2)**2; return 2 * R * Math.asin(Math.sqrt(a)); }. Python giống hệt, đổi Math.sin thành math.sin. Bẫy phổ biến: quên đổi độ sang radian (sin và cos cần radian, nhưng tọa độ báo cáo theo độ); nhầm thứ tự lat/lon (vài thư viện dùng (lon, lat), đa số API dùng (lat, lon)); dùng Math.asin thay vì atan2(sqrt(a), sqrt(1-a)) ổn định hơn cho khoảng cách gần đối xứng tâm; chọn R = 6378 (xích đạo) khi quy ước là 6371 (trung bình). Cho môi trường sản xuất, nên dùng thư viện đã được kiểm chứng: trong Python là scipy.spatial.distance, geopy.distance hoặc gói haversine; trong JavaScript là Turf.js hoặc @turf/distance. Tự code vẫn được nhưng có những cái bẫy này.
Ba kịch bản. Thứ nhất, khi bạn cần độ chính xác cao cho khoảng cách ngắn — trong khảo sát dưới milimét hay cấp giấy chứng nhận đất, giả định mặt cầu của haversine đem lại quá nhiều sai số; nên dùng công thức nghịch Vincenty trên elipsoid WGS84 hoặc hệ tọa độ chiếu cục bộ (UTM, state plane). Thứ hai, khi bạn chỉ cần khoảng cách xấp xỉ trong khu vực nhỏ — kiểu «hai điểm này có cách nhau dưới 1 km trong cùng thành phố không?». Khi đó xấp xỉ hình chữ nhật d ≈ R·√(Δφ² + (cos(φ_TB)·Δλ)²) chỉ gọi 2 hàm lượng giác thay vì 6 của haversine, chạy nhanh hơn 1/3, và chính xác hơn 0,1 % trong vài trăm km. Khi xử lý theo lô lớn (ghép mọi tài xế Uber với mọi khách), khoảng tiết kiệm tích lũy rất đáng kể. Thứ ba, khi hai điểm rất gần đối xứng tâm (cách nhau > 179,5°), haversine ngây thơ mất độ chính xác — công thức dựa atan2 vững vàng hơn ở đó. Đa số ứng dụng không bao giờ chạm đến những trường hợp biên này, nên haversine vẫn là lựa chọn mặc định đúng đắn.