Đôi khi tham số thành ACOS()
có thể lớn hơn 1 một chút - nằm ngoài miền của hàm đó một chút - khi khoảng cách nhỏ. Có một công thức khoảng cách tốt hơn, do Vincenty. Nó sử dụng ATAN2(y,x)
chứ không phải là ACOS()
chức năng và do đó ổn định hơn về mặt số học.
Đây là nó.
DEGREES(
ATAN2(
SQRT(
POW(COS(RADIANS(lat2))*SIN(RADIANS(lon2-lon1)),2) +
POW(COS(RADIANS(lat1))*SIN(RADIANS(lat2)) -
(SIN(RADIANS(lat1))*COS(RADIANS(lat2)) *
COS(RADIANS(lon2-lon1))) ,2)),
SIN(RADIANS(lat1))*SIN(RADIANS(lat2)) +
COS(RADIANS(lat1))*COS(RADIANS(lat2))*COS(RADIANS(lon2-lon1))))
Hàm này trả về kết quả của nó theo độ. Có 111,045 km trong một mức độ. 60 hải lý. 69 dặm theo quy chế. Vì vậy, hãy nhân kết quả với một trong những số đó để có được khoảng cách. Có một bản ghi đầy đủ hơn, bao gồm định nghĩa hàm được lưu trữ cho MySQL, tại đây .
Một giải pháp khác là sử dụng ISNULL(ACOS(formula), 0.0)