Một giải pháp gần đúng (dựa trên phép chiếu hình tam giác đều), nhanh hơn nhiều (chỉ cần 1 trig và 1 căn bậc hai).
Sự gần đúng này có liên quan nếu các điểm của bạn không quá xa nhau. Nó sẽ luôn ước tính quá mức so với khoảng cách hasrsine thực. Ví dụ: nó sẽ thêm không quá 0,05382% vào khoảng cách thực nếu vĩ độ hoặc kinh độ đồng bằng giữa hai điểm của bạn không vượt quá 4 độ thập phân .
Công thức chuẩn (Haversine) là công thức chính xác (nghĩa là nó hoạt động với bất kỳ cặp kinh độ / vĩ độ nào trên trái đất) nhưng chậm hơn nhiều vì nó cần 7 lượng giác và 2 căn bậc hai. Nếu hai điểm của bạn không quá xa nhau và độ chính xác tuyệt đối không phải là tối quan trọng, bạn có thể sử dụng phiên bản gần đúng này (Hình chữ nhật tương đương), nhanh hơn nhiều vì nó chỉ sử dụng một lượng giác và một căn bậc hai.
// Approximate Equirectangular -- works if (lat1,lon1) ~ (lat2,lon2)
int R = 6371; // km
double x = (lon2 - lon1) * Math.cos((lat1 + lat2) / 2);
double y = (lat2 - lat1);
double distance = Math.sqrt(x * x + y * y) * R;
Bạn có thể tối ưu hóa điều này hơn nữa bằng cách:
- Loại bỏ căn bậc hai nếu bạn chỉ đơn giản so sánh khoảng cách với một khoảng cách khác (trong trường hợp đó so sánh cả hai khoảng cách bình phương);
- Tính cosin nếu bạn tính khoảng cách từ một điểm chính đến nhiều điểm khác (trong trường hợp đó, bạn thực hiện phép chiếu hình tam giác có tâm ở điểm chính, vì vậy bạn có thể tính cosin một lần cho tất cả các phép so sánh).
Để biết thêm thông tin, hãy xem: http://www.movable-type.co.uk/scripts/latlong.html
Có một triển khai tham chiếu tuyệt vời của công thức Haversine bằng một số ngôn ngữ tại: http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe