หน้าเว็บ

วันเสาร์ที่ 23 กรกฎาคม พ.ศ. 2554

การคำนวณระยะห่าง ของตำแหน่ง GPS 2 จุด (javaScript)

คำศัพท์

ละติจูด (latitude) คือเส้นแนวนอน  มีทั้งหมด 180 เส้น โดยแบ่งออกเป็นซีกโลกบน 90 เส้น  (90 องศา) และซีกโลกล่างอีก 90 เส้น (90 องศา)  มีค่าต่ำสุดอยู่ที่ 0 องศา และมีค่าสูงสุดอยู่ที่ 90 องศา ละติจูดที่ 0 องศา มีค่าเท่ากับเส้นศูนย์สูตร


ลองจิจูด (longitude) คือเส้นแนวตั้ง  มีทั้งหมด 360 เส้น โดยแบ่งออกเป็นซีกโลกซ้าย 180 เส้น (180 องศา) และซีกโลกขวาอีก 180 เส้น (180 องศา) มีค่าต่ำสุดอยู่ที่ 0 องศา และมีค่าสูงสุดอยู่ที่ 180 องศา



หมายเหตุ : ขอย้ำว่าละติจูดและลองจิจูด คือเส้นไม่ใช่แกน  เพราะบางคนมองภาพแล้วอาจจะสับสนครับ

วิธีการ


เมื่อกำหนดให้ X = latitude และ Y = longitude

สูตรที่นำมาประยุกต์ใช้แก้ปัญหาในที่นี้คือ สูตรพีทากอรัส ครับ  ซึ่งมีรูปแบบดังนี้
แปลงให้เป็นสูตรคำนวณระยะทาง  จึงได้เป็น

แต่เนื่องจากโลกไม่ได้เป็นพื้นแบนราบ (เพราะโลกเป็นทรงกลม) การคำนวณระยะทางจึงต้องมีการปรับปรุงสูตรอีกเล็กน้อย  เพื่อให้มีความถูกต้องตามระยะทางที่เป็นจริง (ตามความโค้งของโลก) ด้วยการเพิ่มตัวแปรค่าคลาดเคลื่อนลงไป  เมื่อละติจูดมีการเปลี่ยนแปลงทุกๆ 1 องศา  จึงได้สูตรใหม่เป็นดังนี้
(จากภาพจะเห็นว่า distance1 และ distance2 มีความยาวไม่เท่ากัน (distance1 แคบกว่า)  ทั้งๆ ที่มีลองจิจูด 0 และลองจิจูด 50 เหมือนกัน ที่ละติจูดต่างกัน (0 กับ 60)  นี่จึงเป็นที่มาของค่าคลาดเคลื่อน หรือค่าความแตกต่างของระยะทางในแต่ละช่วงละติจูดครับ)


ค่า a และ b ขึ้นอยู่กับค่า X (latitude)

ตารางค่าความแตกต่างของ latitude และ longtitude ในแต่ละสถานที่ 
เมื่อ มีการเปลี่ยนแปลง latitude ทุกๆ 1 องศา 

ค่า a คือ column ที่ 3 และค่า b คือ column ที่ 5
ตารางอ้างอิงมาจาก  http://en.wikipedia.org/wiki/Latitude

ตัวอย่าง code javascript
/**
 * 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...  เมตร

1 ความคิดเห็น:

  1. ไม่ระบุชื่อ12 มกราคม 2559 15:17

    หากกำนดค่า x1y1 และค่า d มาให้สามารถหาค่า x2y2 ได้อย่างไรครับ

    ตอบลบ