Việc tính toán khoảng cách khá tốn kém về mặt tính toán, như những người khác đã nói. Trả lại các tập dữ liệu khổng lồ cũng không phải là một ý kiến hay - đặc biệt khi xem xét PHP không phải là hiệu suất tuyệt vời.
Tôi sẽ sử dụng phương pháp heuristic, như tính gần đúng khoảng cách bằng phép cộng và phép trừ đơn giản.
Chỉ cần tìm kiếm db với các sự cố trong phạm vi đó (hiệu quả là hình vuông, chứ không phải hình tròn), và sau đó bạn có thể làm việc với những sự cố với PHP.
CHỈNH SỬA :Đâ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
CHỈNH SỬA 2 :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
- Thuật toán chậm nhất (thuật toán có toàn bộ các hàm cắt nhỏ) chậm hơn 4 lần so với hai thuật toán còn lại.
Chắc chắn là không đáng. Chỉ với một ước tính gần đúng.
Mã ở đây: http://pastebin.org/424186