Việc tính toán khoảng cách bằng cách sử dụng hàm đó ở đó khá tốn kém về mặt tính toán, bởi vì nó liên quan đến một loạt các hàm siêu việt. Điều này sẽ có vấn đề khi bạn có một số lượng lớn hàng để lọc.
Đây là một giải pháp thay thế, một phép tính gần đúng ít tốn kém hơn về mặt tính toán:
Khoảng cách gần đúng tính bằng dặm:
sqrt(x * x + y * y)
where x = 69.1 * (lat2 - lat1)
and y = 53.0 * (lon2 - lon1)
Bạn có thể cải thiện độ chính xác của phép tính khoảng cách gần đúng này bằng cách thêm hàm toán học cosine:
Cải thiện khoảng cách gần đúng tính bằng dặm:
sqrt(x * x + y * y)
where x = 69.1 * (lat2 - lat1)
and y = 69.1 * (lon2 - lon1) * cos(lat1/57.3)
Nguồn: http://www.meridianworlddata.com/Distance-Calculation.asp
Tôi đã chạy một loạt các thử nghiệm với các tập dữ liệu được tạo ngẫu nhiên.
- Sự khác biệt về độ chính xác của 3 thuật toán là tối thiểu , đặc biệt là ở khoảng cách ngắn
- Tất nhiên, thuật toán chậm nhất là thuật toán có các hàm trig (thuật toán trong câu hỏi của bạn). Nó chậm hơn 4 lần so với hai cái kia.
Chắc chắn là không đáng. Chỉ cần ước lượng.
Mã ở đây: http://pastebin.org/424186
Để sử dụng tính năng này trên MySQL, hãy tạo thủ tục được lưu trữ nhận các đối số tọa độ và trả về khoảng cách, sau đó bạn có thể làm như sau:
SELECT columns
FROM table
WHERE DISTANCE(col_x, col_y, target_x, target_y) < 25