Phương pháp Haversine tính khoảng cách giữa 2 tọa độ GPS

Tính khoảng cách giữa 2 tọa độ GPS bằng công thức Haversine là cách phổ biến để ước tính khoảng cách ngắn nhất trên bề mặt một quả cầu từ hai cặp vĩ độ – kinh độ. Phương pháp này phù hợp cho ứng dụng bản đồ, tìm điểm lân cận, kiểm tra phạm vi dịch vụ hoặc ước tính khoảng cách đường chim bay.

Đo Vẽ Nhanh cập nhật bài này theo cách dùng Google Maps hiện hành, đồng thời sửa lại phần PHP và SQL để tránh lỗi công thức, lỗi thứ tự kinh độ – vĩ độ và rủi ro ghép chuỗi truy vấn trực tiếp.

Điểm cần hiểu đúng: Haversine trả về khoảng cách cung lớn trên mô hình Trái Đất hình cầu. Kết quả không phải quãng đường lái xe, không tự tính chênh cao và không thay thế phép tính geodesic trên ellipsoid hoặc đo đạc trắc địa khi yêu cầu độ chính xác cao.

Tóm tắt nhanh: nhập vĩ độ trước, kinh độ sau; đổi độ sang radian; tính Haversine; nhân góc tâm với bán kính Trái Đất; chọn mét, kilomet hoặc mile làm đơn vị đầu ra.

Tọa độ GPS gồm những thành phần nào?

Một vị trí trên Google Maps thường được biểu diễn bằng hai giá trị:

  • Vĩ độ – latitude: vị trí theo hướng Bắc – Nam, từ -90° đến 90°.
  • Kinh độ – longitude: vị trí theo hướng Đông – Tây, từ -180° đến 180°.

Ví dụ tọa độ thập phân:

10.776900, 106.700900

Trong cách ghi này, 10.776900 là vĩ độ106.700900 là kinh độ. Đây là thứ tự Google Maps sử dụng khi người dùng nhập tọa độ vào ô tìm kiếm.

Bài tọa độ địa lý là gì giải thích sâu hơn về kinh độ, vĩ độ và cách một vị trí được biểu diễn trên bề mặt Trái Đất.

Ba định dạng tọa độ Google Maps hỗ trợ

Ba định dạng tọa độ thường dùng trên Google Maps
Định dạng Ví dụ Lưu ý
Độ thập phân – DD 10.776900, 106.700900 Dễ dùng trong code và cơ sở dữ liệu
Độ, phút, giây – DMS 10°46’36.8″N 106°42’03.2″E Phổ biến trên tài liệu bản đồ
Độ và phút thập phân – DMM 10 46.6139, 106 42.0539 Cần xác định rõ Bắc/Nam, Đông/Tây

Khi nhập dạng DD, dùng dấu chấm làm dấu thập phân, nhập vĩ độ trước kinh độ và không dùng hai dấu phẩy thập phân theo kiểu định dạng số Việt Nam.

Cách lấy tọa độ trên Google Maps bằng máy tính

Lấy tọa độ trước khi tính khoảng cách giữa hai điểm GPS
Cần lấy đúng cặp vĩ độ – kinh độ của hai điểm trước khi tính khoảng cách.

Bước 1: Mở Google Maps

Truy cập Google Maps trên trình duyệt và di chuyển đến khu vực cần lấy tọa độ.

Bước 2: Nhấp chuột phải vào vị trí

Nhấp chuột phải đúng vị trí hoặc khu vực cần lấy tọa độ. Một cửa sổ thông tin nhỏ sẽ xuất hiện.

Bước 3: Sao chép tọa độ

Cặp vĩ độ – kinh độ dạng thập phân xuất hiện ở đầu cửa sổ. Nhấp vào cặp số để sao chép.

Bước 4: Kiểm tra lại điểm ghim

Dán tọa độ vào ô tìm kiếm Google Maps để kiểm tra vị trí đã chọn có đúng đối tượng cần đo hay không.

Lấy tọa độ GPS trên Google Maps bằng máy tính
Trên máy tính, nhấp chuột phải vào bản đồ để xem và sao chép tọa độ dạng thập phân.

