Google Maps + Geocoder Services: Part II

จากตอนแรก ได้อธิบายถึงการทำงานของโค้ดและได้สร้างรายการการแก้ไขไปแล้วบางส่วน โดยมีรายการของงานที่ต้องทำคือ

  • ประกาศตัวแปร maps, marker และ latlng เป็นตัวแปรแบบ global
  • ลบการประกาศตัวแปร info และการแมพเหตุการณ์ ‘click‘ ในฟังก์ชั่น initWithMapStart และลบฟังก์ชั่น errorOccur
  • แก้ไข callback function ของ navigator.geolocation.getCurrentPosition
  • แก้ไขฟังก์ชั่น panToCurrentLocation
  • เพิ่มฟังก์ชั่น resolveGeocoding, displayGeocodingResult

โดยที่ 3 ข้อแรกนั้นได้แก้ไขไปแล้วเรียบร้อยใน Part I ในตอนนี้จะเป็นตอนสุดท้ายที่ถือได้ว่าเป็นหัวใจของเรื่องนี้ นั่นก็คือการส่งค่าพิกัดให้กับ Google และนำค่าที่ได้มาแสดงผลผ่าน InfoWindow จึงถือเป็นการสิ้นสุดการทำงานที่ได้วางไว้ข้างต้น

เริ่มส่วนที่เหลือกันเลยดีกว่า
Continue reading

Google Maps + Geocoder Services: Part I

จากบล็อกทั้ง 2 ตอนก่อนหน้านี้ (แนะนำการใช้งาน Google Maps V3 และ การใช้ Google Maps ร่วมกับความสามารถของ HTML5) ที่แนะนำการนำเอาแผนที่ของ Google Maps เข้ามาใช้ในเว็บไซต์และการหาตำแหน่งผู้ใช้โดยอาศัยความสามารถใหม่ที่เพิ่มเข้ามาใน HTML5 ซึ่งเว็บไซต์ส่วนใหญ่รองรับความสามารถนี้แล้ว

หลังจากพบตำแหน่งผู้ใช้เรียบร้อยแล้ว นักพัฒนาคงได้แค่เพียงแต่แหน่งพิกัดเท่านั้นซึ่งนั่นค่อนข้างยากหากต้องการพัฒนาแอพพลิเคชั่นที่จะส่งข้อมูลที่เกี่ยวข้องกับผู้ใช้ (หรือคิดว่าน่าจะมีประโยชน์กับผู้ใช้) โดยอาศัยตำแหน่งของผู้ใช้เป็นสำคัญ ดังนั้นที่เราต้องการหลังจากได้พิกัดตำแหน่งของผู้ใช้มาเรียบร้อยแล้ว ก็คงต้องสร้างฐานข้อมูลขนาดใหญ่ที่เก็บพิกัดตำแหน่งต่างๆ แล้วเชื่อมโยงไม่ยังชื่อสถานที่ที่ต้องการ ในกรุงเทพหรือต่างจังหวัดและขยายไปทั้งประเทศ
Continue reading

Google Maps V3 + HTML5

จากบล็อคก่อนหน้านี้ที่แนะนำการใช้งาน Google Maps V3 ให้ลองไปใช้ดูกันแล้วนั้น อย่างหนึ่งที่ไม่ชอบก็คือตำแหน่งเริ่มต้นนั้นมันตายตัวไปหน่อย คือกำหนดแล้วฝังเข้าไปในโค้ด JavaScript เลย แล้วถ้าเราต้องการทำเว็บแอพพลิเคชั่น (เพื่อให้มันสั้นลงต่อไปจะเรียก ‘แอพ’ หรือ ‘app’) ที่คำนึงถึงตำแหน่งผู้ใช้เป็นสำคัญ เช่น ตำแหน่งร้านอาหารที่น่าสนใจใกล้เคียงนั้นๆ หรือ ร้านค้าลดราคาใกล้ๆ เป็นต้น ดังนั้นอย่างแรกที่จำเป็นก็คือตำแหน่งที่เราอยู่ปัจจุบัน เพื่อนำมาข้อมูลที่เกี่ยวข้องมาแสดงผล

