Mình đã từng có bài viết về chủ đề này trước đây, nhưng sử dụng Google Map API để tính khoảng cách từ điểm A đến điểm B. Lần này chúng ta sử dụng PHP để tính khoảng cách từ một điểm đến điểm còn lại – cũng sử dụng kinh độ và vĩ độ như Google Map.
Công thức tính khoảng cách Haversine
Vấn đề tính khoảng cách từ điểm A đến điểm B có thể được giải quyết bằng công thức Haversine. Để áp dụng được công thức này, chúng ta cần có vị trí điểm A và điểm B trên bề mặt trái đất.
Sau đó, bạn cần chuyển đổi kinh độ và vĩ độ tương ứng từ đơn vị đô là độ sang đơn vị đo radian.
Hãy xem công thức cơ sở của phép đổi đơn vị này:
Latitude in Radians= (Latitude /180) pi radians
=(Latitude * 0.01746031) radians
Longitude in Radians= (Longitude /180) pi radians
=(Longitude * 0.01746031) radians
Ngoài ra, chúng ta có bán kính của trái đất là 3,936 miles, tương đương với 6.378 km. Như vậy , công thức tính khoảng cách giữa 2 điểm sẽ là:
Distance= [6378 * acos((sin(latitude1) * sin(latitude2)) + cos(latitude1) * cos(latitude2) * cos(longitude2 – longitude1))] ở kilomet.
Nếu bạn muốn tính theo đơn vị là mile, công thức sẽ là:
Distance= [3936 * acos((sin(latitude1) * sin(latitude2)) + cos(latitude1) * cos(latitude2) * cos(longitude2 – longitude1))] ở kilomet.
Bây giờ, chúng ta sẽ đưa công thức này vào PHP để tính được khoảng cách giữa 2 điểm A và B dựa trên kinh độ và vĩ độ.
The distance between two places using latitude and longitude in PHP
Cùng xem đoạn mã biểu diễn công thức Haversine đã nói ở trên nhé.
<?php // latitude and longitude of Two Points $latitude1 = 19.017656 ; $longitude1 = 72.856178; $latitude2 = 40.7127; $longitude2 = -74.0059; //Converting to radians $longi1 = deg2rad($longitude1); $longi2 = deg2rad($longitude2); $lati1 = deg2rad($latitude1); $lati2 = deg2rad($latitude2); //Haversine Formula $difflong = $longi2 - $longi1; $difflat = $lati2 - $lati1; $val = pow(sin($difflat/2),2)+cos($lati1)*cos($lati2)*pow(sin($difflong/2),2); $res1 =3936* (2 * asin(sqrt($val))); //for miles $res2 =6378.8 * (2 * asin(sqrt($val))); //for kilometers //display distance in miles print_r('Distance:'.$res1.' '.'miles '.'OR '.$res2.' '.' kilometers'); ?> |
Output mình sẽ nhận được:
Distance:7748.9344580629 miles OR 12558.156280765 kilometers