Unstructured Thoughts by Tanomsak
Random header image... Refresh for more!

การหาเส้นทางโดย Google Maps API (GDirections)

31 Jan 2010

เมื่อสองสามวันก่อน มี comment ถามมาว่า “อยากทราบว่าสามารถทำ google map บอกระยะทางได้ไหมค่ะ เช่น จากกรุงเทพไปเชียงใหม่เป็นระยะทางเท่าไหร่” ผมก็ตอบไปสั้นๆ วันนี้ขอขยายความเรื่องการหาเส้นทาง และการหาระยะทางจากจุดสองจุดในโดยใช้ Google Maps API ครับ เรื่องนี้เป็นเรื่องที่หลายๆคนสนใจ และเวปใหม่ที่ผมกำลังซุ่มทำอยู่ก็ใช้เยอะมากครับ

ใครอ่านภาษาอังกฤษคล่อง และต้องการข้อมูลแบบละเอียด ผมแนะน ลองอ่าน document ของ Google นะครับ http://code.google.com/apis/maps/documentation/services.html#Directions

เรามาเริ่มกันเลยดีกว่าครับ อ้อ! วิธีการข้างล่างจะเ็ป็นของ API v2 นะครับ เพราะว่าคนส่วนใหญ่คงยังใช้งาน version 2 กันอยู่

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"  xmlns:v="urn:schemas-microsoft-com:vml">
  <head>
    <title>Google Maps JavaScript API Example: Simple Directions</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
    <script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAeNsNnRXUdrpgSw3qfvhz5hRHchrjOSPM-moa2HMmJZw-0fE6VhTsARfVd9x1Dg8TowZALqHIOcO20g"
      type="text/javascript"></script>
    <script type="text/javascript">
	// Create a directions object and register a map and DIV to hold the
    // resulting computed directions

    var map;
    var directionsPanel;
    var directions;

    function initialize() {
      map = new GMap2(document.getElementById("map_canvas"));
      map.setCenter(new GLatLng(13.998, 100.5009), 15);
      directions = new GDirections(map);
      directions.load("from: 14.068, 100.6009 to: 13.8152, 100.5606"});
   }
  </script>
  </head> 

  <body onload="initialize()">
    <div id="map_canvas" style="width: 70%; height: 480px; float:left; border: 1px solid black;"></div>
    <br/>
  </body>
</html>

source code ข้างบนผมเอามาจาก Tutorial ของ Google ครับ การใช้ GDirection ง่ายมากครับ โดย code ส่วนที่เกี่ยวข้องจริงๆคือบรรทัดที่ 19-20

directions = new GDirections(map);
directions.load("from: 14.068, 100.6009 to: 13.8152, 100.5606");

บรรทัดที่ 19 เป็นการสร้าง GDirections และระบุว่าให้แสดงเส้นทางใบแผนที่ที่เราสร้างไว้ก่อนหน้านี้
บรรทัดที่ 20 เป็นการเรียกใช้บริการหาเส้นทางจาก Google โดยเราระบุ จุดเริ่มต้นกับปลายทาง

การระบุจุดเริ่มต้นกับปลายทาง สามารถระบุเป็ืนชื่อสถานที่ก็ได้นะครับ แต่ผมว่ามันไม่ค่อยแม่นเนื่องจาก Google ต้องตีความสถานที่ก่อน และระบบ reverse-geocode สำหรับของไทยยังไม่สมบูรณ์ครับ

แค่นี้เราก็จะได้เส้นทางเ็ป็น Polyline บนแผนที่ของเราแล้วครับ

ถ้าต้องการให้ มีข้อความบอกเส้นทางด้วย แบบว่า “ตรงไป 2 กม. แล้วเลี้ยวซ้าย” ก็ทำได้ง่ายๆครับ โดยสร้าง div สำหรับแสดงผลขึ้นมาแล้วระบุตอน new GDirections แบบนี้ครับ


directionsPanel = document.getElementById("route");
directions = new GDirections(map, directionsPanel );
directions.load("from: 14.068, 100.6009 to: 13.8152, 100.5606", {locale: 'th'});

ตรง {locale: ‘th’} เป็นการบอกว่าให้แสดงข้อความเป็นภาษาไทยครับ

ดูตัวอย่างการใช้หาเส้นทางจาก Google Maps API http://tanomsak.com/tutorial-7.html

Update: ตัวอย่างสำหรับกรณีมีจุดหมายสองจัดครับ http://tanomsak.com/tutorial-7_1.html