ซึ่งในตัวอย่างที่จะทำนี้เป็นการพัฒนาต่อจากบล็อคก่อนหน้านี้ดังนั้นก็ให้ดาวน์โหลดไฟล์ maps-demo.html.zip มาไว้ที่เครื่องก่อนเพื่อเตรียมตัวแก้ไข ซึ่งด้านในมีโค้ดด้านล่างนี้ (ดูตัวอย่างการแสดงผล)

<!DOCTYPE html>
<html>
  <head>
    <title>Google Maps V3 Demostrate</title>
    <script src="http://maps.googleapis.com/maps/api/js?sensor=true"></script>

    <script>
      function initWithMapStart() {
        var latlng = new google.maps.LatLng(13.75, 100.517);
        var mapOptions = {
                            zoom: 12,
                            center: latlng,
                            mapTypeId: google.maps.MapTypeId.ROADMAP
                        };
        var maps = new google.maps.Map(
                         document.getElementById('map-canvas'),
                         mapOptions
                   );

        var marker = new google.maps.Marker({
                            position: latlng,
                            map: maps,
                            animation: google.maps.Animation.DROP,
                            title: "Welcome to Thailand"
                        });

        var info = new google.maps.InfoWindow({
                            content: '<h1>Hello</h1>'
                        });
        google.maps.event.addListener(marker, 'click', function(){
            info.open(maps, marker);
        });
      }
    </script>

    <style>
      header,
      footer {
        text-align: center;
      }
      #map-canvas {
        display: block;
        margin: 20px auto;
        height: 400px;
        width: 640px;
        background-color: #ccc;
      }
    </style>
  </head>
  <body onload="initWithMapStart()">
    <header>
      <h1>Google Maps Demo</h1>
    <header>
    <article>
      <div id="map-canvas"></div>
    </article>
    <footer>
      <small><a href="http://we.in.th/">we.in.th</a></small>
    </footer>
  </body>
</html>

fig.1: โค้ดเดิมสำหรับแสดงผลแผนที่

จากที่บอกในข้างต้นว่าจะพัฒนาต่อจากของเดิมที่มีอยู่แล้ว โดยสิ่งที่เพิ่มขึ้นมากก็คือคุณสมบัติที่เรียกว่า Geolocation ซึ่งอยู่ใน HTML5 ทำสามารถดึงข้อมูลตำแหน่ง เช่น พิกัด (Latitude, Longitude) หรือ ที่อยู่ปัจจุบัน ของผู้ใช้ขณะนั้นมาแสดง แต่ก่อนที่จะแสดงนั้นเบราเซอร์จะขออนุญาตจากผู้ใช้ก่อนเสมอ หากไม่ต้องการให้เว็บไซต์นำตำแหน่งไปใช้งานก็ปฏิเสธได้ ใช้งานได้กับ IE9+, Firefox 3.5+, Safari5+ และ Google Chrome 4+ โดยที่ ดังนั้นให้เพิ่มโค้ดด้านล่างถัดจากบรรทัดที่ 32 ลงไป ดังนี้

if ( (typeof( window.navigator) != 'undefined') && !!navigator.geolocation ) {
    navigator.geolocation.getCurrentPosition(
        function(position) {
            panToCurrentLocation(position, maps, marker);
        },
        errorOccur
    );
}

fig.2: โค้ดสำหรับพิกัดที่ได้จากเบราเซอร์มาแสดงผล

Google Maps with Location Acquisition Notificationโดยที่

  • บรรทัดที่ 1 คือ การตรวจสอบว่าเบราเซอร์นี้รองรับ Geolocation หรือไม่
  • บรรทัดที่ 2-7 คือ การเรียกใช้งาน Geolocation ผ่านตัวแปร navigator ซึ่งก่อนจะดึงข้อมูลตำแหน่งของผู้ใช้เบราเซอร์จะขออนุญาตผู้ใช้ก่อนเสมอ เมื่อได้รับอนุญาตและได้ตำแหน่งผู้ใช้เรียบร้อยแล้วจะส่งไปยัง function(position) (บรรทัดที่ 3-5) โดยจะส่งไปให้ฟังก์ชั่น panToCurrentLocation ต่อไปพร้อมกับตัวแปร position, maps และ marker แต่ถ้าไม่สามารถอ่านพิกัดได้จะไปทำที่ฟังก์ชั่น errorOccur แทน

ถัดไปคือการสร้างฟังก์ชัน panToCurrentLocation และ errorOccur ขึ้นใหม่ ตามที่ได้ระบุไว้ใน fig.2 ดังนี้

