คำศัพท์
ละติจูด (latitude) คือเส้นแนวนอน มีทั้งหมด 180 เส้น โดยแบ่งออกเป็นซีกโลกบน 90 เส้น (90 องศา) และซีกโลกล่างอีก 90 เส้น (90 องศา) มีค่าต่ำสุดอยู่ที่ 0 องศา และมีค่าสูงสุดอยู่ที่ 90 องศา ละติจูดที่ 0 องศา มีค่าเท่ากับเส้นศูนย์สูตร
ลองจิจูด (longitude) คือเส้นแนวตั้ง มีทั้งหมด 360 เส้น โดยแบ่งออกเป็นซีกโลกซ้าย 180 เส้น (180 องศา) และซีกโลกขวาอีก 180 เส้น (180 องศา) มีค่าต่ำสุดอยู่ที่ 0 องศา และมีค่าสูงสุดอยู่ที่ 180 องศา
หมายเหตุ : ขอย้ำว่าละติจูดและลองจิจูด คือเส้นไม่ใช่แกน เพราะบางคนมองภาพแล้วอาจจะสับสนครับ
วิธีการ
สูตรที่นำมาประยุกต์ใช้แก้ปัญหาในที่นี้คือ สูตรพีทากอรัส ครับ ซึ่งมีรูปแบบดังนี้
แปลงให้เป็นสูตรคำนวณระยะทาง จึงได้เป็น
แต่เนื่องจากโลกไม่ได้เป็นพื้นแบนราบ (เพราะโลกเป็นทรงกลม) การคำนวณระยะทางจึงต้องมีการปรับปรุงสูตรอีกเล็กน้อย เพื่อให้มีความถูกต้องตามระยะทางที่เป็นจริง (ตามความโค้งของโลก) ด้วยการเพิ่มตัวแปรค่าคลาดเคลื่อนลงไป เมื่อละติจูดมีการเปลี่ยนแปลงทุกๆ 1 องศา จึงได้สูตรใหม่เป็นดังนี้
(จากภาพจะเห็นว่า distance1 และ distance2 มีความยาวไม่เท่ากัน (distance1 แคบกว่า) ทั้งๆ ที่มีลองจิจูด 0 และลองจิจูด 50 เหมือนกัน ที่ละติจูดต่างกัน (0 กับ 60) นี่จึงเป็นที่มาของค่าคลาดเคลื่อน หรือค่าความแตกต่างของระยะทางในแต่ละช่วงละติจูดครับ)
ค่า a และ b ขึ้นอยู่กับค่า X (latitude)
ตารางค่าความแตกต่างของ latitude และ longtitude ในแต่ละสถานที่
ตารางอ้างอิงมาจาก http://en.wikipedia.org/wiki/Latitude
/** * code for compute distance of GPS 2 points * * @author redcorw * create 01/12/2013 * link http://na5cent.blogspot.com/2011/07/gps-2-javascript.html */ var BETWEEN_DEGREE = 15; var THOUSAND_METER = 1000; /** * define surface distance per 1 degree change */ var SURFACE_DISTANCE_PER_ONE_DEGREE = [ { latitude : 110.574, longitude : 111.320 }, //0 degree { latitude : 110.649, longitude : 107.551 }, //15 degree { latitude : 110.852, longitude : 96.486 }, //30 degree { latitude : 111.132, longitude : 78.847 }, //45 degree { latitude : 111.412, longitude : 55.800 }, //60 degree { latitude : 111.618, longitude : 28.902 }, //75 degree { latitude : 111.694, longitude : 0.000 } //90 degree ]; /** * define class GPS for keep latitude and longitude */ var GPS = function(lat, lnt){ this.latitude = lat || 0; this.longitude = lnt || 0; }; function getSurfaceDistance(gps){ return SURFACE_DISTANCE_PER_ONE_DEGREE[parseInt(gps.latitude / BETWEEN_DEGREE)]; //depend on latitude } function getLatitudeDistance(gps){ return getSurfaceDistance(gps).latitude * THOUSAND_METER; } function getLongitudeDistance(gps){ return getSurfaceDistance(gps).longitude * THOUSAND_METER; } function findDistance(gps1, gps2){ var latitudeDistance1 = getLatitudeDistance(gps1); //a1 var latitudeDistance2 = getLatitudeDistance(gps2); //a2 var longitudeDistance1 = getLongitudeDistance(gps1); //b1 var longitudeDistance2 = getLongitudeDistance(gps2); //b2 // (X2 * a2 - X1 * a1) ^ 2 var power1 = Math.pow((gps2.latitude * latitudeDistance2) - (gps1.latitude * latitudeDistance1), 2); // (Y2 * b2 - Y1 * b1) ^ 2 var power2 = Math.pow((gps2.longitude * longitudeDistance2) - (gps1.longitude * longitudeDistance1), 2); return Math.sqrt(power1 + power2); }; /** * define gps1 and gps2 location */ var gps1 = new GPS(13.7569891624617, 100.6189513206482); var gps2 = new GPS(13.7569991624617, 100.6189613206482); alert(findDistance(gps1, gps2) + ' meter');
จาก alert box ข้างบน สรุปได้ว่า gps1 กับ gps2 อยู่ห่างกัน 1.5690... เมตร
หากกำนดค่า x1y1 และค่า d มาให้สามารถหาค่า x2y2 ได้อย่างไรครับ
ตอบลบ