Google Maps cho phép tìm vị trí bằng DD, DMS và DMM. Bài cách xác định tọa độ địa lý giúp Bạn kiểm tra cách đọc và chuyển đổi giữa các dạng tọa độ.

Cách lấy tọa độ Google Maps trên điện thoại

Bước 1: Mở ứng dụng Google Maps

Di chuyển bản đồ đến khu vực cần lấy tọa độ.

Bước 2: Nhấn giữ vị trí chưa có nhãn

Nhấn và giữ trên bản đồ đến khi xuất hiện ghim đỏ.

Bước 3: Đọc hoặc sao chép tọa độ

Tọa độ có thể xuất hiện trong ô tìm kiếm hoặc thẻ thông tin của vị trí, tùy phiên bản ứng dụng và hệ điều hành.

Bước 4: Kiểm tra thứ tự

Đảm bảo số đầu là vĩ độ trong khoảng -90 đến 90; số sau là kinh độ trong khoảng -180 đến 180.

Lấy tọa độ GPS từ Google Maps trên điện thoại
Trên điện thoại, nhấn giữ một vị trí chưa có nhãn để thả ghim và xem tọa độ.

Tọa độ Google Maps có phải tọa độ đo đạc chính xác không?

Không nên mặc định như vậy. Điểm lấy trên Google Maps phụ thuộc vị trí người dùng nhấp, dữ liệu nền, độ phân giải ảnh, phép hiển thị và độ chính xác định vị của thiết bị.

Tọa độ này phù hợp để:

  • Chia sẻ vị trí.
  • Ước tính khoảng cách.
  • Tìm điểm lân cận.
  • Đánh dấu sơ bộ khu vực khảo sát.
  • Tạo dữ liệu tham khảo ban đầu.

Không nên dùng trực tiếp để xác định ranh đất, cắm mốc hoặc thi công công trình. Bài công nghệ GPS là gì giúp hiểu nguồn sai số và sự khác nhau giữa định vị phổ thông với thiết bị đo chuyên dụng.

Công thức Haversine là gì?

Công thức Haversine tính khoảng cách giữa hai tọa độ GPS
Haversine tính góc tâm giữa hai điểm rồi nhân với bán kính của mô hình Trái Đất hình cầu.

Gọi:

  • φ1, φ2: vĩ độ của điểm A và B, tính bằng radian.
  • λ1, λ2: kinh độ của điểm A và B, tính bằng radian.
  • Δφ = φ2 - φ1.
  • Δλ = λ2 - λ1.
  • R: bán kính quả cầu dùng trong mô hình.

Công thức:

a = sin²(Δφ / 2)
  + cos(φ1) × cos(φ2) × sin²(Δλ / 2)

c = 2 × atan2(√a, √(1 − a))

d = R × c

Trong đó d là khoảng cách cung lớn. Nếu R tính bằng mét thì kết quả cũng là mét.

Vì sao phải đổi độ sang radian?

Các hàm lượng giác trong hầu hết ngôn ngữ lập trình nhận góc theo radian. Nếu đưa trực tiếp 10°, 106° hoặc các giá trị độ khác vào sin()cos(), kết quả sẽ sai.

Công thức chuyển:

radian = độ × π / 180

Trong PHP có thể dùng hàm deg2rad().

Nên chọn bán kính Trái Đất bao nhiêu?

Không có một bán kính duy nhất vì Trái Đất gần với ellipsoid dẹt hơn là quả cầu hoàn hảo.

Một số cách chọn bán kính trong phép tính cầu
Bán kính Giá trị Mục đích
Bán kính trung bình 6.371.008,8 m Ước tính Haversine phổ thông
Bán kính WGS84 tại xích đạo 6.378.137 m Một số thư viện bản đồ dùng làm mặc định
Bán kính tùy chỉnh Do ứng dụng chỉ định Mô hình hành tinh hoặc quy ước riêng

Trong bài này, ví dụ PHP dùng 6.371.008,8 m. Điều quan trọng là ghi rõ bán kính và không trộn kết quả từ nhiều thư viện dùng các giá trị khác nhau.

Ví dụ tính khoảng cách giữa hai tọa độ

Giả sử:

  • Điểm A: 10.776900, 106.700900.
  • Điểm B: 10.818800, 106.651900.

Áp dụng Haversine với bán kính 6.371.008,8 m, khoảng cách đường chim bay xấp xỉ:

7.095,90 m ≈ 7,10 km

Con số này không phải quãng đường đi ô tô. Đường thực tế có thể dài hơn do mạng lưới đường, cầu, sông, đường một chiều và điều kiện giao thông.

Mã PHP tính khoảng cách Haversine an toàn hơn

Mã PHP tính khoảng cách giữa hai tọa độ GPS
PHP có thể tính khoảng cách Haversine sau khi kiểm tra phạm vi và chuyển tọa độ sang radian.
<?php

declare(strict_types=1);

/**
 * Tính khoảng cách cung lớn giữa hai tọa độ.
 *
 * @return float Khoảng cách tính bằng mét.
 */
function haversineDistanceMeters(
    float $lat1,
    float $lon1,
    float $lat2,
    float $lon2,
    float $radius = 6371008.8
): float {
    foreach ([$lat1, $lat2] as $latitude) {
        if ($latitude < -90.0 || $latitude > 90.0) {
            throw new InvalidArgumentException('Vĩ độ phải từ -90 đến 90.');
        }
    }

    foreach ([$lon1, $lon2] as $longitude) {
        if ($longitude < -180.0 || $longitude > 180.0) {
            throw new InvalidArgumentException('Kinh độ phải từ -180 đến 180.');
        }
    }

    if ($radius <= 0.0) {
        throw new InvalidArgumentException('Bán kính phải lớn hơn 0.');
    }

    $phi1 = deg2rad($lat1);
    $phi2 = deg2rad($lat2);
    $deltaPhi = deg2rad($lat2 - $lat1);
    $deltaLambda = deg2rad($lon2 - $lon1);

    $sinHalfPhi = sin($deltaPhi / 2.0);
    $sinHalfLambda = sin($deltaLambda / 2.0);

    $a = ($sinHalfPhi ** 2)
        + cos($phi1) * cos($phi2) * ($sinHalfLambda ** 2);

    // Chặn sai số dấu phẩy động ngoài miền [0, 1].
    $a = max(0.0, min(1.0, $a));

    $centralAngle = 2.0 * atan2(sqrt($a), sqrt(1.0 - $a));

    return $radius * $centralAngle;
}

$distanceMeters = haversineDistanceMeters(
    10.776900,
    106.700900,
    10.818800,
    106.651900
);

printf("%.2f m\n", $distanceMeters);
printf("%.3f km\n", $distanceMeters / 1000.0);

Dạng dùng atan2() tránh phải chuyển qua độ, phút, mile rồi đổi ngược về kilomet như đoạn mã cũ. Kết quả được giữ ở đơn vị SI là mét và chỉ đổi đơn vị tại bước hiển thị.

Vì sao không nên dùng công thức acos cũ?

Đoạn PHP cũ dùng định luật cos cầu, sau đó chuyển radian sang độ, nhân 60 × 1,1515 để ra mile. Cách đó có thể cho kết quả gần đúng nhưng có ba hạn chế:

  • Dễ mất ổn định số khi hai điểm rất gần nhau.
  • Chuỗi đổi radian → độ → hải lý → mile → kilomet làm code khó kiểm tra.
  • Không kiểm tra phạm vi tọa độ và không chặn đầu vào cho acos().

Haversine dạng atan2() trực tiếp hơn và ổn định hơn cho nhiều khoảng cách thường gặp.

MySQL: dùng ST_Distance_Sphere thay cho chuỗi SQL cũ

MySQL 8.4 cung cấp hàm ST_Distance_Sphere() để tính khoảng cách cầu tối thiểu giữa hai điểm và trả kết quả theo mét.

SELECT
    id,
    name,
    latitude,
    longitude,
    ST_Distance_Sphere(
        POINT(longitude, latitude),
        POINT(:longitude, :latitude)
    ) AS distance_m
FROM locations
WHERE latitude BETWEEN -90 AND 90
  AND longitude BETWEEN -180 AND 180
HAVING distance_m <= :radius_m
ORDER BY distance_m ASC;

Lưu ý: hàm POINT(x, y) dùng thứ tự X trước Y, nên phải nhập kinh độ trước, vĩ độ sau. Đây là thứ tự khác với chuỗi tọa độ thường nhập trên Google Maps.

Các giá trị :longitude, :latitude:radius_m nên được truyền bằng prepared statement, không ghép trực tiếp từ dữ liệu người dùng.

SQL Haversine khi hệ quản trị không có hàm không gian

SQL tính khoảng cách giữa hai tọa độ GPS
Có thể triển khai Haversine trực tiếp trong SQL, nhưng nên dùng tham số và bộ lọc sơ bộ để giảm tải.
SELECT
    id,
    name,
    latitude,
    longitude,
    6371008.8 * 2 * ASIN(
        SQRT(
            POWER(SIN(RADIANS(latitude - :latitude) / 2), 2)
            + COS(RADIANS(:latitude))
            * COS(RADIANS(latitude))
            * POWER(SIN(RADIANS(longitude - :longitude) / 2), 2)
        )
    ) AS distance_m
FROM locations
HAVING distance_m <= :radius_m
ORDER BY distance_m ASC;

Alias distance_m được dùng trong HAVING, không đặt trực tiếp trong WHERE như truy vấn cũ. Với bảng lớn, nên lọc trước bằng bounding box hoặc dùng cột spatial và spatial index.

Bounding box giúp tăng tốc tìm điểm lân cận

Haversine phải tính lượng giác cho từng bản ghi. Khi cơ sở dữ liệu có hàng triệu điểm, nên lọc nhanh một hình chữ nhật bao quanh vùng tìm kiếm trước.

Quy trình:

  1. Từ bán kính tìm kiếm, ước tính khoảng thay đổi vĩ độ.
  2. Điều chỉnh khoảng kinh độ theo cosine của vĩ độ trung tâm.
  3. Dùng WHERE latitude BETWEEN ...longitude BETWEEN ....
  4. Chỉ tính Haversine cho các điểm còn lại.

Bounding box chỉ là bộ lọc sơ bộ. Kết quả cuối vẫn phải kiểm tra bằng Haversine hoặc hàm không gian.

Haversine khác khoảng cách Euclid như thế nào?

Khoảng cách Euclid trên mặt phẳng:

d = √[(x2 − x1)² + (y2 − y1)²]

Phù hợp khi hai điểm đã ở trong một hệ tọa độ phẳng dùng đơn vị mét và khu vực không quá lớn.

Haversine dùng kinh độ – vĩ độ và mô hình quả cầu. Không được lấy trực tiếp chênh lệch độ kinh – vĩ rồi áp dụng Pythagoras mà không xét tỷ lệ và phép chiếu.

Bài hệ tọa độ Oxyz giúp phân biệt tọa độ Descartes với tọa độ địa lý.

Haversine khác khoảng cách geodesic trên ellipsoid thế nào?

So sánh Haversine và phép tính geodesic ellipsoid
Tiêu chí Haversine Geodesic ellipsoid
Mô hình Trái Đất Quả cầu Ellipsoid như WGS84
Độ phức tạp Thấp Cao hơn
Ứng dụng Bản đồ web, điểm gần, ước tính Trắc địa, hàng hải, đo khoảng cách chính xác hơn
Kết quả Phụ thuộc bán kính cầu Phụ thuộc ellipsoid và thuật toán geodesic

Với ứng dụng cần độ chính xác cao, nên dùng thư viện geodesic uy tín hoặc GIS hỗ trợ kiểu dữ liệu geography/ellipsoid.

Bài hệ tọa độ WGS84 là gì giúp hiểu ellipsoid và datum thường đi cùng dữ liệu GPS.

Haversine có tính chênh cao không?

Không. Công thức chỉ dùng kinh độ và vĩ độ, nên kết quả là khoảng cách bề mặt trên mô hình cầu.

Với hai điểm gần nhau có chênh cao Δh, một ước tính khoảng cách không gian đơn giản là:

d3D ≈ √(dhorizontal² + Δh²)

Cách này chỉ phù hợp cho khoảng cách cục bộ và dữ liệu độ cao có cùng hệ chuẩn. Độ cao GPS, cao độ thủy chuẩn và cao độ bản đồ không mặc nhiên giống nhau.

Haversine có cho quãng đường lái xe không?

Không. Haversine chỉ trả đường ngắn nhất trên bề mặt mô hình cầu giữa hai vị trí.

Quãng đường giao thông phụ thuộc:

  • Mạng lưới đường.
  • Cầu và phà.
  • Đường một chiều.
  • Loại phương tiện.
  • Hạn chế lưu thông.
  • Điểm vào – ra thực tế.

Nếu cần khoảng cách lái xe, đi bộ hoặc xe máy, phải dùng dịch vụ định tuyến thay vì Haversine.

Khi nào nên chuyển tọa độ sang VN-2000 hoặc UTM?

Nếu bài toán thuộc phạm vi khảo sát địa hình, công trình hoặc đo đạc đất đai, dữ liệu thường cần được đưa về hệ tọa độ phù hợp với nhiệm vụ.

Trong hệ tọa độ phẳng có đơn vị mét, kỹ sư có thể tính khoảng cách phẳng trực tiếp giữa các điểm sau khi kiểm tra phép chiếu và khu vực áp dụng.

Bài các hệ tọa độ trong trắc địa giúp xác định khi nào dùng tọa độ địa lý và khi nào dùng tọa độ phẳng.

Bài chuyển hệ tọa độ UTM sang VN-2000 trình bày riêng quy trình chuyển dữ liệu giữa hai hệ.

Sai lầm thường gặp khi tính khoảng cách GPS

  • Đảo vĩ độ và kinh độ.
  • Đưa số đo độ trực tiếp vào hàm lượng giác.
  • Dùng dấu phẩy làm dấu thập phân.
  • Nhập vĩ độ ngoài -90 đến 90.
  • Nhập kinh độ ngoài -180 đến 180.
  • Nhầm Haversine với quãng đường lái xe.
  • Không ghi rõ bán kính Trái Đất sử dụng.
  • Dùng Google Maps để xác định ranh đất.
  • Không xử lý điểm gần đường đổi ngày ±180°.
  • Ghép dữ liệu người dùng trực tiếp vào SQL.
  • Nhầm thứ tự POINT(longitude, latitude) trong SQL.
  • Cho rằng kết quả cầu là chính xác trắc địa trên ellipsoid.

“Haversine rất hữu ích để ước tính nhanh khoảng cách giữa hai tọa độ địa lý, nhưng Tôi không dùng kết quả này thay cho khoảng cách trắc địa khi thiết kế, cắm mốc hoặc xác định ranh. Trước hết phải biết tọa độ thuộc hệ nào, độ chính xác nguồn dữ liệu ra sao và khoảng cách cần dùng cho mục đích gì.”

Kỹ sư Phan Việt Tuyên

Khi nào cần dùng thiết bị GPS/GNSS chuyên dụng?

Điện thoại và Google Maps phù hợp lấy vị trí tham khảo. Khi cần tọa độ centimet hoặc liên kết với mốc dự án, cần thiết bị GNSS, toàn đạc hoặc phương pháp trắc địa phù hợp.

Bài trạm CORS là gì giải thích cách mạng hiệu chỉnh hỗ trợ định vị GNSS độ chính xác cao.

Quý anh chị cần kiểm tra địa hình và tọa độ ngoài thực địa có thể tham khảo dịch vụ khảo sát địa hình.

Haversine có dùng được cho đo đạc nhà đất không?

Có thể dùng để ước tính khoảng cách sơ bộ giữa các vị trí địa lý, nhưng không nên dùng trực tiếp làm kích thước cạnh thửa.

Đo đạc nhà đất cần:

  • Hệ tọa độ phù hợp.
  • Thiết bị và mốc có độ chính xác đáp ứng nhiệm vụ.
  • Ranh được xác định theo hồ sơ và thực địa.
  • Kiểm tra sai số và quan hệ với các thửa liền kề.

Quý anh chị cần kiểm tra diện tích hoặc cạnh ranh có thể sử dụng dịch vụ đo đạc đất đai.