ถ้าผมอธิบา่ยตรงไหนไม่เข้าใจ แนะนำได้ใน Comment เหมือนเดิมนะครับ

  • mie
    สงสัยอ่ะคร๊ะ กูเกิลจะใช้เมตตอดอะรัยคร๊ะ ในการคำนวณเส้นทาง จากจุด A ไป B
    ถ้า สมมุติว่า การเดินทางจากจุด A ไป B แต่ ณ สถานที่ตรงนั้น เป็น ลักษณะวงเวียนสี่เหลี่ยม
    แร้วจุด A กะ จุด B อยู่คนละด้านกัน
    โดยที่ระยะทางจากด้านซ้ายแระด้านขวาของจุด A สามารถไปจุด B ได้

    กูเกิลจะคำนวณเลือกไปทางไหนอ่ะคร๊ะ แระทำมั้ยถึงเลือกด้านนั้นอะคร๊ะ
    มีวิธีคิดยังไงอ่ะคร๊ะ


    คำถามนี้โดนอาจารย์ถามมาอ่ะคร๊ะ ตอน present เรย งงมากๆ
    รบกวนด้วยนะคร๊ะ
  • mie
    แระการเชื่อมต่อ กะ ดาต้าเบส ต้องทำยังไงอ่ะคร๊ะ
  • tanomsak
    ผมเคยเขียนวิธีดึงข้อมูลจาก db ไว้ครับ อันนี้เป็นวิธีที่ผมใช้ครับ

    http://www.tanomsak.com/index.php/2008/12/googl...
  • tanomsak
    ผมไม่ทราบลายละเอียดเหมือนกันครับ ผมลองหาดูเหมือนจะมีคนเคยถามและตอบไว้ที่ link นี้ครับ

    http://answers.google.com/answers/threadview/id...

    แต่ว่าวิธีิการจริงๆของ Google เราคงไม่ทรา่บครับ แต่ใน Link อธิบาย algorithm ทั่วไปของการหา shortest path ของ 2 จุดครับ
  • euromous
    ไม่ทราบว่าถ้าผมต้องการให้ google map มันคำนวณเส้นทางที่เราจะไปซึ่งมีทั้งหมดหลายจุดจะสามารถทำได้ไหมครับ
    ถ้าสมมติว่าผมมี lat/lons และจุดเริ่มต้นอยู่แล้ว แต่ผมต้องการจะให้ google map คำนวณเส้นทางที่ใกล้ที่สุดให้ในกรณีที่ผมต้องการเดินทางไปทั้งตามจุดต่างๆ โดยคำนวณจากจุดเริ่มต้นซึึ่งข้อมูลของ lat/lons นี้ผมจะดึงมาจาก Database แล้วส่งไปเป็น parameter เวลา direction.load โดยไม่ได้เรียงลำดับ เช่น ผมต้องการเดินทางจากจุด A ไปทั้งหมดอีก 5 จุด แล้วผม get lat/lons จาก db แล้วส่งไปโดยไม่ได้เรียงลำดับว่าจะต้องไปที่ไหนก่อนเนื่องจากผมไม่ทราบทางว่า lat/lons ไหนจะอยู่ไกลหรือใกล้กว่ากัน แต่ผมมีต้นทางให้เพียงอย่างเดียว ถ้าเป็นกรณีนี้ google map สามารถจัดการให้เราได้ไหมครับ
    ขอบคุณครับ

    ปล. เวปนี้มีประโยชน์มากเลยครับ ^^
  • tanomsak
    Google Maps API ไม่ได้หา shortest path ในการผ่านจุดทั้งหมดให้ (Travelling Salesman problem) แต่จะหาเส้นทางตามลำดับจากแต่ละจุดที่เราใส่ไปครับ
  • euromous
    แล้วแบบนี้พอจะมีวิธีหา shortest path จาก google map ไหมครับ
    เพราะถ้าดูจากค่า lat/lons แล้วเนี่ยไม่สามารถบอกได้ว่าจุดไหนจะใกล้หรือไกลกว่ากันน่ะครับ
    ขอบคุณครับ ^^"
  • tanomsak
    Service จาก Google ไม่มีครับ ต้องคำนวณเอง มีคนทำตัวอย่าง อธิบายไว้ลองอ่้านดูนะครับ ผมไม่เคยไล่เหมือนกันว่าคำนวณยังไง และใช้งานแบบไหนครับ

    http://www.gebweb.net/optimap/
    http://gebweb.net/blogpost/2007/07/05/behind-th...
  • euromous
    เดี๋ยวลองอ่านดูครับ ขอบคุณมากครับ
  • euromous
    ูู^^
  • hunt
    ถ้าต้องการเพิ่มจุดหมายมากกว่า 2 จุดล่ะครับ จะต้องแก้ไขโค้ดอย่างไร

    ขอบคุณครับ
  • tanomsak
    แค่เพิ่มจุดที่สาม เข้าไปแบบนี้ครับ

    directions.load("from: 14.068, 100.6009 to: 13.8152, 100.5606 to: 13.8222, 100.54",{locale: 'th'});

    แต่ Google จะ return เส้นทางกลับมาเป็นเส้นทางเดียวกัน แบบว่า จาก จุด 1 ไปจุด 2 จากจุด 2 ไปจุด 3 เลยครับ

    ลองดูตัวอย่าง http://tanomsak.com/tutorial-7_1.html ครับ
  • iampz
    รู้สึกว่าในส่วน source code จะเปลี่ยนเป็น entites สองรอบนะครับ เดี๋ยวจะงง ( < -> &lt; )
  • tanomsak
    จริงด้วยครับ ผมแก้ไขแล้วครับ ตอน update รอบสุดท้าย ไม่ทันสังเกตุ

    ขอบคุณ @iampz ครับทีช่วยดู :)
blog comments powered by Disqus