function panToCurrentLocation(position, maps, marker) {
  var latlng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
  maps.setCenter( latlng );
  maps.panTo( latlng );

  marker.setPosition( latlng );
  marker.setAnimation( google.maps.Animation.DROP );
}

function errorOccur( error ) {
  console.log( error );
}

fig.3: JavaScript สำหรับเปลี่ยนตำแหน่งในแผนที่

โดยที่

  • บรรทัดที่ 2: สร้างพิกัดจากแผนที่ใหม่
  • บรรทัดที่ 3: กำหนดจุดศูนย์กลางให้แผ่นที่ใหม่
  • บรรทัดที่ 4: เลื่อนตำแหน่งของแผนที่ไปยังตำแหน่งใหม่ที่ได้
  • บรรทัดที่ 6: เปลี่ยนตำแหน่งของ marker ให้แสดงที่ตำแหน่งปัจจุบัน
  • บรรทัดที่ 7: กำหนดแอนนิเมชั่นที่จะใช้แสดงผล marker

จากที่ทดลองใช้งานการค้นหาตำแหน่งนั้นอาจคลาดเคลื่อนได้ไม่ถูกต้องทุกครั้ง ดูตัวอย่างได้ที่ไฟล์ maps-demo-navigation หรือดาวน์โหลดไฟล์ maps-demo-navigation.html

ข้อมูลเพิ่มเติม:

Google Maps V3 Introduction

ก่อนหน้านี้เคยเขียนวิธีการนำเอา Google Maps มาใช้งานกับเว็บไซต์ด้วยกัน 2 ตอน (1, 2) ตอนที่เขียนไปนั้น Google Maps เวอร์ชั่น 2.x ปัจจุบันอยู่ในสถานะ deprecated หรืออยู่ระหว่างการเลิกใช้งานนั้นเอง โดยตอนนี้ Google Maps เองก็พยายามเข็ญให้นักพัฒนาขยับไปใช้ Google Maps เวอร์ชั่นปัจจุบันคือเวอร์ชั่น 3 หรือเรียกสั้นๆ ว่า V3 ซึ่งการเรียกใช้งานนั้นง่ายกว่าเวอร์ชั่นเก่ามาก อย่างแรกที่เห็นได้ชัดคือเราไม่จำเป็นต้องสมัครเพื่อขอ API Key สำหรับใช้ดาวน์โหลด Google Maps Library อีกต่อไปแล้ว และการกำหนดค่าทั้งหมดใช้การกำหนดค่าผ่าน Object ที่เข้าใจได้ง่ายกว่าเวอร์ชั่นเก่ามาก
Continue reading

Google Maps :: แสดงผลข้อมูลการจราจรได้แล้ว

ข้อมูลการจราจรจาก อนุเสาวรีย์ชัยสมรภูมิ ไปยัง มหาวิทยาลัยธรรมศาสตร์ ท่าพระจันทร์

ข้อมูลการจราจรจาก อนุเสาวรีย์ชัยสมรภูมิ ไปยัง มหาวิทยาลัยธรรมศาสตร์ ท่าพระจันทร์

เป็นเรื่องดีไม่น้อยเลยครับ [สำหรับคนหลงทางบ่อยๆ แบบผม] เมื่อ Google Maps สามารถแสดงข้อมูลการจราจรของไทยได้แล้วไม่เพียงแค่เส้นทางการเดินทางนะครับ แต่เป็นข้อมูลการขนส่งด้วย เช่น จะขึ้นรถเมล์สายอะไร จากตรงไหน ใช้เวลาเท่าไหร่ และเวลาโดยประมาณที่จะถึงจุดหมายปลายทาง จากตัวอย่างด้านบน[คลิ๊กที่รูปภาพเพื่อดูของจริง] เป็นตัวอย่างที่ผมลองหาเส้นทางจาก จากอนุเสาวรีย์ชัยสมรภูมิ ไปยังมหาวิทยาลัยธรรมศาสตร์ ท่าพระจันทร์ ก็ได้ผลอย่างที่เห็นครับ นอกจากการเดินทางด้วยรถแล้ว ถ้าสังเกตุดีๆ จะเห็นข้อมูลเส้นทางเรือในแม่น้ำเจ้าพระยาด้วย