Trường hợp đã có tọa độ ranh đủ căn cứ và cần đưa ra thực địa, có thể tham khảo dịch vụ định vị chôn trụ góc ranh đất.

Câu hỏi thường gặp về tính khoảng cách tọa độ GPS

Haversine có chính xác tuyệt đối không?

Không. Haversine dùng mô hình quả cầu nên là phép xấp xỉ. Độ phù hợp phụ thuộc khoảng cách, vị trí, bán kính chọn và mục đích sử dụng.

Google Maps nhập kinh độ hay vĩ độ trước?

Google Maps yêu cầu vĩ độ trước, kinh độ sau. Tuy nhiên trong nhiều hàm geometry hoặc SQL, điểm thường được tạo theo thứ tự X, Y — tức kinh độ trước, vĩ độ sau.

Công thức Haversine trả mét hay kilomet?

Kết quả có cùng đơn vị với bán kính R. Nếu R nhập bằng mét, kết quả là mét; nếu R nhập bằng kilomet, kết quả là kilomet.

Khoảng cách Haversine có giống quãng đường Google Maps không?

Không. Haversine là khoảng cách đường chim bay trên mô hình cầu. Quãng đường Google Maps dựa vào mạng lưới giao thông và phương tiện.

Có thể dùng Haversine để cắm mốc ranh đất không?

Không nên. Cắm mốc cần tọa độ, hệ quy chiếu, hồ sơ ranh và thiết bị trắc địa phù hợp. Haversine chỉ là phép tính khoảng cách từ kinh độ – vĩ độ.

Kết luận

Công thức Haversine là giải pháp gọn và dễ triển khai để tính khoảng cách cung lớn giữa hai cặp tọa độ GPS. Quy trình đúng gồm kiểm tra vĩ độ – kinh độ, đổi sang radian, tính góc tâm và nhân với bán kính mô hình Trái Đất.

Trong PHP, nên dùng dạng atan2(), kiểm tra phạm vi đầu vào và giữ kết quả ở đơn vị mét. Trong MySQL, có thể ưu tiên ST_Distance_Sphere() hoặc dùng công thức Haversine với prepared statement và bộ lọc bounding box.

Haversine phù hợp bản đồ web, tìm điểm lân cận và ước tính đường chim bay. Khi yêu cầu khoảng cách trắc địa chính xác, khoảng cách trong hệ VN-2000/UTM, quãng đường giao thông hoặc kích thước ranh đất, cần dùng phương pháp và dữ liệu chuyên ngành tương ứng.

Liên hệ đo tọa độ và khoảng cách ngoài thực địa

Quý anh chị cần xác định tọa độ, đo cạnh, kiểm tra ranh hoặc khảo sát địa hình có thể gửi vị trí và mục tiêu sử dụng để Đo Vẽ Nhanh đề xuất phương pháp GNSS, toàn đạc hoặc khảo sát phù hợp.

Công ty TNHH Hợp Nhất Bách Việt – Đo Vẽ Nhanh

Trụ sở: 369/16 Lò Lu, Phường Long Phước, Thành phố Hồ Chí Minh

Văn phòng hỗ trợ: 31/13 đường 160, Phường Tăng Nhơn Phú, Thành phố Hồ Chí Minh

Hotline: 0907 621 115

Email: pviettuyen@gmail.com

Tài liệu tham khảo

Google Maps Help. (2026). Search by latitude and longitude in Google Maps.

Google Maps Platform. (2026). Maps JavaScript API Geometry Library.

PHP Documentation Group. (2026). PHP Manual: deg2rad(), sin(), cos(), atan2() and related mathematical functions.

Oracle. (2026). MySQL 8.4 Reference Manual: ST_Distance_Sphere().

PostGIS Project. (2026). ST_DistanceSphere and measurement functions.

Đánh giá post

Liên Hệ Đo Vẽ Nhanh

Đo Vẽ Nhanh sẵn sàng hỗ trợ bạn về đo đạc địa chính, khảo sát địa hình và địa chất công trình.

Địa chỉ: 369 Lò Lu, phường Long Phước, TPHCM