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

Object Oriented Programming with JavaScript I

ช่วงนี้ได้ใช้ JavaScript แบบจริงๆ จังๆ กับเขาบ้าง เพราะต้องเอาไปต่อกับ REST ในหน้าเพจที่ทำแต่เห็นว่าบางอย่างมันต้องเขียนโค้ดแบบเดิมซ้ำไปซ้ำมาอยู่เรื่อยก็เลยเกิดความคิดไปหาวิธีใช้งานแบบ OOP สำหรับ JavaScript ซะหน่อยดีกว่า เคยอ่านผ่านๆ ตาหลายรอบแล้วเหมือนกันแต่ไม่ค่อยได้เอาจริงเอาจังกับมันซะเท่าไหร่ครับ ตอนนี้งาน JavaScript เข้าจังๆ ก็เลยมีเหตุจำเป็นให้ต้องลอง นอกจากนั้นก็เป็นข้อดีหลายอย่างของการเขียน OO ที่ผมชอบก็คือ Reusable, Inheritance และ Encapsulation แต่ต้องบอกก่อนว่าการเขียนโปรแกรมแบบนี้ไม่ใช่เรื่องแปลกอะไร เพราะมันก็ทำได้ตั้งนานแล้วครับ blog ตอนนี้ก็คงเป็นการเอามะพร้าวห้าวมาขายสวนอีกตามเคยครับ :)

ความจริง เท่าที่ได้อ่านวิธีการเขียนก็คงไม่ใช้ OOP เหมือน Java หรือ PHP เท่าไหร่ เพราะใช้วิธีการแปลกๆ ของ JavaScript มาช่วยแต่ถึงอย่างไรวิธีการนี้ก็ใช้แนวคิดของ OO มาช่วยพัฒนาเลยหยวนๆ ถือว่าเป็น OOP แล้วกันครับ :)

hello, world

...
<script type="text/javascript" charset="utf-8">
	function HelloWorld(msg) {
		var defaultMessage = "HELLO, WORLD!!!";
		this.message = msg || "สวัสดีชาวโลก";

		alert('Let me say');

		this.goodie = function(m) {
			m = m || "?";
			alert(m + " " + good());
		}

		var good = function(m) {
			return "good day";
		}
	}

	function sayHi(m) {
		var hi = new HelloWorld();
		hi.goodie(m);
		hi.goodie(hi.message);
		hi.goodie(hi.defaultMessage);
		hi.good("Goodbye");
	}
</script>

</head>

<body id="index" onload="sayHi('สวัสดี')">
...

ด้านบนก็เป็นตัวงอย่างของการเขียน JavaScript แบบ OO ครับ ในที่นี้ “HelloWorld” จะทำหน้าที่เป็นคลาสจะ ให้ function sayHi เรียกใช้งาน โดยที่แนบตัวแปร message ไปให้ด้วย ใน script นี้จะมี alert message ให้เราเห็นทั้งหมด 4 หน้าต่างครับ ตามนี้เลยครับ แต่ก่อนเริ่มอาจจะต้องอธิบายกันนิดหน่อยเพื่อว่าจะมีคนไม่รู้ เครื่องหมาย “||” นี้ผมไม่รู้ชื่อวิธีเรียกมันอย่างเป็นทางการนะครับ แต่วิธีการทำงานก็คือโปรแกรมจะเปรียบเทียบว่าตัวแปรที่อยู่ด้านซ้ายเป็นค่าว่าง (null) หรือเปล่าถ้าใช้จะนำค่าที่อยู่ด้านซ้ายมาให้โดยอัตโนมัติ

Constructor

Constructor

Constructor


เป็น Constructor ของคลาส HelloWorld คิดง่ายๆ ก็คือ ทุกอย่างที่ไม่ได้ครอบไว้ด้วย function จะเป็น Constructor ของคลาสทั้งหมด

Assign

Assign

Assign


ตัวอย่างของการส่งค่าให้กับฟังก์ชั่น goodie ที่เป็น method ที่อยู่ภายในคลาส HelloWorld

Public Access

Public Variable

Public Access


ตัวอย่างการเข้าถึง Public variable ของคลาส “HelloWorld” สังเกตุได้ที่ตัวแปร “message” ที่อยู่ภายในคลาส “HelloWorld” ด้านบนที่นำหน้าด้วย this มีค่าเหมือนกับการใส่ “public”

Private Access

Private Access

Private Access


เป็นการเข้าถึงตัวแปรที่เป็นระบุไว้ว่าเป็น private ผลที่ได้คือไม่สามารถเข้าถึงได้เห็นได้จากค่าทีไ่ด้ออกมาจะเป็น ‘?’

ส่วนหน้าต่างสุดท้ายจะไม่ปรากฎให้เห็นเนื่องจากฟังก์ชั่น ‘good’ ถูกระบุให้มีชนิดการเข้าถึงแบบ private

นอกจากนี้ยังเขียนให้คลาสสามารถสืบทอดคุณสมบัติกันได้เหมือนภาษา OOP ทั่วไป แต่ยังไงก็ขอติดไว้ตอนหน้าแล้วกันครับ

Live Demo

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