จากที่ลองค้นดูอีเมล์ที่ Google แจ้งการปรับปรุงให้ทราบเรื่อยๆ [แต่ไม่ได้สนใจ] ก็พบว่าข้อมูลการจราจร[GTrafficOverlay] เพิ่มเข้ามาตั้งแต่เวอร์ชั่น 2.81 ครับ [ปัจจุบันเวอร์ชั่น 2.170 อัพเดตวันที่ 6 สิงหาคม 2552]

Google Maps: http://maps.google.co.th
Issue Tracker: http://code.google.com/p/gmaps-api-issues/wiki/JavascriptMapsAPIChangelog

Introduce to Google Maps :: ยังไม่ได้หาย

ช่วงนี้ไม่ได้เขียนเกี่ยวกับ Google Maps นานครับ ก็ด้วยเหตุสำคัญๆ อยู่ 2 เรื่อง

  • อย่างแรกก็คือ Google Maps API Version 3 (V3) กำลังจะออกมาเป็นเวอร์ชั่นสมบูรณ์แล้ว [ขณะนี้อยู่ในช่วง beta] ซึ่งจะเปลี่ยนวิธีการเขียน script เยอะทีเดียว แต่เปลี่ยนไปในทางดีขึ้น และอีกอย่างิธีการพัฒนาในเวอร์ชั่นปัจจุบัน (V2) นั้นยังหาได้ตามเว็บไซต์ทั่วไปครับ เลยขอข้ามไปเขียน V3 เลยดีกว่า
  • ตอนนี้งานค่อนข้างยุ่งนิดหน่อย เรียกว่าหัวไม่ได้ว่างหางไม่ได้เว้นกันเลยทีเดียว ที่เขียนดองๆ ไว้ก็มีบ้าง แต่ยังไม่ถูกใจเท่าไหร่นัก เลยคิดว่าปล่อยออกมาตอน V3 ออกอย่างเป็นทางการจะดีกว่าครับ

แต่เรื่องที่อาจจะนำมาเขียนในตอนถัดๆ ไปก็น่าจะเป็น Objective-C ครับ เพราะร่ำๆ ไว้ตั้งแต่ blog เก่า จนกระทั่งยังมา blog นี้ก็ยังไม่ได้เขียนอะไรเท่าไหร่ เพราะว่าตอนนี้เปลี่ยนเครื่องคอมพิวเตอร์ที่ใช้ และไม่ได้ใช้ Windows นานจนจะลืมเมนูหมดแล้วครับ ไหนๆ ก็ใช้เครื่องนี้แล้วก็อยากลองเขียน App เล่นๆ สักตัวจะได้เป็นการลองวิชาไปในตัวด้วย ครับ :D

Introduce to Google Maps :: เตรียมพร้อมก่อนลุย

จาก blog ตอนที่แล้วพูดถึงวิธีเอา Google Maps มาใช้แบบง่ายๆ ให้เป็นเป็นตัวอย่างกันไปแล้ว ตอนนี้ก็อย่างที่ทิ้งท้ายไว้คราวก่อนที่ว่าจะเอาวิธิการกำหนดค่าต่างๆ เพื่อบอกให้กูเกิ้ลส่งข้อมูลที่พร้อมใช้งานให้เราได้มากที่สุด

หลังจากเราสมัครของ key เพื่อใช้ดึงข้อมูลจาก Google Maps เลื่อนลงมาด้านล่างจะเห็นตัวอย่างการดึงโค้ดไปใช้งาน ทั้ง JavaScript, Flash และ HTTP Services

<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;sensor=true_or_false&amp;key=ABCDEF" type="text/javascript"></script>

วิธีเรียกใช้งานแบบ JavaScript โดยที่ ABCDEF คือ key ที่กูเกิ้ลให้มา

ถ้าลองเปรียบเทียบตัวอย่างด้านบน และตัวอย่างจาก blog ตอนที่แล้ว จะเห็นได้ว่าโค้ดที่กูเกิ้ลให้มา มี parameters ตัวหนึ่งที่ผมได้ตัดออกไป นั่นคือ sensor ที่จะเป็นพารามิเตอร์ที่บอกให้กูเกิ้ลตรวจสอบว่าเครื่อง Client ที่เรียกเข้ามามี อุปกรณ์ GPS ด้วยหรือไม่ ค่าที่เป็นไปได้คือ true และ false (เป็นค่า default) Continue reading