การใช้ Google Maps API เพื่อสร้าง Google Map Mashup อย่างง่าย
เรียบเรียงโดย รองศาสตราจารย์สวัสดิ์ชัย เกรียงไกรเพชร
ภาควิชาวิศวกรรมสำรวจ คณะวิศวกรรมศาสตร์
จุฬาลงกรณ์มหาวิทยาลัย
สารบัญ
บทนำ
Google Maps API
ช่วยให้เราสามารถพัฒนาโปรแกรมเพื่อแทรก Google Maps
เข้าไปเป็นองค์ประกอบส่วนหนึ่งในเว็บเพจที่ต้องการได้โดยเขียนเป็นรหัส html และ
javascript ในรูปแบบที่ไม่สลับซับซ้อนนักสำหรับงานแผนที่ง่ายๆ Google Maps API
มีขีดความสามารถกว้างขวางเน้นในด้านการนำเสนอข้อมูลแผนที่ในลักษณะหมุดปัก (Push pin
/ Place marker) ซึ่งสามารถกำหนดให้แสดงข้อมูลประกอบแผนที่เมื่อผู้ใช้คลิกที่ตัว
push pin /marker นั้นๆ หรือองค์แผนที่แบบเส้น (Polyline) พื้นที่ (Polygon) และภาพ
(Ground overlay) บริการด้านแผนที่ของ Google นี้เริ่มต้นตั้งแต่กลางปีคศ.
2005 เป็นบริการฟรี
จัดให้แก่ผู้ใช้ทั่วโลกโดยคาดหวังที่จะใช้การโฆษณาบนแผนที่เป็นรายได้กลับคืนแต่ในระยะแรกจะยังไม่มีการโฆษณาดังกล่าว
ในการจัดบริการแผนที่นี้
ส่วนประกอบพื้นฐานสำคัญที่ดึงดูดใจให้มีผู้ใช้งานแผนที่ของกูเกิ้ลเป็นอย่างมากคือแผนที่และภาพถ่ายดาวเทียมคุณภาพดีซึ่งครอบคลุมทั่วพื้นผิวโลกในมาตราส่วนต่างๆ
ตามความเหมาะสม
ทำให้การพัฒนาต่อยอดจากสิ่งที่กูเกิ้ลจัดไว้ให้แล้วเป็นงานที่น่าสนใจ
ไม่ต้องลงทุนจัดหาทรัพยากรที่หายากและราคาแพงเองมาใช้ในโครงการอย่างที่เคยเป็นในอดีต
เนื่องจากจัดทำ Google Maps API
เป็นโปรแกรมรหัสเปิด (Open source program) ในภาษาจาวาสคริปต์
จึงทำให้ผู้ใช้ที่เป็นนักพัฒนาโปรแกรมสามารถเข้าไปดูรายละเอียดของรหัสโปรแกรมได้สะดวก
รวมทั้งสามารถปรับเปลี่ยนแก้ไขโปรแกรมได้ ทำให้ Google Maps API
มีผู้ใช้กันอย่างกว้างขวาง เหตุผลสำคัญอีก 2
อย่างที่ส่งเสริมให้มีผู้ใช้มากคือแผนที่และภาพถ่ายดาวเทียมคุณภาพดีที่ใช้สนับสนุนการทำแผนที่มีให้ครอบคลุมพื้นที่ต่างๆ
อย่างกว้างขวาง และชื่อเสียงของโปรแกรม Google Earth เสริมด้วยบริการ Google Local
ที่มีมาก่อน
บทความนี้จะกล่าวถึงการใช้ Google Maps API
ทำโปรแกรมประเภทที่เรียกว่า Map mashup
อย่างง่ายเพื่อเป็นตัวอย่างให้ผู้สนใจได้ทำขึ้นเพื่อเริ่มต้นทดลองใช้งาน
หรือเรียนรู้ทำความเข้าใจในเทคโนโลยีและขีดความสามารถของ Google Maps
API
Google Maps
mashup
คำว่า mashup หรือ "mash-up"
เป็นศัพท์เฉพาะในแวดวงของนักพัฒนา application แบบ client-server
ประเภทที่ทำเติมต่อขึ้นเองโดยใช้software tool และ
ทรัพยากรที่ทางผู้ให้บริการจัดไว้ให้ เป็นคำใหม่ที่ใช้กันหนาหูในปี 2005
มีที่มาจากวงการเพลงเมื่อนักจัดรายการเพลงเกิดความคิดแหวกแนวโดยทดลองเปิดเพลง 2
เพลงพร้อมๆกัน ทำให้เกิดเสียงเพลงที่ผสมผสานที่แปลก และบางครั้งมีความไพเราะ
และเรียกขานผลที่เกิดขึ้นว่า mashup
mashup
ที่กล่าวถึงกันมากในแวดวงนักพัฒนาแอพลิเคชันที่ใช้บนอินเตอร์เน็ตมีองค์ประกอบอย่างน้อย
2 ส่วน ส่วนแรกคือ application program interface (API)
และทรัพยากรสนับสนุนจากเซิร์ฟเวอร์ของผู้ให้บริการ และส่วนที่ 2
คือโปรแกรมและทรัพยากรของผู้พัฒนาแอพลิเคชันนั้น
(ติดตั้งอยู่ที่เว็บไซท์ของผู้พัฒนา) ต้วอย่างกรณีของ Google Maps mashup
ก็จะหมายถึงเว็บเพจที่นักพัฒนาเว็บไซท์สร้างขึ้นให้มีส่วนประกอบที่เป็นแผนที่ที่สามารถทำงานแบบโต้ตอบกับผู้ใช้ได้
โดยมีแผนที่ฐานเป็นส่วนที่ Google จัดไว้ให้แล้ว
และมีข้อมูลแผนที่ของตนเองซ้อนทับในลักษณะหมุดปัก
(ที่สามารถแสดงข้อความซึ่งแฝงอยู่เมื่อผู้ใช้คลิกที่หมุดเหล่านั้น)
หรือลักษณะอื่นที่สลับซับซ้อนกว่านั้น
ความรู้ความชำนาญที่ควรมีในผู้ใช้ Google Maps
API
ในการจัดทำ
Google Maps mashup ระดับต้นจำเป็นต้องใช้ความรู้พื้นฐานในการสร้าง web page
ดัวยภาษา html/ xhtml การเขียนโปรแกรม javascript
ความรู้เรื่องการแผนที่และภูมิศาสตร์ และ ความรู้ในด้าน xml technology
ในระดับปฏิบัติการที่สูงขึ้นมีความต้องการที่สลับซับซ้อนมากขึ้นตามลำดับ
ในที่นี้ขอกล่าวโดยสรุปเกี่ยวกับความรู้พื้นฐานเบื้องต้นที่จำเป็นในงานพัฒนา
Google Maps mashup ซึ่งควรมี ดังนี้
1. html/ xhtml
2. javascript
3.
ความรู้พื้นฐานวิชาภูมิศาสตร์
และการแผนที่
ความรู้เพิ่มเติมที่จำเป็นสำหรับงานพัฒนาขั้นกลาง-สูง
1.
XML technology
2. AJAX (javascript + xml)
3. JSON (JavaScript Object
Notation)
ความรู้เพิ่มเติมสำหรับงานใหญ่ งานพิเศษ
1. Server side
scripting (PHP, etc)
2. Web database software (MySql,
etc)
ความรู้อื่นที่เกี่ยวข้อง มีทั้งที่เป็นเรื่องกราฟิก แผนที่ และ
อื่นๆ
1. Web map service (WMS) concept
2. SVG (Scalable Vector
Graphic)
3. GML (Geographic Markup Language)
4. GIS, GPS,
Cartography
5. etcs.
ขั้นตอนหลักในการดำเนินการจัดทำ Google Maps
mashup
1. ยื่นคำขอ API Key สำหรับ URL ของเว็บไซต์ที่จะใช้บริการ Google Maps API เว็บไซต์นั้นเป็นที่ที่เราจะนำเว็บเพจที่มี Google Maps เป็นองค์ประกอบไปวางไว้
(URL ที่ยื่นคำขอรับ API Key:- http://www.google.com/apis/maps/signup.html)
2. เขียนโปรแกรมสร้างเว็บเพจที่ใช้ Google Maps API ช่วยสร้างแผนที่
(แหล่งเอกสารอ้างอิง:- http://www.google.com/apis/maps/documentation/reference.html)
3. Upload
งานที่ทำเสร็จแล้วขึ้นสู่เว็บไซท์ และทดลองใช้งาน
[--ไปสารบัญ--]
เค้าโครงของแฟ้มข้อมูล HTML สำหรับการสร้าง
Google Maps Mashup อย่างง่าย
เนื่องจากการแสดงตัวอย่างในบทความนี้ละเว้นส่วนที่มีซ้ำกันเพื่อให้ประหยัดเนื้อที่
และมีความกระชับมากขึ้น ดังนั้น
ส่วนที่เป็นเค้าโครงแฟ้มข้อมูลซึ่งต้องใช้ในทุกตัวอย่างจึงเป็นสิ่งสำคัญที่ควรกล่าวถึงก่อน
จึงขอนำมาแสดงไว้ ดังนี้
<!DOCTYPE html "-//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">
<head>
<meta
http-equiv="content-type" content="text/html;
charset=UTF-8"/>
<title>My Google Maps
Mash-up</title>
<script
src="http://maps.google.com/maps?file=api&v=2&key=abcdefg..."
type="text/javascript"></script>
</head>
<body
onload='initialize()' onunload='unloadGmap()'>
<!-- body content
here -->
<!-- some javascript here
-->
</body>
</html>
ข้อความ "v=2" ซึ่งแทรกอยู่ใน
"http://maps.google.com/maps?file=api&v=2 ..." เป็นพารามีเตอร์ระบุความต้องการขอใช้
Google Maps API เวอร์ชัน 2 เพื่อทำการประมวลผล
ในส่วน <!-- body content here -->
ควรมี <div id='map_canvas' /> เพื่อทำหน้าที่เป็นกรอบของขอบเขตแสดงแผนที่
และ <!-- some javascript here -->
เตรียมไว้เป็นที่ของจาวาสคริปต์ซึ่งจะนำมาแทรกภายหลัง
ตัวอย่างพื้นฐานเพื่อการเริ่มต้น
ตัวอย่างทั้งหมดที่ยกมาแสดงในที่นี้ส่วนใหญ่จะมีให้เฉพาะส่วนประกอบที่เกี่ยวกับการใช้ Google Maps API
เท่านั้นเพื่อความกระชับ ทั้งนี้ยกเว้นตัวอย่างแรกที่ทำหน้าที่ kick start
ให้กับผู้ใช้
นอกจากนั้นยังได้ละเว้นส่วนประกอบของโปรแกรมที่ทำหน้าที่สำคัญที่ควรมีในการทำงานจริง
เช่น ตรวจสอบความสามารถของบราวเซอร์ที่ผู้ใช้ติดตั้งอยู่ว่าทำงานเข้ากันได้หรือไม่
การตรวจสอบป้องกันการทำงานผิดพลาด การทำให้มีคุณลักษณะเป็นมิตรกับผู้ใช้ ฯลฯ
ตัวอย่าง 1
การสร้างแผนที่อย่างง่าย (The "Hello, World" of Google
Maps)
ตัวอย่างแรกนี้แสดงการสร้างแผนที่อย่างง่ายให้ศูนย์กลางขอบเขตแผนที่อยู่ที่เมือง
Palo Alto แห่งรัฐแคลิฟอร์เนียซึ่งมีพิกัดภูมิศาสตร์ ละติจูด / ลองจิจูดเป็น 37.4419, -122.1419 องศา
ตามลำดับ (สำหรับกรุงเทพฯ ให้ใช้ 13.80608,
100.57983)
หมายเหตุ
ข้อความที่อยู่ภายใน
comment tag เช่น
<!-- HTML_comment --> หรือ /* javascript_comment */ เป็นข้อความอธิบายแทรกภายในรหัสโปรแกรม
<!DOCTYPE html "-//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">
<head>
<meta
http-equiv="content-type" content="text/html;
charset=utf-8"/>
<title>Google Maps JavaScript API
Example</title>
<!-- โหลดโปรแกรมสนับสนุนหลักในการทำงาน (Loading the Google Maps
API) โดยใช้ script element -->
<script
src="http://maps.google.com/maps?file=api&v=2&key=abcdefg..."type="text/javascript"></script>
<script
type="text/javascript">
function initialize() {
if (GBrowserIsCompatible()) {
/*
GMap2
เป็นวัตถุพื้นฐานในการสร้างแผนที่กูเกิ้ล จัดวางวัตถุนี้ไว้ที่ element
ซึ่งมี id="map_canvas"
*/
var
map = new GMap2(document.getElementById("map_canvas"));
/* จัดคุณลักษณะแผนที่ โดยใช้ GMap2.setCenter method ส่วนประกอบที่ใช้มีพิกัดตำแหน่ง และ ระดับการย่อขยายแผนที่
*/
/* กำหนดพิกัดละติจูดและลองจิจูดด้วย
object GLatLng(ละติจูด,ลองจิจูด)
ให้ใช้ค่าทศนิยม */
map.setCenter(new
GLatLng(37.4419, -122.1419), 13);
}
}
</script>
</head>
<!-- กำหนด script ที่ทำงานเมื่อเกิดอุบัติการณ์ onload และ onunload โดยใช้
attribute ชื่อเดียวกันกับอุบัติการณ์ -->
<body
onload="initialize()" onunload="GUnload()">
<!-- จัดที่สำหรับเป็นขอบเขตแผนที่ โดยใช้ div element ตั้งค่า id="map_canvas"
ให้เรียกใช้ได้สะดวก ใช้ style กำหนดความกว้างและสูง -->
<div
id="map_canvas" style="width: 500px; height:
300px"></div>
</body>
</html>
คลิก map-simple.html
เพื่อดูผลงานที่ทำเสร็จแล้ว
[--ไปสารบัญ--]
ตัวอย่าง 2 การสร้างแผนที่ให้เลื่อนภาพ (animate.html)
ตัวอย่างแผนที่ซึ่งเคลื่อนตำแหน่งได้พร้อมมีแอนิเมชัน
แผนที่ในตัวอย่างนี้เมื่อเปิดแสดงผลแล้ว
จะนิ่งอยู่ 1 วินาที แล้วจะเลื่อนภาพไปยังตำแหน่งใหม่
var map = new
GMap2(document.getElementById("map_canvas"));
map.setCenter(new
GLatLng(37.4419, -122.1419), 13);
window.setTimeout(function()
{
map.panTo(new GLatLng(37.4569, -122.1569));
}, 1000);
คลิก map-animate.html
เพื่อดูผลงานที่ทำเสร็จแล้ว
[--ไปสารบัญ--]
การกำหนดให้มีตัวควบคุมบนแผนที่
เราสามารถสร้างองค์ประกอบที่ทำหน้าที่ปฏิสัมพันธ์กับผู้ใช้เพื่อควบคุมการใช้งานแผนที่ได้โดยใช้
addControl
method
ตัวอย่าง 3 การสร้างตัวควบคุมแผนที่ (control-maptypes.html)
ตัวอย่างต่อไปนี้
แสดงการสร้างตัวควบคุมแผนที่ให้เป็นองค์ประกอบส่วนหนึ่งบนแผนที่โดยใช้
GMapTypeControl() ซึ่งปกติจะมีตัวเลือกแสดงภาพบนฉากหลังเป็น 3 แบบ Map/ Satellite/
และ Hybrid เพื่อให้เห็นความยืดหยุ่นของโปรแกรมที่สามารถถอดถอนชนิดแผนที่ที่ไม่ต้องการออกไปด้วย
GMap2.removeMapType() หรือ เพิ่มชนิดแผนที่ที่ต้องการด้วย GMap2.addMapType()
จึงแสดงตัวอย่างการถอดถอน Hybrid
map ด้วยคำสั่ง map.removeMapType(G_HYBRID_MAP) หลังจากนั้นจึงสร้างตัวควบคุมแผนที่ด้วยคำสั่ง addControl() ทำให้ผลลัพธ์เป็นแผนที่ที่มีตัวเลือกเพียง 2
แบบคือ Map และ Satellite
var map = new GMap2(document.getElementById("map_canvas"),
{
size: new GSize(640,320) }
);
map.removeMapType(G_HYBRID_MAP);
map.setCenter(new
GLatLng(42.366662,-71.106262), 11);
var mapControl = new
GMapTypeControl();
map.addControl(mapControl);
map.addControl(new
GLargeMapControl());
คลิก control-maptypes.html
เพื่อดูผลงานที่ทำเสร็จแล้ว
[--ไปสารบัญ--]
ตัวรับฟังอุบัติการณ์
(Event
Listener)
เนื่องจากอุบัติการณ์ทั้งหลายต้องขึ้นทะเบียน
(register) ไว้ในสารบบก่อนจึงจะมีผลในการใช้งาน (GEvent
namespace
ทำหน้าที่นี้) กล่าวคือ
สามารถตอบสนองต่อการใช้งานแผนที่แบบโต้ตอบได้
การจัดสารบบเพื่อรับฟังอุบัติการณ์ดังกล่าวทำขึ้นได้โดยใช้
GEvent.addListener method เป็นตัวกระทำ
ตัวอย่าง (event-simple.html)
ตัวอย่างการใช้อุบัติการณ์ "click"
เป็นตัวฉุด (หรือลั่นไก) ให้เกิดการแสดงข้อความ "You clicked the
map." โดยแสดงผลทุกครั้งที่ผู้ใช้คลิกในบริเวณแผนที่
var map = new
GMap2(document.getElementById("map"));
map.setCenter(new GLatLng(37.4419,
-122.1419), 13);
GEvent.addListener(map, "click", function() {
alert("You
clicked the map.");
});
คลิก event-simple.html
เพื่อดูผลงานที่ทำเสร็จแล้ว
ตัวอย่าง 4 (event-context.html)
ตัวอย่างต่อไปนี้สาธิตการใช้อุบัติการณ์
"moveend" เป็นตัวฉุดให้เกิดการแสดงค่าพิกัดละติจูด-ลองจิจูด
ของจุดกลางแผนที่ค่าใหม่ล่าสุด
โดยแสดงผลทุกครั้งที่การเลื่อนแผนที่จากที่หนึ่งไปยังที่ใหม่เสร็จสิ้นลง
var map = new GMap2(document.getElementById("map"));
GEvent.addListener(map, "moveend", function() {
var center =
map.getCenter();
document.getElementById("message").innerHTML =
center.toString();
}
);
map.setCenter(new
GLatLng(37.4419, -122.1419), 13);
คลิก event-context.html
เพื่อดูผลงานที่ทำเสร็จแล้ว
[--ไปสารบัญ--]
การเปิด
Info
Window
"Info
Window" เป็นบัญชรแสดงผลแบบผุดขึ้น (pop-up) ที่เป็นได้ทั้งข้อความและ/หรือรูปภาพ
มีไว้เพื่อใช้นำเสนอข้อมูล ณ ตำแหน่งที่ต้องการบนแผนที่ สร้างขึ้นได้ด้วย
openInfoWindow method โดยป้อนค่าพิกัดตำแหน่งและ html
element เป็นองค์ประกอบ ทั้งนี้ html element คือส่วนของเนื้อหาที่เขียนเป็นรหัส html ตามที่ต้องการนำเสนอใน Info Window หรือใช้จาวาสคริปต์สร้างเป็น html element ก็ได้
ตัวอย่าง 5 การเปิด Info
Window (map-infowindow.html)
ตัวอย่างนี้จะเปิด "Info Window" สำหรับตำแหน่งจุดกลางแผนที่โดยมีข้อความ "Hello, world" แสดงอยู่ภายในบัญชรที่ผุดขึ้นนั้น
var map = new
GMap2(document.getElementById("map"));
map.setCenter(new GLatLng(37.4419,
-122.1419),
13);
map.openInfoWindow(map.getCenter(),document.createTextNode("Hello,
world"));
คลิก map-infowindow.html เพื่อดูผลงานที่ทำเสร็จแล้ว
[--ไปสารบัญ--]
วัตถุซ้อนทับบนแผนที่
(Map
Overlays)
Overlays
หมายถึงวัตถุที่สร้างขึ้นวางทับอยู่บนแผนที่ถนนและ/หรือภาพถ่ายดาวเทียมที่เป็นฉากหลัง
(เช่น marker, polyline, polygon, และ ground overlay) ตัวอย่างนี้แสดงการสร้าง
marker จำนวน 10 ตัวเพื่อวางไว้ที่ตำแหน่งต่างๆ แบบสุ่ม ในรหัสของตัวอย่างข้างล่าง
คำสั่ง GMarker(point) ทำหน้าที่เขียน marker ณ
ตำแหน่งที่กำหนดด้วยค่าละติจูด-ลองจิจูดจากตัวแปร "point"
โดยใช้สัญกรปริยาย (default icon)
ซึ่งมีลักษณะเป็นหมุดปักอยู่บนแผนที่
ตัวอย่าง Simple marker
(marker-simple.html)
Marker ที่สร้างขึ้นใช้สัญกรแบบปริยายซึ่งมีลักษณะเป็นหมุดปักสีแดง
ในโปรแกรมไม่ต้องระบุคุณลักษณะใดๆ
ของสัญกร
var map = new
GMap2(document.getElementById("map_canvas"));
map.setCenter(new
GLatLng(37.4419, -122.1419), 13);
/* สร้าง marker วางไว้ในที่ต่างๆ
แบบสุ่มบนแผนที่จำนวน 10 ตัว
*/
// Add 10 markers to the map at random locations
var bounds =
map.getBounds();
var southWest = bounds.getSouthWest();
var northEast =
bounds.getNorthEast();
var lngSpan = northEast.lng() -
southWest.lng();
var latSpan = northEast.lat() - southWest.lat();
for (var
i = 0; i < 10; i++) {
var point = new GLatLng(southWest.lat() + latSpan *
Math.random(),
southWest.lng() + lngSpan * Math.random());
/* สร้างหมุดปักโดยมีสัญกรแบบปริยาย
*/
map.addOverlay(new GMarker(point));
}
คลิก marker-simple.html
เพื่อดูผลงานที่ทำเสร็จแล้ว
[--ไปสารบัญ--]
ตัวอย่าง Marker with simple
icon
(icon-simple.html)
Marker ที่สร้างขึ้นใช้สัญกรแบบง่ายๆ
ซึ่งมีลักษณะเป็นหมุดปักสีน้ำเงิน
ในโปรแกรมต้องระบุคุณลักษณะของสัญกร
var map = new
GMap2(document.getElementById("map_canvas"));
map.addControl(new
GSmallMapControl());
map.setCenter(new GLatLng(37.4419, -122.1419),
13);
/* สร้างสัญกรโดยเอาคุณลักษณะของตัวปริยายเป็นต้นแบบ
*/
var blueIcon = new GIcon(G_DEFAULT_ICON);
blueIcon.image =
"http://www.google.com/intl/en_us/mapfiles/ms/micons/blue-dot.png";
/*
ตั้งค่าสัญกรเพื่อเตรียมไว้ใช้ */
markerOptions = {
icon:blueIcon };
/* ใช้สัญกรในการเขียน marker วางไว้ในที่ต่างๆ แบบสุ่มบนแผนที่จำนวน 10 ตัว */
var bounds = map.getBounds();
var
southWest = bounds.getSouthWest();
var northEast =
bounds.getNorthEast();
var lngSpan = northEast.lng() -
southWest.lng();
var latSpan = northEast.lat() - southWest.lat();
for (var
i = 0; i < 10; i++) {
var point = new GLatLng(southWest.lat() + latSpan *
Math.random(),
southWest.lng() + lngSpan * Math.random());
/* สร้างหมุดปักโดยมีสัญกรแบบที่เตรียมไว้
*/
map.addOverlay(new GMarker(point, markerOptions));
}
คลิก icon-simple.html
เพื่อดูผลงานที่ทำเสร็จแล้ว
ตัวอย่าง Simple
Polyline
ตัวอย่างนี้สาธิตการสร้าง
Polyline อย่างง่าย เส้นที่สร้างควรเป็นเส้นสั้นๆ
ระยะทางไม่กี่กิโลเมตร
/* รูปแบบที่ใช้ในการสร้างวัตถุ GPolyline([list_of_points],
"stroke_color_code", stroke_thickness */
var polyline = new
GPolyline([
new GLatLng(37.4419, -122.1419),
new GLatLng(37.4519,
-122.1519)
], "#ff0000", 10);
map.addOverlay(polyline);
คลิก polyline-simple.html
เพื่อดูผลงานที่ทำเสร็จแล้ว
ตัวอย่าง Geodesic
Polyline
ตัวอย่างนี้สาธิตการสร้าง
Geodesic Polyline
ซึ่งเหมาะกับเส้นที่มีความยาวมาก เช่น ยาวหลายร้อยกิโลเมตร
เส้นที่ได้จะเป็นเส้นโค้งวงกลมใหญ่บนแผนที่
var map = new
GMap2(document.getElementById("map_canvas"));
map.setCenter(new
GLatLng(45.828799,-105.292969), 2);
/* กำหนดคุณลักษณะ geodesic:true ในแบบ
object literal เพื่อเตรียมไว้ใช้ */
var
polyOptions = {geodesic:true};
/* รูปแบบที่ใช้ในการสร้างวัตถุ GPolyline([list_of_points],
"stroke_color_code", stroke_thickness, stroke_opacity, polyOptions */
var
polyline = new GPolyline([
new GLatLng(40.65642, -73.7883),
new
GLatLng(61.1699849, -149.944496)
], "#ff0000", 10, 1, polyOptions);/* นำคุณลักษณะที่กำหนดไว้มาใช้กับ new
GPolyline() */
map.addOverlay(polyline);
คลิก polyline-geodesic.html
เพื่อดูผลงานที่ทำเสร็จแล้ว
ตัวอย่าง Simple
Polygon
ตัวอย่างนี้สาธิตการสร้างรูปปิด (Polygon) อย่างง่าย ทุกครั้งที่ผู้ใช้คลิกภายในแผนที่นี้
จะเกิดรูปปิดสี่เหลี่ยมจตุรัสขนาดประมาณ 10 หน่วย pixel
ในบริเวณนั้น
var map = new
GMap2(document.getElementById("map_canvas"));
map.setCenter(new
GLatLng(37.4419, -122.1419), 13);
map.addControl(new
GSmallMapControl());
GEvent.addListener(map, 'click', function(overlay,
latlng) {
var lat = latlng.lat();
var lon = latlng.lng();
var latOffset
= 0.01;
var lonOffset = 0.01;
/* รูปแบบที่ใช้ในการสร้างวัตถุรูปปิด
GPolygon([list_of_points], "stroke_color_code", stroke_thickness,
stroke_opacity, "fill_color_code", fill_opacity) */
var polygon = new
GPolygon([
new GLatLng(lat, lon - lonOffset),
new GLatLng(lat + latOffset,
lon),
new GLatLng(lat, lon + lonOffset),
new GLatLng(lat - latOffset,
lon),
new GLatLng(lat, lon - lonOffset)
], "#f33f00", 5, 1, "#ff0000",
0.2);
map.addOverlay(polygon);
});
คลิก polygon-simple.html
เพื่อดูผลงานที่ทำเสร็จแล้ว
การตอบสนองต่ออุบัติการณ์
"click"
การลั่นไกให้เกิดการกระทำอย่างหนึ่งเมื่อผู้ใช้คลิกตำแหน่งบนแผนที่
จะต้องทำการ register ตัวรับฟัง (listener) เพื่อทำหน้าที่รับฟังอุบัติการณ์
"click" ที่เกิดขึ้นบน GMap2 instance เมื่อมีอุบัติการณ์ชนิดนั้นเกิดขึ้น
ตัวรับฟังจะลั่นไก ก่อให้เกิด -- event handler จะได้รับ 2 arguments:
1.
marker ตัวที่ถูกคลิก (ถ้ามี)และ
2. ค่าพิกัดตำแหน่ง GLatLng
ของตำแหน่งที่ถูกคลิก
ถ้าไม่มี marker ใดถูกคลิก argument ตัวแรกจะมีค่าเป็น
null
หมายเหตุ: ขณะนี้ ในกลุ่ม built-in overlay มีพียง Marker เท่านั้น
ที่สามารถตอบสนองอุบัติการณ์ "click" ได้ ส่วน overlay ชนิดอื่น เช่น GPolyline
ยังไม่มีคุณสมบัติดังกล่าว
ตัวอย่าง 7 การใช้อุบัติการณ์คลิก
ในตัวอย่างต่อไปนี้
เมื่อผู้ใช้แผนที่คลิกที่ตำแหน่งบนแผนที่ไม่ถูกตัว marker ที่มีอยู่แล้ว จะเกิด
marker ตัวใหม่เพิ่มขึ้น ณ ตำแหน่งนั้น แต่ถ้าคลิกโดนตัว marker ใดที่มีอยู่ marker
นั้นจะถูกลบทิ้งไป
var map = new
GMap2(document.getElementById("map_canvas"));
map.addControl(new
GSmallMapControl());
map.setCenter(new GLatLng(37.4419, -122.1419),
13);
GEvent.addListener(map, "click", function(marker, point) {
if
(marker) {
map.removeOverlay(marker);
}
else
{
map.addOverlay(new GMarker(point));
}
});
[--ไปสารบัญ--]
การเปิด
Info Window กำกับ Marker เพื่อแสดงข้อมูลแผนที่
ตัวอย่างต่อไปนี้แสดงการใช้
custom info window
แสดงผลกำกับ marker
ซึ่งใช้สัญกรที่กำหนดขึ้นแบบซับซ้อน โดยให้ตอบสนองต่ออุบัติการคลิก (click event) ทั้งนี้ให้มีผลต่อการคลิก marker ทุกตัว
ในการนี้เราใช้ความสามารถที่เป็นข้อดีของ JavaScript function closure ให้เกิดการเปลี่ยนแปลงเนื้อหาที่นำเสนอภายใน info window ที่ป็นเรื่องของ marker แต่ละตัวเป็นการเฉพาะ
ตัวอย่าง 8 Custom info window and
icon (icon-custom.html)
1. สาธิตการใช้ custom info window แสดงผลกำกับ marker โดยให้ตอบสนองต่ออุบัติการคลิก
2. สาธิตการสร้างสัญกร
ซึ่งในทางปฏิบัติเราอาจใช้ icon ต่างๆเป็นสัญลักษณ์แผนที่โดยสร้างให้มีส่วนที่แตกต่างกันตรง
foreground เพียงอย่างเดียว แต่มีส่วนเหมือนกันที่
shape และ shadow วิธีดำเนินการอย่างง่ายเพื่อให้ได้คุณสมบัติตามแบบที่กล่าวคือ การใช้
copy constructor ของ GIcon class ซึ่งจะช่วย copy คุณสมบัติทั้งหมดไปยัง icon
ตัวใหม่ซึ่งจะเป็นตัวที่เราทำการปรับแต่งให้ได้คุณสมบัติที่ประสงค์
var map = new
GMap2(document.getElementById("map_canvas"));
map.addControl(new
GSmallMapControl());
map.addControl(new
GMapTypeControl());
map.setCenter(new GLatLng(37.4419, -122.1419), 13);
/*
สร้าง base icon เตรียมไว้รองรับการทำ marker โดยกำหนดค่า shadow
มิติต่างๆ และ ฯลฯ ของ icon */
var baseIcon = new
GIcon();
baseIcon.shadow =
"http://www.google.com/mapfiles/shadow50.png";
baseIcon.iconSize = new
GSize(20, 34);
baseIcon.shadowSize = new GSize(37,
34);
baseIcon.iconAnchor = new GPoint(9, 34);
baseIcon.infoWindowAnchor =
new GPoint(9, 2);
baseIcon.infoShadowAnchor = new GPoint(18, 25);
/* ฟังก์ชันใช้สร้าง marker ให้สัญลักษณ์ของแต่ละตัวมีส่วนประกอบเป็นตัวอักษรตรงตามค่าดัชนีของมันเอง
*/
function createMarker(point, index) {
var letter =
String.fromCharCode("A".charCodeAt(0) + index);
var letteredIcon = new
GIcon(baseIcon);
letteredIcon.image = "http://www.google.com/mapfiles/marker"
+ letter + ".png";
/* สร้าง GMarkerOptions
object ตามต้องการ
*/
markerOptions = { icon:letteredIcon };
var marker = new GMarker(point,
markerOptions);
/* กำหนด Info window แบบเฉพาะตัวให้ผุดขึ้นเมื่อคลิกที่ตัว marker
*/
GEvent.addListener(marker, "click", function()
{
marker.openInfoWindowHtml("Marker <b>" + letter +
"</b>");
});
return marker;
}
/* สร้าง
markers บนแผนที่จำนวน 10 ตัว ให้วางอยู่ในตำแหน่งต่างๆแบบสุ่ม */
var
bounds = map.getBounds();
var southWest = bounds.getSouthWest();
var
northEast = bounds.getNorthEast();
var lngSpan = northEast.lng() -
southWest.lng();
var latSpan = northEast.lat() - southWest.lat();
for (var
i = 0; i < 10; i++) {
var point = new GLatLng(southWest.lat() + latSpan *
Math.random(),
southWest.lng() + lngSpan *
Math.random());
map.addOverlay(createMarker(point, i));
}
คลิก icon-custom.html
เพื่อดูผลงานที่ทำเสร็จแล้ว
[--ไปสารบัญ--]
Info Window แบบหลายแผ่นเอกสารซ้อนกัน
การจัดให้ Info Window มีรูปแบบที่สลับซับซ้อนแบบ multiple named tabs สามารถทำได้โดยใช้ method สองตัวซึ่งได้แก่ 1
-- openInfoWindowTabs() และ 2 -- GInfoWindowTab
ตัวอย่าง 9
(tabbedinfowindow.html)
ตัวอย่างนี้แสดงการสร้าง
tabbed info window
อย่างง่าย โดยกำหนดให้ปรากฏขึ้นด้านบนของ marker ตัวหนึ่ง
var map = new
GMap2(document.getElementById("map"));
map.addControl(new
GSmallMapControl());
map.addControl(new
GMapTypeControl());
map.setCenter(new GLatLng(37.4419, -122.1419), 13);
/*
จัดเนื้อหาที่นำเสนอภายใน info window ของเรา */
var
infoTabs = [
new GInfoWindowTab("Tab #1", "This is tab #1 content"),
new
GInfoWindowTab("Tab #2", "This is tab #2 content")
];
/* วาง marker ที่ตำแหน่งกลางแผนที่และเปิด info window
โดยอัตโนมัติ */
var marker = new
GMarker(map.getCenter());
GEvent.addListener(marker, "click", function()
{
marker.openInfoWindowTabsHtml(infoTabs);
});
map.addOverlay(marker);
marker.openInfoWindowTabsHtml(infoTabs);
คลิก tabbedinfowindow.html
เพื่อดูผลงานที่ทำเสร็จแล้ว
[--ไปสารบัญ--]
การสร้างสัญกร
(Icons)
สัญกรหรือไอคอนในที่นี้หมายถึงรูปกราฟิกที่สื่อความหมายอย่างใดอย่างหนึ่ง
ทำหน้าที่เป็นองค์ประกอบในการสร้าง marker หรือหมุดที่วางหรือปักบนแผนที่
ดังนั้นสัญลักษณ์แบบจุดที่ใช้บนแผนที่จึงเกิดจากหมุดปักที่มีสัญกรแบบต่างๆ
นั่นเอง
ตัวอย่าง 10
(icon-simple.html)
ตัวอย่างนี้แสดงการสร้างหมุดปักจำนวน
10 ตัว
ให้มีสัญกรหรือไอคอนที่ใช้ G_DEFAULT_ICON เป็นต้นแบบ
แล้วกำหนดคุณลักษณะเฉพาะส่วนของ "รูปภาพส่วนหน้า" (foreground image) ให้กับสัญกรเหล่านั้น
var map = new
GMap2(document.getElementById("map_canvas"));
map.addControl(new
GSmallMapControl());
map.setCenter(new GLatLng(37.4419, -122.1419),
13);
/* สร้าง marker ขนาดจิ๋วโดยใช้ base icon
ที่เตรียมไว้ */
var blueIcon = new
GIcon(G_DEFAULT_ICON);
blueIcon.image =
"http://www.google.com/intl/en_us/mapfiles/ms/micons/blue-dot.png";
/*
จัดคุณสมบัติของ GMarkerOptions
object ที่ทำไว้
*/
markerOptions = { icon:blueIcon };
/* สร้าง
marker จำนวน 10 ตัววางไว้ในที่ต่างๆ แบบสุ่มบนแผนที่ */
var bounds =
map.getBounds();
var southWest = bounds.getSouthWest();
var northEast =
bounds.getNorthEast();
var lngSpan = northEast.lng() -
southWest.lng();
var latSpan = northEast.lat() - southWest.lat();
for (var
i = 0; i < 10; i++) {
var point = new GLatLng(southWest.lat() + latSpan *
Math.random(),
southWest.lng() + lngSpan *
Math.random());
map.addOverlay(new GMarker(point, markerOptions));
}
คลิก icon-simple.html เพื่อดูผลงานที่ทำเสร็จแล้ว
[--ไปสารบัญ--]
ตัวอย่าง 11
(icon-complex.html)
ตัวอย่างนี้แสดงการสร้างหมุดปักจำนวน
10 ตัว
ให้มีสัญกรหรือไอคอนที่ใช้ในโครงการ
Google Ride
Finder เป็นต้นแบบ แล้วกำหนดคุณลักษณะส่วนต่างๆ ซึ่งได้แก่ image, shadow,
iconsize, shadowSize, iconAnchor, และ infoWindowAnchor ให้กับสัญกรเหล่านั้น
var map = new
GMap2(document.getElementById("map"));
map.addControl(new
GSmallMapControl());
map.addControl(new
GMapTypeControl());
map.setCenter(new GLatLng(37.4419, -122.1419),
13);
// Create our "tiny" marker icon
var tinyIcon = new
GIcon();
tinyIcon.image =
"http://labs.google.com/ridefinder/images/mm_20_red.png";
tinyIcon.shadow =
"http://labs.google.com/ridefinder/images/mm_20_shadow.png";
tinyIcon.iconSize
= new GSize(12, 20);
tinyIcon.shadowSize = new GSize(22,
20);
tinyIcon.iconAnchor = new GPoint(6, 20);
tinyIcon.infoWindowAnchor =
new GPoint(5, 1);
// Set up our GMarkerOptions object
literal
markerOptions = { icon:tinyIcon };
// Add 10 markers to the
map at random locations
var bounds = map.getBounds();
var southWest =
bounds.getSouthWest();
var northEast = bounds.getNorthEast();
var lngSpan
= northEast.lng() - southWest.lng();
var latSpan = northEast.lat() -
southWest.lat();
for (var i = 0; i < 10; i++) {
var point = new
GLatLng(southWest.lat() + latSpan * Math.random(),
southWest.lng() + lngSpan
* Math.random());
map.addOverlay(new GMarker(point,
markerOptions));
}
คลิก icon-complex.html เพื่อดูผลงานที่ทำเสร็จแล้ว
[--ไปสารบัญ--]
การใช้ XML และ
Asynchronous HTTP เพื่อนำเข้าข้อมูลแผนที่
ตัวอย่างนี้แสดงการ download แฟัมข้อมูลแบบสถิตย์ (static file) ชื่อ
"data.xml" ซึ่งบรรจุรายการค่าพิกัด latitude/ longitude ในรูปแบบ XML
โดยใช้ GDownloadUrl method หลังจากที่
download เสร็จ ก็ทำการ parse ข้อมูลด้วย GXml.parse method และนำค่าที่ได้ไปประมวลผลต่อตามลำดับ โดยให้ผลลัพธ์เป็น marker
วางบนแผนที่ในตำแหน่งตามค่าที่กำหนดในเอกสาร xml ที่ใช้เป็นข้อมูลป้อนเข้า
ตัวอย่าง 12 (async.html)
var map = new
GMap2(document.getElementById("map"));
map.addControl(new
GSmallMapControl());
map.addControl(new
GMapTypeControl());
map.setCenter(new GLatLng(37.4419, -122.1419),
13);
// ทำการ download แฟ้มข้อมูลชื่อ data.xml
และ load เข้าสู่แผนที่
// รูบแบบและเนื้อหาของข้อมูลเป็นทำนองนี้:
//
<markers>
// <marker lat="37.441" lng="-122.141"/>
//
<marker lat="37.322" lng="-121.213"/>
//
</markers>
GDownloadUrl("data.xml", function(data, responseCode)
{
var xml = GXml.parse(data);
var markers =
xml.documentElement.getElementsByTagName("marker");
for (var i = 0; i <
markers.length; i++) {
var point = new
GLatLng(parseFloat(markers[i].getAttribute("lat")),
parseFloat(markers[i].getAttribute("lng")));
map.addOverlay(new
GMarker(point));
}
});
คลิก async.html
เพื่อดูผลงานที่ทำเสร็จแล้ว
คลิก data.xml เพื่อดูเนื้อหาในแฟ้มข้อมูล
[--ไปสารบัญ--]
ตัวควบคุมแผนที่แบบประดิษฐ์เอง
(Custom Map
Controls)
ในเวอร์ชัน 2 ผู้ใช้สามารถสร้างตัวควบคุม (เช่น
ตัวควบคุมการย่อ/ขยาย หรือเลื่อนภาพ) ขึ้นใหม่ได้โดยทำ subclass จากตัว GControl
class ที่มีอยู่แล้ว ตัวอย่างที่จะแสดงเป็นการสร้างตัว
control แบบมีข้อความกำกับที่ทำหน้าที่ย่อขยายภาพ
ซึ่งจะแตกต่างจากตัวย่อขยายภาพ
มาตรฐานแบบกราฟิกล้วนที่มีอยู่แล้ว
ในตัวอย่างนี้มีการใช้ class ที่เกี่ยวข้องชื่อ GTextualZoomControl เพราะมี
method ที่จำเป็นในการทำงาน ดังนี้
1/
initialize() method ใช้สร้าง DOM element ของตัวควบคุมแผนที่ที่ต้องการสร้างขึ้น
2/
getDefaultPosition method เพื่อ return ค่า
GControlPosition ที่จะใช้เมื่อตัวควบคุมแผนที่ของเราได้สร้างขึ้นสำเร็จ
และ
3/
setButtonStyle_ method สำหรับตั้งค่า CSS ให้ได้รูปโฉมของตัวควบคุมที่เหมาะสม
ดูเอกสารอ้างอิงเกี่ยวกับ
GControl class เรื่อง method ที่เราสามารถ override ในกระบวนการทำ custom controls เพื่ออ่านรายละเอียดเพิ่มเติม
ตัวควบคุมแผนที่ทุกตัวต้องจัดวางไว้ใน
map container ซึ่งเป็น div element ตัวหนึ่งเพื่อให้สามารถเข้าถึงได้ด้วย GMap2.getContainer()
method
ตัวอย่าง 13 (control-custom.html)
/* ตัว TextualZoomControl
เป็นตัวควบคุมที่เป็นปุ่มมีข้อความ "Zoom In" และ "Zoom Out"
มีความแตกต่างจากตัวควบคุมแบบสัญกร (icon) ที่ใช้อยู่บน Google Maps
ตามปกติ
*/
function TextualZoomControl()
{
}
TextualZoomControl.prototype = new GControl();
/* สร้าง div element เพื่อรองรับปุ่มควบคุมแผนที่แต่ละตัวจนครบทุกตัว
แล้วจัดวาง div element ทั้งหมดไว้ด้วยกันใน div container ตัวหนึ่ง
ซึ่งจะถูกจัดวางไว้ใน map container
ต่อไป
*/
TextualZoomControl.prototype.initialize = function(map)
{
var container = document.createElement("div");
var zoomInDiv =
document.createElement("div");
this.setButtonStyle_(zoomInDiv);
container.appendChild(zoomInDiv);
zoomInDiv.appendChild(document.createTextNode("Zoom
In"));
GEvent.addDomListener(zoomInDiv, "click", function()
{
map.zoomIn();
});
var zoomOutDiv =
document.createElement("div");
this.setButtonStyle_(zoomOutDiv);
container.appendChild(zoomOutDiv);
zoomOutDiv.appendChild(document.createTextNode("Zoom
Out"));
GEvent.addDomListener(zoomOutDiv, "click", function()
{
map.zoomOut();
});
map.getContainer().appendChild(container);
return
container;
}
/*
จัดตำแหน่งของตัวควบคุมที่สร้างขึ้นไว้ที่ด้านบนซ้ายของแผนที่ และตั้งค่า padding
ไว้ 7 หน่วยจุดภาพ ค่าอื่นๆ ปล่อยให้เป็นไปตามค่าปริยาย
*/
TextualZoomControl.prototype.getDefaultPosition = function()
{
return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(7,
7));
}
/*
กำหนดรูปลักษณ์ของตัวควบคุมแผนที่ซึ่งจะสร้างให้เป็นปุ่มกด โดยตั้งค่า CSS
ตามความต้องการ */
TextualZoomControl.prototype.setButtonStyle_ =
function(button) {
button.style.textDecoration =
"underline";
button.style.color = "#0000cc";
button.style.backgroundColor
= "white";
button.style.font = "small
Arial";
button.style.border = "1px solid black";
button.style.padding =
"2px";
button.style.marginBottom = "3px";
button.style.textAlign =
"center";
button.style.width = "6em";
button.style.cursor =
"pointer";
}
var map = new
GMap2(document.getElementById("map"));
map.addControl(new
TextualZoomControl());
map.setCenter(new GLatLng(37.441944, -122.141944),
13);
คลิก control-custom.html เพื่อดูผลงานที่ทำเสร็จแล้ว
[--ไปสารบัญ--]
วัตถุวางบนแผนที่แบบทำเป็นการเฉพาะ (Custom
Overlays)
วัตถุวางบนแผนที่แบบมาตรฐานมีอยู่
4 อย่าง
(GMarker, GPolyline, GPolygonและ Ground
Overlay) อาจไม่เพียงพอหรือสะดวกในการออกแบบงานแผนที่
Google Maps API เวอร์ชัน 2 นี้จึงเปิดโอกาสให้ผู้ใช้สร้างวัตถุ overlay ที่ทำขึ้นเป็นการเฉพาะเพิ่มเติม เพื่อให้การออกแบบและประกอบแผนที่ทำได้ดี
และหลากหลายขึ้นกว่าเดิม
ในหัวข้อนี้จะแสดงการสร้าง
Map overlay ลักษณะรูปสี่เหลี่ยมผืนผ้า (rectangle) โดยผลที่ได้จะเป็น subclass ของ GOverlay
class ทำนองเดียวกับ marker และ
polyline ซึ่งเป็น map overlay เพียง
2 ชนิดที่มีอยู่แล้ว
ในการเขียนโปรแกรมจะต้องทำให้ rectangle มี method 4
ตัวที่จำเป็นขั้นต้น ซึ่งได้แก่ initialize(), remove(),
copy(), และ redraw()
initialize() ทำหน้าที่สร้าง DOM elements ให้ส่งผลเป็นรูปสี่เหลี่ยมผืนผ้าวางบนแผนที่ตามต้องการ
remove()
ทำหน้าที่กำจัดตัวเองออกไปจากแผนที่
copy()
ทำหน้าที่สำเนาตัวเองเพื่อนำไปใช้เป็น instance ตัวใหม่
redraw()
ทำหน้าที่สร้างตัวเองขึ้นใหม่บนแผนที่ให้ถูกต้องตรงตำแหน่งตามมาตราส่วนและการฉายแผนที่ในสถานะปัจจุบัน
(ดู เอกสารอ้างอิง
2 เรื่อง class reference for GOverlay สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับ methods ที่เราสามารถ override ได้เมื่อทำการสร้าง
custom overlays)
DOM
element ทุกตัวที่ใช้ประกอบเป็น overlay จะถูกจัดไว้บน map pane ซึ่งมีค่า z-order
ตามลำดับที่ในการแสดงผล เช่น polylines ซึ่งถูกกำหนดให้อยู่ระดับเดียวกับ map layer จะถูกวางไว้ที่ G_MAP_MAP_PANE รูปเงาของ
Markers ถูกวางไว้ที่ G_MAP_MARKER_SHADOW_PANE ตัว Marker ถูกจัดไว้ที่
G_MAP_MARKER_PANE
การจัดวาง overlay elements ให้อยู่บน pane ที่เหมาะสมช่วยให้เกิดการแสดงผลที่สมควร กล่าวคือ polylines อยู่ต่ำกว่า marker shadows และ info window
แต่อยู่เหนือกว่า overlays อื่นบนแผนที่ ในตัวอย่างต่อไปนี้
overlay ของเราจะถูกกำหนดให้อยู่ระดับเดียวกับ map
ดังนั้นจึงต้องใช้ G_MAP_MAP_PANE ซึ่งมีค่า
z-order น้อยสุด ทั้งนี้เป็นไปในแนวเดียวกันกับ
GPolyline ซึ่งเป็น overlay ปกติ
ตัวอย่าง 14 (overlay-custom.html)
รูปสี่เหลี่ยมผืนผ้า (Rectangle) ที่เราจะสร้างขึ้นเป็น overlay อย่างง่าย จะมีขอบเขต
latitude / longitude บนแผนที่โดยมีขนาดประมาณ 1/4 ของแผนที่
ลักษณะเส้นขอบเขตของรูปสามารถกำหนดได้ด้วย ความหนา (weight) สี (color) และ ระดับความทึบแสง
(opacity)
function Rectangle(bounds, opt_weight, opt_color)
{
this.bounds_ = bounds;
this.weight_ = opt_weight || 2;
this.color_ =
opt_color || "#888888";
}
Rectangle.prototype = new GOverlay();
/* สร้าง div element เพื่อใช้เป็นตัวแทนรูปสี่เหลี่ยมผืนผ้า
*/
Rectangle.prototype.initialize = function(map) {
var div =
document.createElement("div");
div.style.border = this.weight_ + "px solid "
+ this.color_;
div.style.position = "absolute";
/* รูปสี่เหลี่ยมผืนผ้าของเราจะวางนอนที่ระดับเดียวกับแผนที่ ดังนั้น
จึงต้องจัดให้อยู่ที่ MAP_PANE pane ซึ่งมีค่า z-index เท่ากับของ map
แต่จะอยู่ต่ำกว่า marker shadows */
map.getPane(G_MAP_MAP_PANE).appendChild(div);
this.map_ =
map;
this.div_ = div;
}
/* ลบล้าง div ตัวหลักออกไปจาก
map pane */
Rectangle.prototype.remove = function()
{
this.div_.parentNode.removeChild(this.div_);
}
/*
ทำการลอกข้อมูลเพื่อใช้สร้างรูปสี่เหลี่ยมผืนผ้าขึ้นใหม่
*/
Rectangle.prototype.copy = function() {
return new
Rectangle(this.bounds_, this.weight_, this.color_,
this.backgroundColor_,
this.opacity_);
}
/* สร้างรูปสี่เหลี่ยมผืนผ้าขึ้นใหม่
(Redraw) ให้สอดคล้องกับการฉายแผนที่และระดับการย่อขยายขณะนั้น
*/
Rectangle.prototype.redraw = function(force) {
if (!force)
return;
/* คำนวณค่าพิกัดของจุดมุมขอบเขตสองจุดตรงข้ามกันของ
div เพื่อนำไปกำหนดขนาดและตำแหน่งของรูปสี่เหลี่ยมผืนผ้าที่จะสร้างขึ้น
*/
var c1 =
this.map_.fromLatLngToDivPixel(this.bounds_.getSouthWest());
var c2 =
this.map_.fromLatLngToDivPixel(this.bounds_.getNorthEast());
/* จัดขนาดและตำแหน่งของ div
ให้เหมาะสมโดยเอาค่าพิกัดขอบเขตของมันเป็นหลัก
*/
this.div_.style.width = Math.abs(c2.x - c1.x) +
"px";
this.div_.style.height = Math.abs(c2.y - c1.y) +
"px";
this.div_.style.left = (Math.min(c2.x, c1.x) - this.weight_) +
"px";
this.div_.style.top = (Math.min(c2.y, c1.y) - this.weight_) +
"px";
}
var map = new
GMap2(document.getElementById("map"));
map.addControl(new
GSmallMapControl());
map.addControl(new
GMapTypeControl());
map.setCenter(new GLatLng(37.4419, -122.1419),
13);
/* สร้างรูปสี่เหลี่ยมผืนผ้าให้อยู่บริเวณกลางแผนที่
โดยให้มีขนาดประมาณ 1/4 ของแผนที่ */
var bounds =
map.getBounds();
var southWest = bounds.getSouthWest();
var northEast =
bounds.getNorthEast();
var lngDelta = (northEast.lng() - southWest.lng()) /
4;
var latDelta = (northEast.lat() - southWest.lat()) / 4;
var rectBounds
= new GLatLngBounds(
new GLatLng(southWest.lat() + latDelta, southWest.lng()
+ lngDelta),
new GLatLng(northEast.lat() - latDelta, northEast.lng() -
lngDelta));
map.addOverlay(new Rectangle(rectBounds));
คลิก overlay-custom.html เพื่อดูผลงานที่ทำเสร็จแล้ว
[--ไปสารบัญ--]
การแสดงข้อมูลแผนที่จากแฟ้มข้อมูล
KML/GeoRSS
Google Maps API สนับสนุนการใช้ข้อมูลนำเข้าที่อยู่ในฟอร์แมต KML และ GeoRSS
เพื่อแสดงผลเป็นกราฟิกบนแผนที่ ข้อมูลภายใน KML หรือ GeoRSS
มีทั้งที่เป็นรหัสสำหรับสร้างองค์แผนที่ประเภทจุด เส้น และพื้นที่
ดังนั้นเมื่อนำมาแสดงผลบนแผนที่กูเกิ้ล จะได้วัตถุที่เป็น marker, polyline, และ
polygon
ในทางเทคนิค วัตถุที่ถูกสร้างขึ้นบนแผนที่นี้จะเป็น GGeoXml object
โดยมี addOverlay() method เป็นกระบวนการทำหน้าที่สร้าง
และเราสามารถลบวัตถุประเภทนี้ทิ้งได้โดยใช้คำสั่ง
removeOverlay()
ตัวอย่าง 15 การใช้ข้อมูลรูปแบบ KML และ GeoRSS
// ตัวอย่างการใช้ข้อมูลรูปแบบ KML และ
GeoRSS
// GGeoXml ใช้ข้อความระบุ URL ของแฟ้มข้อมูล KML หรือ GeoRSS เพื่อสร้าง
GGeoXml object บนแผนที่
// ในการประมวลผล Maps API
สามารถแยกแยะได้เองว่าเป็นไฟล์ KML หรือ GeoRSS
var map;
var geoXml = new
GGeoXml("http://mapgadgets.googlepages.com/cta.kml");
function onLoad()
{
if (GBrowserIsCompatible()) {
map = new
GMap2(document.getElementById("map"));
map.addControl(new
GLargeMapControl());
map.setCenter(new GLatLng(41.875696,-87.624207), 11);
map.addControl(new
GLargeMapControl());
map.addOverlay(geoXml);
}
}
คลิก geoRSSOverlay.html
เพื่อดูตัวอย่างงานที่ทำเสร็จแล้ว
คลิก kmlOverlay.html
เพื่อดูตัวอย่างงานที่ทำเสร็จแล้ว
คลิก bkk60subdiv.htm
เพื่อดูตัวอย่างแผนที่แสดงตำแหน่ง
60 สำนักงานเขต(พร้อมเส้นอาณาเขต) ของกรุงเทพมหานคร
ภาพวางทับบนแผนที่ (Ground
Overlay)
GGroundOverlay (มีตั้งแต่ GMap version 2.79) คือวัตถุบนแผนที่
Google map สำหรับรูปภาพสี่เหลี่ยมผืนผ้า (เช่น แผนที่ภาพถ่ายทางอากาศ)
ที่นำมาวางทับบนแผนที่ การเขียนรหัสกำหนดรูปภาพมาวางบนแผนที่จะต้องระบุ URL และขอบเขตของภาพโดยใช้
Constructor ดังนี้
GGroundOverlay(imageUrl, bounds) ในที่นี้ bounds เป็นรหัสกำหนดขอบเขตของรูปภาพ ซึ่งต้องใช้ Constructor
ดังนี้
GLatLngBounds(SW_latlong, NE_latlong)
นอกจากนั้น ยังสามารถใช้ KML file กำหนดรายละเอียดของ Ground Overlay
ได้อีกด้วย
ตัวอย่าง (ใช้จาวาสคริพท์)
...
var thaitopo =
GGroundOverlay("http://lecturer.eng.chula.ac.th/fsvskk/mountains_rivers/color_shaded_relief.jpg",
new GLatLngBounds(new GLatLng(5.5, 97), new GLatLng(20.5,
106)));
...
map.addOverlay(thaitopo);
คลิก ground_ovy_Thailand_gtopo30.htm เพื่อดูตัวอย่าง
ตัวอย่าง
(ใช้ KML file)
...
var gr_overlay = new
GGeoXml("http://lecturer.eng.chula.ac.th/fsvskk/gglmap2/thai_gtopo30_ground_ovl.kml");
...
map.addOverlay(gr_overlay);
คลิก
ground_ovl_sample.htm
เพื่อดูตัวอย่าง
ตัวอย่าง การใช้ข้อมูลรูปแบบ jpeg file เป็น ภาพวางทับบนแผนที่
var map = new
GMap2(document.getElementById("map_canvas"));
map.setCenter(new
GLatLng(40.740, -74.18), 12);
/* กำหนดขอบเขตของ ground overlay */
var boundaries = new GLatLngBounds(new
GLatLng(40.716216,-74.213393), new GLatLng(40.765641,-74.139235));
/*
สร้างวัตถุ ground overlay */
var oldmap = new
GGroundOverlay("http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg",
boundaries);
map.addControl(new GSmallMapControl());
map.addControl(new
GMapTypeControl());
/* วางวัตถุ
ground overlay บนแผนที่
*/
map.addOverlay(oldmap);
คลิก groundoverlay-simple.html
เพื่อดูตัวอย่างงานที่ทำเสร็จแล้ว
ถ้าโปรแกรมมีปัญหาจะทำอย่างไร
เมื่อรหัสโปรแกรมที่เขียนขึ้นมีความผิดพลาดหรือใช้งานไม่ได้ แนวทางแก้ไขที่ควรปฏิบัติมีหลายประการ
เช่น
- ตรวจดูว่า API key
ที่ใช้ว่าถูกต้องหรือไม่
- ตรวจสอบรหัสให้ถูกต้อง อย่าลืมว่าในภาษา
JavaScript อักษรตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ถือว่าแตกต่างกัน
(case sensitive)
- ใช้ JavaScript debugger เช่น ถ้าบราวเซอร์เป็น Firefox สามารถใช้
JavaScript console หรือ Venkman Debugger ส่วน MS Internet Explorer ให้ใช้ Microsoft
Script Debugger
- ค้นหาคำตอบใน Maps API discussion
group ถ้าไม่พบคำตอบ
สามารถตั้งกระทู้ถามได้ที่นั่น
บทสรุป
ผลงานประเภท Web map
ในอดีตเป็นงานที่มีความสลับซับซ้อน ต้องลงทุนสูงในการจัดทำและบำรุงรักษา
โดยเฉพาะอย่างยิ่งในด้านข้อมูลแผนที่ ภาพถ่ายทางอากาศ/ดาวเทียม
และเทคโนโลยีสนับสนุน
ที่ผ่านมาจึงเป็นงานที่จำกัดอยู่ในวงแคบเฉพาะองค์กรขนาดใหญ่เท่านั้น
การให้บริการของ Google ในรูปแบบ Google Maps API ทำให้ผู้ใช้ทั่วโลกสามารถสร้าง Web map (Map mashup
เป็นเว็บแม้พชนิดหนึ่ง)
ที่มีคุณสมบัติตามกำลังความสามารถของแต่ละบุคคลโดยไม่ต้องเสียค่าธรรมเนียม
นับว่าเป็นการปฏิวัติครั้งสำคัญในวงการแผนที่บนอินเทอร์เน็ต บริการด้านแผนที่ของ
Google
ก่อให้เกิดความตื่นตัวขึ้นเป็นอย่างสูงในวงการอินเทอร์เน็ตที่มีความต้องการปรับปรุงเนื้อหาและวิธีการนำเสนอข้อมูลบนเว็บไซต์ให้น่าสนใจโดยมีแผนที่เป็นองค์ประกอบ
ผลกระทบที่เกิดขึ้นทำให้คู่แข่ง เช่น Yahoo, Microsoft และ
MapQuest ต้องร้อนตัวเปิดให้บริการฟรีในลักษณะคล้าย ๆ กัน
บทความนี้ได้กล่าวถึงขั้นตอนการสร้าง Google Maps Mashup สำหรับผู้สนใจ
ได้ให้ตัวอย่างที่สามารถนำไปทดลองใช้งานได้ที่ครอบคลุมขีดความสามารถอันน่าสนใจของ
Google Maps อย่างพอเพียงที่จะช่วยให้ผู้ใช้เห็นรายละเอียดการทำโปรแกรมพอสมควร
มีความเข้าใจในกลไกการทำงานบ้างตามสมควร และ
น่าจะช่วยให้เริ่มต้นลงมือได้อย่างมั่นใจ
เอกสารอ้างอิง
1. Google Maps API Developer Guide (http://code.google.com/apis/maps/documentation/index.html)
2. Google Maps API Reference
(http://code.google.com/apis/maps/documentation/reference.html)
3. Google Maps API Introduction (http://code.google.com/apis/maps/documentation/introduction.html)
[--ไปสารบัญ--]
ภาคผนวก1 รหัสโปรแกรมอย่างสมบูรณ์ของตัวอย่าง 1 (The "Hello, World" of
Google Maps)
<!DOCTYPE html "-//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">
<head>
<meta
http-equiv="content-type" content="text/html;
charset=utf-8"/>
<title>Google Maps JavaScript API
Example</title>
<script
src="http://maps.google.com/maps?file=api&v=2&key=abcdefg"
type="text/javascript"></script>
<script
type="text/javascript">
function initialize() {
if
(GBrowserIsCompatible()) {
var map = new
GMap2(document.getElementById("map_canvas"));
map.setCenter(new
GLatLng(37.4419, -122.1419),
13);
}
}
</script>
</head>
<body
onload="initialize()" onunload="GUnload()">
<div id="map_canvas"
style="width: 500px; height:
300px"></div>
</body>
</html>
ภาคผนวก 2 เว็บบราวเซอร์ที่สามารถใช้งาน Google Maps API ได้
เว็บบราวเซอร์ที่สามารถใช้บริการของ Google Local ได้ก็จะสามารถใช้ Google Maps API
ได้ด้วยเพราะมีความต้องการที่เหมือนกัน
หากต้องการเขียนรหัสตรวจสอบขีดความสามารถของบราวเซอร์ว่ามีความเข้ากันได้กับ Google
Maps API หรือไม่สามารถใช้ Global method ที่ชื่อ
GBrowserIsCompatible() ซึ่งเป็นส่วนหนึ่งใน Google Maps API
ให้ทำหน้าที่ตรวจก็ได้ ขณะที่เรียบเรียงบทความนี้ (พฤษภาคม
คศ. 2006) เว็บบราวเซอร์รุ่นปัจจุบันของ MS Internet Explorer, Mozilla Firefox,
Netscape Navigator, และ Opera
ต่างก็สามารถใช้งานได้ดี
ภาคผนวก 3 รวมคำย่อและข้อความเต็ม
AJAX = Asynchronous
Javascript and XML
API = Application Program
Interface
CSS = Cascading Style
Sheet
DOM = Document Object
Model
GIS = Geographic
Information System
GPS = Global Positional
System
HTML = Hyper-Text Markup
Language
JSON =
JavaScript Object Notation
URL = Universal Reference
Locator
XHTML = XML Hyper-Text Markup
Language
XML = Extensible Markup
Language
ภาคผนวก 4 รวม Link
ที่เกี่ยวข้อง กับ
Google
Maps API และที่มีประโยชน์
Google
Maps: http://maps.google.com/
Google Maps API home:
http://www.google.com/apis/maps/documentation/reference.html
Signup for API key: http://www.google.com/apis/maps/signup.html
Help and FAQ: http://www.google.com/apis/maps/fag.html
Terms Of Use: http://www.google.com/apis/maps/terms.html
Documentation: http://www.google.com/apis/maps/documentation/reference.html
Official BLOG: http://googlemapsapi.blogspot.com/
API Discussion Group:
http://groups.google.com/group/Google-Maps-API
Other resources
(tutorial, etc.)
Mapki: http://www.mapki.com/
Mike Williams' tutorial:
http://www.econym.demon.co.uk/googlemaps/index.htm
Programmable Web:
http://www.programmableweb.com/api/GoogleMaps
Google Maps Mania: http://googlemapsmania.blogspot.com/
ภาคผนวก 5 รวม Link
ตัวอย่างการใช้งาน
Google
Maps API
ตัวอย่างเกี่ยวกับ Map
object
ตัวอย่างเกี่ยวกับ Event
ตัวอย่างเกี่ยวกับ Controls
ตัวอย่างเกี่ยวกับ Marker
ตัวอย่างเกี่ยวกับ Polyline
ตัวอย่างเกี่ยวกับ Polygon, Tile Overlay
ตัวอย่างเกี่ยวกับ Custom Overlay
ตัวอย่างเกี่ยวกับ Services
[--ไปสารบัญ--]
สงวนลิขสิทธิ์ตามพระราชบัญญัติ (Last edited April 5,
2008)
Counter: hits.