วิธีแก้ปัญหาโดยประมาณ (ขึ้นอยู่กับการฉายภาพเชิงเส้นตรง) เร็วกว่ามาก (ต้องใช้เพียง 1 ตรีโกณและ 1 รากที่สอง)
การประมาณนี้มีความเกี่ยวข้องหากคะแนนของคุณไม่ห่างกันเกินไป มันจะเกินประมาณการเสมอเมื่อเทียบกับระยะทางไกลจริง ยกตัวอย่างเช่นมันจะเพิ่มไม่เกิน 0.05382%กับระยะทางจริงถ้าเส้นรุ้งเส้นแวงเดลต้าหรือระหว่างจุดสองจุดของคุณไม่เกิน 4 องศาทศนิยม
สูตรมาตรฐาน (Haversine) เป็นสูตรที่แน่นอน (นั่นคือใช้ได้กับลองจิจูด / ละติจูดบนโลก) แต่จะช้ากว่ามากเนื่องจากต้องมีตรีโกณมิติ 7 ตัวและรากที่สอง 2 หากจุดสองจุดของคุณอยู่ห่างกันไม่มากเกินไปและความแม่นยำสัมบูรณ์ไม่ใช่สิ่งสำคัญยิ่งคุณสามารถใช้เวอร์ชันโดยประมาณนี้ (Equirectangular) ซึ่งเร็วกว่ามากเนื่องจากใช้ตรีโกณมิติเดียวและรากที่สองหนึ่งรูท
// 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;
คุณสามารถเพิ่มประสิทธิภาพเพิ่มเติมได้โดย:
- การลบรากที่สองถ้าคุณเปรียบเทียบระยะทางกับอีกระยะหนึ่ง (ในกรณีนั้นให้เปรียบเทียบทั้งระยะทางกำลังสอง)
- การแยกตัวประกอบของโคไซน์ถ้าคุณคำนวณระยะทางจากจุดต้นแบบหนึ่งไปยังจุดอื่น ๆ อีกหลายจุด (ในกรณีนี้คุณจะทำการฉายภาพที่มีศูนย์กลางอยู่ที่จุดต้นแบบดังนั้นคุณจึงสามารถคำนวณโคไซน์หนึ่งครั้งสำหรับการเปรียบเทียบทั้งหมด)
ดูข้อมูลเพิ่มเติมได้ที่: http://www.movable-type.co.uk/scripts/latlong.html
มีการใช้อ้างอิงที่ดีของสูตร Haversine ในหลายภาษาที่: http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe