Maps JavaScript API เวอร์ชัน 2 จะใช้งานไม่ได้อีกต่อไปตั้งแต่วันที่ 26 พฤษภาคม 2021 ด้วยเหตุนี้ แผนที่ v2 ของเว็บไซต์จะหยุดทํางานและแสดงข้อผิดพลาด JavaScript หากต้องการใช้แผนที่ในเว็บไซต์ต่อไป ให้ย้ายข้อมูลไปยัง Maps JavaScript API v3 คู่มือนี้จะช่วยคุณตลอดกระบวนการ
ภาพรวม
แอปพลิเคชันแต่ละรายการจะมีขั้นตอนการย้ายข้อมูลแตกต่างกันเล็กน้อย แต่มีบางขั้นตอนที่เหมือนกันสำหรับทุกโปรเจ็กต์ ดังนี้
- รับคีย์ใหม่ ตอนนี้ Maps JavaScript API ใช้ Google Cloud Console ในการจัดการคีย์ หากคุณยังใช้คีย์ v2 อยู่ โปรดรับคีย์ API ใหม่ก่อนเริ่มย้ายข้อมูล
- อัปเดต Bootstrap ของ API แอปพลิเคชันส่วนใหญ่จะโหลด Maps JavaScript API v3 ด้วยโค้ดต่อไปนี้
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
- อัปเดตโค้ด ปริมาณการเปลี่ยนแปลงที่จำเป็นจะขึ้นอยู่กับแอปพลิเคชันของคุณเป็นอย่างมาก การเปลี่ยนแปลงที่พบบ่อยมีดังนี้
- อ้างอิงเนมสเปซ google.maps เสมอ ใน v3 โค้ด Maps JavaScript API ทั้งหมดจะจัดเก็บไว้ในเนมสเปซ
google.maps.*
แทนเนมสเปซส่วนกลาง วัตถุส่วนใหญ่ก็ได้รับการเปลี่ยนชื่อด้วยเช่นกันในกระบวนการนี้ เช่น ตอนนี้คุณจะต้องโหลด google.maps.Map
แทน GMap2
- นำการอ้างอิงถึงวิธีการที่ล้าสมัยออก ระบบได้นำวิธีการยูทิลิตีสำหรับวัตถุประสงค์ทั่วไปจำนวนหนึ่งออกแล้ว เช่น
GDownloadURL
และ GLog
แทนที่ฟังก์ชันนี้ด้วยไลบรารียูทิลิตีของบุคคลที่สาม หรือนําการอ้างอิงเหล่านี้ออกจากโค้ด
- (ไม่บังคับ) เพิ่มไลบรารีลงในโค้ด เราได้แยกฟีเจอร์หลายอย่างออกเป็นไลบรารียูทิลิตีเพื่อให้แต่ละแอปต้องโหลดเฉพาะส่วนของ API ที่จะใช้งาน
- (ไม่บังคับ) กำหนดค่าโปรเจ็กต์ให้ใช้ภายนอก v3
คุณสามารถใช้ extern ของ v3 เพื่อช่วยตรวจสอบโค้ดด้วย Closure Compiler หรือเพื่อเรียกใช้ฟีเจอร์เติมข้อความอัตโนมัติใน IDE
ดูข้อมูลเพิ่มเติมเกี่ยวกับ compilation ขั้นสูงและภายนอก
- ทดสอบและปรับปรุง ในตอนนี้ คุณยังคงต้องดำเนินการบางอย่าง แต่ข่าวดีก็คือคุณกำลังเดินหน้าสู่แอปพลิเคชันแผนที่เวอร์ชัน 3 ใหม่
การเปลี่ยนแปลงใน Maps JavaScript API เวอร์ชัน 3
ก่อนวางแผนการย้ายข้อมูล คุณควรใช้เวลาทำความเข้าใจความแตกต่างระหว่าง Maps JavaScript API v2 กับ Maps JavaScript API v3 Maps JavaScript API เวอร์ชันล่าสุดเขียนขึ้นใหม่ทั้งหมด โดยเน้นเทคนิคการเขียนโปรแกรม JavaScript สมัยใหม่ การใช้ไลบรารีที่มากขึ้น และ API ที่เข้าใจง่าย
เราได้เพิ่มฟีเจอร์ใหม่ๆ มากมายลงใน API และเปลี่ยนแปลงหรือนําฟีเจอร์ที่คุ้นเคยหลายรายการออก ส่วนนี้จะไฮไลต์ความแตกต่างที่สําคัญบางประการระหว่าง 2 รุ่น
การเปลี่ยนแปลงบางส่วนใน v3 API มีดังนี้
- ไลบรารีหลักที่มีประสิทธิภาพมากขึ้น เราได้ย้ายฟังก์ชันเสริมจำนวนมากไปไว้ในไลบรารี ซึ่งช่วยลดเวลาในการโหลดและแยกวิเคราะห์ของ Core API ซึ่งจะช่วยให้แผนที่โหลดได้อย่างรวดเร็วบนอุปกรณ์ทุกเครื่อง
- ปรับปรุงประสิทธิภาพของฟีเจอร์หลายอย่าง เช่น การแสดงผลรูปหลายเหลี่ยมและการวางเครื่องหมาย
- แนวทางใหม่ในการจำกัดการใช้งานฝั่งไคลเอ็นต์เพื่อรองรับที่อยู่ที่ใช้ร่วมกันซึ่งพร็อกซีของอุปกรณ์เคลื่อนที่และไฟร์วอลล์ขององค์กรใช้
- เพิ่มการรองรับเบราว์เซอร์สมัยใหม่หลายรุ่นและเบราว์เซอร์ในอุปกรณ์เคลื่อนที่ ยกเลิกการรองรับ Internet Explorer 6 แล้ว
- นําคลาสตัวช่วยสําหรับวัตถุประสงค์ทั่วไปออกหลายคลาส (
GLog
หรือ
GDownloadUrl
) ปัจจุบันมีไลบรารี JavaScript ที่ยอดเยี่ยมจํานวนมากซึ่งมีฟังก์ชันการทํางานคล้ายกัน เช่น Closure หรือ jQuery
- การใช้งาน Street View เวอร์ชัน HTML5 ที่โหลดในอุปกรณ์เคลื่อนที่ทุกรุ่น
- ภาพพาโนรามาของ Street View ที่ปรับแต่งด้วยรูปภาพของคุณเอง ซึ่งช่วยให้คุณแชร์ภาพพาโนรามาของลานสกี บ้านที่ขาย หรือสถานที่น่าสนใจอื่นๆ ได้
- การปรับแต่งแผนที่ที่มีสไตล์ที่ช่วยให้คุณเปลี่ยนการแสดงองค์ประกอบบนแผนที่ฐานให้เข้ากับสไตล์ภาพที่เป็นเอกลักษณ์ของคุณได้
- การรองรับบริการใหม่หลายรายการ เช่น ElevationService และ Distance
Matrix
- บริการเส้นทางที่ปรับปรุงใหม่จะแสดงเส้นทางอื่น การเพิ่มประสิทธิภาพเส้นทาง (วิธีแก้ปัญหาแบบใกล้เคียงสำหรับ
ปัญหาคนขายยา) เส้นทางปั่นจักรยาน (มี
เลเยอร์ปั่นจักรยาน) เส้นทางขนส่งสาธารณะ และ
เส้นทางที่ลากได้
- รูปแบบการแปลงพิกัดภูมิศาสตร์ที่อัปเดตแล้วซึ่งให้ข้อมูลประเภทที่แม่นยำกว่าค่า
accuracy
จาก Geocoding API เวอร์ชัน 2
- การรองรับหน้าต่างข้อมูลหลายรายการในแผนที่เดียว
คีย์ใหม่
Maps JavaScript API v3 ใช้ระบบคีย์ใหม่จาก v2 คุณอาจใช้คีย์ v3 กับแอปพลิเคชันอยู่แล้ว ซึ่งในกรณีนี้ก็ไม่จําเป็นต้องเปลี่ยนแปลง หากต้องการยืนยัน ให้ตรวจสอบ URL ที่คุณโหลด Maps JavaScript API เพื่อหาพารามิเตอร์ key
หากค่าคีย์ขึ้นต้นด้วย "ABQIAA" แสดงว่าคุณใช้คีย์ v2 หากมีคีย์ v2 คุณต้องอัปเกรดเป็นคีย์ v3 ในการย้ายข้อมูล ซึ่งจะทําสิ่งต่อไปนี้
ระบบจะส่งคีย์เมื่อโหลด Maps JavaScript API v3
ดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้างคีย์ API
โปรดทราบว่าหากคุณเป็นลูกค้า Google Maps API for Work คุณอาจใช้รหัสไคลเอ็นต์ที่มีพารามิเตอร์ client
แทนที่จะใช้พารามิเตอร์ key
ระบบยังคงรองรับรหัสไคลเอ็นต์ใน Maps JavaScript API เวอร์ชัน 3 และไม่จำเป็นต้องผ่านกระบวนการอัปเกรดคีย์
การโหลด API
การแก้ไขครั้งแรกที่คุณต้องทํากับโค้ดเกี่ยวข้องกับวิธีโหลด API ใน v2 คุณจะโหลด Maps JavaScript API ผ่านคำขอไปยัง http://maps.google.com/maps
หากกำลังโหลด Maps JavaScript API v3 คุณจะต้องทําการเปลี่ยนแปลงต่อไปนี้
- โหลด API จาก
//maps.googleapis.com/maps/api/js
- นําพารามิเตอร์
file
ออก
- อัปเดตพารามิเตอร์
key
ด้วยคีย์ v3 ใหม่ ลูกค้า Google Maps API for Work ควรใช้พารามิเตอร์ client
- (แพ็กเกจพรีเมียมของ Google Maps Platform เท่านั้น) ตรวจสอบว่าได้ระบุพารามิเตอร์
client
ตามที่อธิบายไว้ใน
คู่มือนักพัฒนาซอฟต์แวร์สำหรับแพ็กเกจพรีเมียมของ Google Maps Platform
- นําพารามิเตอร์
v
ออกเพื่อขอเวอร์ชันที่เผยแพร่ล่าสุด หรือเปลี่ยนค่าให้สอดคล้องกับรูปแบบการกำหนดเวอร์ชัน v3
- (ไม่บังคับ) แทนที่พารามิเตอร์
hl
ด้วย language
และเก็บค่าไว้
- (ไม่บังคับ) เพิ่มพารามิเตอร์
libraries
เพื่อโหลดไลบรารีที่ไม่บังคับ
ในกรณีที่ง่ายที่สุด บูตสแtrap v3 จะระบุเฉพาะพารามิเตอร์คีย์ API ดังนี้
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
ตัวอย่างด้านล่างขอ Maps JavaScript API v2 เวอร์ชันล่าสุดเป็นภาษาเยอรมัน
<script src="//maps.google.com/maps?file=api&v=2.x&key=YOUR_API_KEY&hl=de"></script>
ตัวอย่างด้านล่างคือคําขอที่เทียบเท่าสําหรับ v3
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&language=de"></script>
ขอแนะนําเนมสเปซ google.maps
การเปลี่ยนแปลงที่เห็นได้ชัดที่สุดใน Maps JavaScript API v3 คือการเปิดตัวเนมสเปซ google.maps
API v2 จะวางออบเจ็กต์ทั้งหมดในเนมสเปซส่วนกลางโดยค่าเริ่มต้น ซึ่งอาจส่งผลให้เกิดชื่อทับซ้อนกัน ใน v3 ออบเจ็กต์ทั้งหมดจะอยู่ภายในเนมสเปซ google.maps
เมื่อย้ายข้อมูลแอปพลิเคชันไปยัง v3 คุณจะต้องเปลี่ยนโค้ดเพื่อใช้ประโยชน์จากเนมสเปซใหม่ ขออภัย การค้นหา "G" แล้วแทนที่ด้วย "google.maps" นั้นใช้ไม่ได้ผลทั้งหมด แต่นี่เป็นกฎง่ายๆ ที่ควรใช้เมื่อตรวจสอบโค้ด ด้านล่างนี้คือตัวอย่างคลาสที่เทียบเท่ากันใน v2 และ v3
v2 |
v3 |
GMap2 |
google.maps.Map |
GLatLng |
google.maps.LatLng |
GInfoWindow |
google.maps.InfoWindow |
GMapOptions |
google.map.MapOptions |
G_API_VERSION |
google.maps.version |
GPolyStyleOptions |
google.maps.PolygonOptions or
google.maps.PolylineOptions |
การนำโค้ดที่ล้าสมัยออก
Maps JavaScript API เวอร์ชัน 3 มีฟังก์ชันการทำงานส่วนใหญ่ที่คล้ายกับเวอร์ชัน 2 แต่มีบางคลาสที่ระบบไม่รองรับแล้ว ในการย้ายข้อมูล คุณควรแทนที่คลาสเหล่านี้ด้วยไลบรารียูทิลิตีของบุคคลที่สาม หรือนําการอ้างอิงเหล่านี้ออกจากโค้ด ไลบรารี JavaScript ที่ยอดเยี่ยมมีอยู่มากมายซึ่งให้ฟังก์ชันการทำงานที่คล้ายกัน เช่น Closure หรือ jQuery
คลาสต่อไปนี้ไม่มีคู่กันใน Maps JavaScript API v3
GBounds | GLanguage |
GBrowserIsCompatible | GLayer |
GControl | GLog |
GControlAnchor | GMercatorProjection |
GControlImpl | GNavLabelControl |
GControlPosition | GObliqueMercator |
GCopyright | GOverlay |
GCopyrightCollection | GPhotoSpec |
GDownloadUrl | GPolyEditingOptions |
GDraggableObject | GScreenOverlay |
GDraggableObjectOptions | GStreetviewFeatures |
GFactualGeocodeCache | GStreetviewLocation |
GGeoAddressAccuracy | GStreetviewOverlay |
GGeocodeCache | GStreetviewUserPhotosOptions |
GGoogleBar | GTileLayerOptions |
GGoogleBarAdsOptions | GTileLayerOverlayOptions |
GGoogleBarLinkTarget | GTrafficOverlayOptions |
GGoogleBarListingTypes | GUnload |
GGoogleBarOptions | GXml |
GGoogleBarResultList | GXmlHttp |
GInfoWindowTab | GXslt |
GKeyboardHandler |
|
การเปรียบเทียบโค้ด
มาเปรียบเทียบแอปพลิเคชัน 2 รายการที่ค่อนข้างเรียบง่ายซึ่งเขียนด้วย API เวอร์ชัน 2 และ 3
<!DOCTYPE html>
<html>
<head>
<script src="//maps.google.com/maps?file=api&v=2&key=YOUR_API_KEY"></script>
<style>
html, body, #map { height: 100%; margin: 0; }
</style>
<script>
function initialize() {
if (GBrowserIsCompatible()) {
var map = new GMap2(
document.getElementById('map'));
map.setCenter(new GLatLng(37.4419, -122.1419), 13);
map.setUIToDefault();
map.addOverlay(new GMarker(new GLatLng(37.4419, -122.1419)));
}
}
</script>
</head>
<body onload="initialize()" onunload="GUnload()">
<div id="map"></div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
<style>
html, body, #map { height: 100%; margin: 0; }
</style>
<script>
function initialize() {
var map = new google.maps.Map(
document.getElementById('map'), {
center: new google.maps.LatLng(37.4419, -122.1419),
zoom: 13,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var marker = new google.maps.Marker({
position: new google.maps.LatLng(37.4419, -122.1419),
map: map
});
}
google.maps.event.addDomListener(window, 'load', initialize);
</script>
</head>
<body>
<div id="map"></div>
</body>
</html>
อย่างที่เห็น แอปพลิเคชัน 2 ตัวนี้มีความแตกต่างกันหลายประการ การเปลี่ยนแปลงที่สำคัญมีดังนี้
- ที่อยู่ที่ใช้โหลด API มีการเปลี่ยนแปลง
- คุณไม่จำเป็นต้องใช้เมธอด
GBrowserIsCompatible()
และ GUnload()
ใน v3 อีกต่อไป และเราได้นำเมธอดดังกล่าวออกจาก API แล้ว
- ระบบจะแทนที่ออบเจ็กต์
GMap2
ด้วย google.maps.Map
ในฐานะออบเจ็กต์กลางใน API
- ตอนนี้ระบบจะโหลดพร็อพเพอร์ตี้ผ่านคลาส Options ในตัวอย่างข้างต้น เราได้ตั้งค่าพร็อพเพอร์ตี้ 3 รายการที่จําเป็นสําหรับการโหลดแผนที่ ซึ่งได้แก่
center
, zoom
และ mapTypeId
ผ่านออบเจ็กต์ MapOptions
ที่ฝังอยู่
- UI เริ่มต้นจะเปิดอยู่โดยค่าเริ่มต้นในเวอร์ชัน 3 คุณปิดใช้การตั้งค่านี้ได้โดยการตั้งค่าพร็อพเพอร์ตี้
disableDefaultUI
เป็น true ในแอบเจ็กต์ MapOptions
สรุป
ตอนนี้คุณคงได้ทราบข้อมูลคร่าวๆ เกี่ยวกับประเด็นสำคัญบางประการเกี่ยวกับการย้ายข้อมูล Maps JavaScript API จากเวอร์ชัน 2 ไปยังเวอร์ชัน 3 แล้ว
คุณอาจต้องทราบข้อมูลเพิ่มเติม แต่ข้อมูลจะขึ้นอยู่กับแอปพลิเคชันของคุณ ในส่วนต่อไปนี้ เรามีวิธีการย้ายข้อมูลสำหรับกรณีเฉพาะที่คุณอาจพบ นอกจากนี้ เรายังมีแหล่งข้อมูลมากมายที่อาจเป็นประโยชน์ในระหว่างกระบวนการอัปเกรด
หากพบปัญหาหรือมีข้อสงสัยเกี่ยวกับบทความนี้ โปรดใช้ลิงก์ส่งความคิดเห็นที่ด้านบนของหน้านี้
ส่วนนี้จะแสดงการเปรียบเทียบโดยละเอียดของฟีเจอร์ยอดนิยมสำหรับทั้ง Maps JavaScript API เวอร์ชัน 2 และ 3 แต่ละส่วนของการอ้างอิงออกแบบมาเพื่อให้อ่านแยกกันได้ เราขอแนะนําว่าอย่าอ่านข้อมูลอ้างอิงนี้จนจบ แต่ให้ใช้เนื้อหานี้เพื่อช่วยในการย้ายข้อมูลทีละกรณี
- เหตุการณ์ - การลงทะเบียนและการจัดการเหตุการณ์
- การควบคุม - การจัดการตัวควบคุมการนำทางที่ปรากฏบนแผนที่
- การวางซ้อน - การเพิ่มและแก้ไขวัตถุบนแผนที่
- ประเภทแผนที่ - ไทล์ที่ประกอบกันเป็นแผนที่ฐาน
- เลเยอร์ - การเพิ่มและแก้ไขเนื้อหาเป็นกลุ่ม เช่น เลเยอร์ KML หรือเลเยอร์การจราจร
- บริการ - การทำงานร่วมกับบริการการแปลงพิกัดภูมิศาสตร์ เส้นทาง หรือ Street View ของ Google
กิจกรรม
รูปแบบเหตุการณ์ของ Maps JavaScript API เวอร์ชัน 3 คล้ายกับที่ใช้ในเวอร์ชัน 2 แม้ว่าจะมีการเปลี่ยนแปลงหลายอย่างอยู่เบื้องหลัง
กิจกรรมใหม่สําหรับการสนับสนุน MVC
API เวอร์ชัน 3 เพิ่มเหตุการณ์ประเภทใหม่เพื่อแสดงการเปลี่ยนแปลงสถานะของ MVC ขณะนี้เหตุการณ์มี 2 ประเภท ได้แก่
- ระบบจะส่งต่อเหตุการณ์ของผู้ใช้ (เช่น เหตุการณ์เมาส์ "คลิก") จาก DOM ไปยัง Maps JavaScript API เหตุการณ์เหล่านี้แยกต่างหากและแตกต่างจากเหตุการณ์ DOM มาตรฐาน
- การแจ้งเตือนการเปลี่ยนแปลงสถานะของ MVC จะแสดงการเปลี่ยนแปลงในออบเจ็กต์ Maps API และตั้งชื่อตามรูปแบบ
property_changed
ออบเจ็กต์ Maps API แต่ละรายการจะส่งออกเหตุการณ์ที่มีชื่อจำนวนหนึ่ง แอปพลิเคชันที่มีความสนใจในเหตุการณ์ที่เฉพาะเจาะจงควรลงทะเบียน Listener เหตุการณ์สําหรับเหตุการณ์เหล่านั้นและเรียกใช้โค้ดเมื่อได้รับเหตุการณ์เหล่านั้น กลไกที่ทำงานตามเหตุการณ์นี้เหมือนกันทั้งใน Maps JavaScript API v2 และ v3 ยกเว้นเนมสเปซที่เปลี่ยนจาก GEvent
เป็น google.maps.event
GEvent.addListener(map, 'click', function() {
alert('You clicked the map.');
});
google.maps.event.addListener(map, 'click', function() {
alert('You clicked the map.');
});
การนำ Listener เหตุการณ์ออก
คุณควรนํา Listener เหตุการณ์ออกเมื่อไม่จําเป็นต้องใช้อีกต่อไปเพื่อเหตุผลด้านประสิทธิภาพ การนํา Listener เหตุการณ์ออกทํางานในลักษณะเดียวกันใน v2 และ v3
- เมื่อคุณสร้าง Listener เหตุการณ์ ระบบจะแสดงผลออบเจ็กต์ทึบแสง (GEventListener ใน v2, MapsEventListener ใน v3)
- เมื่อต้องการนํา Listener เหตุการณ์ออก ให้ส่งออบเจ็กต์นี้ไปยังเมธอด
removeListener()
(GEvent.removeListener()
ใน v2 หรือ google.maps.event.removeListener()
ใน v3) เพื่อนํา Listener เหตุการณ์ออก
การรอรับเหตุการณ์ DOM
หากต้องการบันทึกและตอบสนองต่อเหตุการณ์ DOM (Document Object Model) เวอร์ชัน 3 มีgoogle.maps.event.addDomListener()
วิธีแบบคงที่ ซึ่งเทียบเท่ากับGEvent.addDomListener()
วิธีในเวอร์ชัน 2
การใช้อาร์กิวเมนต์ที่ส่งในเหตุการณ์
เหตุการณ์ UI มักจะส่งอาร์กิวเมนต์เหตุการณ์ซึ่ง Listener ของเหตุการณ์จะเข้าถึงได้ เราลดความซับซ้อนของอาร์กิวเมนต์เหตุการณ์ส่วนใหญ่ใน v3 เพื่อให้สอดคล้องกับออบเจ็กต์ใน API มากขึ้น (ดูรายละเอียดได้ในข้อมูลอ้างอิง v3)
ไม่มีอาร์กิวเมนต์ overlay
ใน Listener เหตุการณ์ v3 หากคุณลงทะเบียนเหตุการณ์ click
ในแผนที่ v3 การเรียกกลับจะเกิดขึ้นเมื่อผู้ใช้คลิกแผนที่ฐานเท่านั้น คุณสามารถลงทะเบียนการเรียกกลับเพิ่มเติมในการวางซ้อนที่คลิกได้หากต้องการตอบสนองต่อการคลิกเหล่านั้น
// Passes an overlay argument when clicking on a map
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(-25.363882, 131.044922), 4);
map.setUIToDefault();
GEvent.addListener(map,'click', function(overlay, latlng) {
if (latlng) {
var marker = new GMarker(latlng);
map.addOverlay(marker);
}
});
// Passes only an event argument
var myOptions = {
center: new google.maps.LatLng(-25.363882, 131.044922),
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById('map'),
myOptions);
google.maps.event.addListener(map, 'click', function(event) {
var marker = new google.maps.Marker({
position: event.latLng,
map: map
});
});
การควบคุม
Maps JavaScript API จะแสดงตัวควบคุม UI ที่ช่วยให้ผู้ใช้โต้ตอบกับแผนที่ได้ คุณสามารถใช้ API เพื่อปรับแต่งลักษณะที่ตัวควบคุมเหล่านี้ปรากฏ
การเปลี่ยนแปลงประเภทการควบคุม
มีการเปลี่ยนแปลงบางอย่างกับประเภท control
เกิดขึ้นเมื่อใช้ v3 API
- v3 API รองรับแผนที่ประเภทอื่นๆ เพิ่มเติม รวมถึงแผนที่ภูมิประเทศและความสามารถในการเพิ่มแผนที่ประเภทที่กำหนดเอง
- การควบคุมแบบลําดับชั้น v2
GHierarchicalMapTypeControl
ไม่มีให้บริการแล้ว
คุณสามารถสร้างเอฟเฟกต์ที่คล้ายกันโดยใช้การควบคุม google.maps.MapTypeControlStyle.HORIZONTAL_BAR
- เลย์เอาต์แนวนอนที่
GMapTypeControl
ระบุใน v2 ไม่พร้อมใช้งานใน v3
การเพิ่มการควบคุมลงในแผนที่
เมื่อใช้ Maps JavaScript API v2 คุณจะต้องเพิ่มการควบคุมลงในแผนที่ผ่านเมธอด addControl()
ของออบเจ็กต์แผนที่ ใน v3 คุณจะแก้ไขออบเจ็กต์ MapOptions
ที่เชื่อมโยงแทนการเข้าถึงหรือแก้ไขตัวควบคุมโดยตรง ตัวอย่างด้านล่างแสดงวิธีปรับแต่งแผนที่เพื่อเพิ่มการควบคุมต่อไปนี้
- ปุ่มที่ช่วยให้ผู้ใช้สลับระหว่างแผนที่ประเภทต่างๆ ได้
- มาตราส่วนแผนที่
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(-25.363882, 131.044922), 4);
// Add controls
map.addControl(new GMapTypeControl());
map.addControl(new GScaleControl());
var myOptions = {
center: new google.maps.LatLng(-25.363882, 131.044922),
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP,
// Add controls
mapTypeControl: true,
scaleControl: true
};
var map = new google.maps.Map(document.getElementById('map'),
myOptions);
การควบคุมการวางตำแหน่งบนแผนที่
การควบคุมตำแหน่งมีการเปลี่ยนแปลงอย่างมากในเวอร์ชัน 3 ใน v2 วิธีการ addControl()
จะรับพารามิเตอร์ที่ 2 (ไม่บังคับ) ซึ่งช่วยให้คุณระบุตําแหน่งของตัวควบคุมสัมพันธ์กับมุมของแผนที่ได้
ใน v3 คุณจะตั้งค่าตําแหน่งของการควบคุมผ่านพร็อพเพอร์ตี้ position
ของตัวเลือกการควบคุม ตำแหน่งของการควบคุมเหล่านี้ไม่ใช่ตำแหน่งที่แน่นอน แต่ API จะจัดวางการควบคุมอย่างชาญฉลาดโดย "จัดเรียง" การควบคุมรอบๆ องค์ประกอบแผนที่ที่มีอยู่ภายในข้อจำกัดที่กำหนด (เช่น ขนาดแผนที่)
วิธีนี้ช่วยให้มั่นใจว่าการควบคุมเริ่มต้นจะเข้ากันได้กับการควบคุมของคุณ
ดูข้อมูลเพิ่มเติมได้ที่การควบคุมการระบุตำแหน่งใน v3
โค้ดต่อไปนี้จะจัดตำแหน่งตัวควบคุมจากตัวอย่างข้างต้นใหม่
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(-25.363882, 131.044922), 4);
// Add map type control
map.addControl(new GMapTypeControl(), new GControlPosition(
G_ANCHOR_TOP_LEFT, new GSize(10, 10)));
// Add scale
map.addControl(new GScaleControl(), new GControlPosition(
G_ANCHOR_BOTTOM_RIGHT, new GSize(20, 20)));
var myOptions = {
center: new google.maps.LatLng(-25.363882, 131.044922),
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP,
// Add map type control
mapTypeControl: true,
mapTypeControlOptions: {
style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
position: google.maps.ControlPosition.TOP_LEFT
},
// Add scale
scaleControl: true,
scaleControlOptions: {
position: google.maps.ControlPosition.BOTTOM_RIGHT
}
};
var map = new google.maps.Map(document.getElementById('map'),
myOptions);
การควบคุมที่กำหนดเอง
Maps JavaScript API ช่วยให้คุณสร้างการควบคุมการไปยังส่วนต่างๆ ที่กําหนดเองได้
หากต้องการปรับแต่งการควบคุมด้วย v2 API คุณจะต้องสร้างคลาสย่อยของคลาส GControl
และกำหนดตัวแฮนเดิลสำหรับเมธอด initialize()
และ getDefaultPosition()
ไม่มีคลาสที่เทียบเท่าคลาส GControl
ใน v3 แต่ระบบจะแสดงการควบคุมเป็นองค์ประกอบ DOM แทน หากต้องการเพิ่มการควบคุมที่กําหนดเองด้วย v3 API ให้สร้างโครงสร้าง DOM สําหรับการควบคุมในคอนสตรคเตอร์เป็นองค์ประกอบย่อยของ Node
(เช่น องค์ประกอบ <div>
) และเพิ่มโปรแกรมรับฟังเหตุการณ์เพื่อจัดการเหตุการณ์ DOM ดัน Node
ไปยังอาร์เรย์ controls[position]
ของแผนที่เพื่อเพิ่มอินสแตนซ์ของการควบคุมที่กำหนดเองลงในแผนที่
เมื่อใช้คลาส HomeControl
ที่เป็นไปตามข้อกําหนดของอินเทอร์เฟซที่ระบุไว้ข้างต้น (ดูรายละเอียดในเอกสารประกอบการควบคุมที่กําหนดเอง) ตัวอย่างโค้ดต่อไปนี้จะแสดงวิธีเพิ่มการควบคุมที่กําหนดเองลงในแผนที่
map.addControl(new HomeControl(),
GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10, 10)));
var homeControlDiv = document.createElement('DIV');
var homeControl = new HomeControl(homeControlDiv, map);
map.controls[google.maps.ControlPosition.TOP_RIGHT].push(
homeControlDiv);
การวางซ้อน
การวางซ้อนแสดงวัตถุที่คุณ "เพิ่ม" ลงในแผนที่เพื่อกำหนดจุด เส้น พื้นที่ หรือคอลเล็กชันของวัตถุ
การเพิ่มและนำไฟล์ซ้อนทับออก
ประเภทของวัตถุที่แสดงโดยการวางซ้อนจะเหมือนกันระหว่าง v2 กับ v3 แต่มีการจัดการต่างกัน
เพิ่มและนำการวางซ้อนใน v2 API ออกจากแผนที่โดยใช้เมธอด addOverlay()
และ removeOverlay()
ของออบเจ็กต์ GMap2
ใน v3 คุณจะกำหนดแผนที่ให้กับการวางซ้อนผ่านพร็อพเพอร์ตี้ map
ของคลาสตัวเลือกการวางซ้อนที่เกี่ยวข้อง
นอกจากนี้ คุณยังเพิ่มหรือนําการวางซ้อนออกได้โดยตรงโดยเรียกใช้เมธอด setMap()
ของออบเจ็กต์การวางซ้อน และระบุแผนที่ที่ต้องการ การตั้งค่าพร็อพเพอร์ตี้แผนที่เป็น null
จะนำการวางซ้อนออก
ไม่มีเมธอด clearOverlays()
ใน v3
หากต้องการจัดการชุดการวางซ้อน คุณควรสร้างอาร์เรย์เพื่อเก็บการวางซ้อน เมื่อใช้อาร์เรย์นี้ คุณจะเรียกใช้ setMap()
กับการวางซ้อนแต่ละรายการในอาร์เรย์ได้ (โดยส่ง null
หากต้องการนำออก)
เครื่องหมายที่ลากได้
โดยค่าเริ่มต้น เครื่องหมายจะคลิกได้ แต่จะลากไม่ได้ ตัวอย่างต่อไปนี้จะเพิ่มเครื่องหมายที่ลากได้
var myLatLng = new GLatLng(-25.363882, 131.044922);
var map = new GMap2(document.getElementById('map'));
map.setCenter(myLatLng, 4);
var marker = new GMarker(latLng, {
draggable: true
});
map.addOverlay(marker);
var myLatLng = new google.maps.LatLng(-25.363882, 131.044922);
var map = new google.maps.Map(
document.getElementById('map'), {
center: myLatLng,
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var marker = new google.maps.Marker({
position: myLatLng,
draggable: true,
map: map
});
ไอคอน
คุณสามารถกำหนดไอคอนที่กำหนดเองให้แสดงแทนเครื่องหมายเริ่มต้นได้
หากต้องการใช้รูปภาพที่กำหนดเองใน v2 ให้สร้างอินสแตนซ์ GIcon
จาก G_DEFAULT_ICON type
แล้วแก้ไข หากรูปภาพมีขนาดใหญ่กว่าหรือเล็กกว่าไอคอนเริ่มต้น คุณต้องระบุรูปภาพด้วยอินสแตนซ์ GSize
v3 API ลดความซับซ้อนของกระบวนการนี้ลงเล็กน้อย
เพียงตั้งค่าพร็อพเพอร์ตี้ icon
ของหมุดเป็น URL ของรูปภาพที่กําหนดเอง แล้ว API จะปรับขนาดไอคอนโดยอัตโนมัติ
Maps JavaScript API ยังรองรับไอคอนที่ซับซ้อนด้วย
ไอคอนที่ซับซ้อนอาจมีหลายไทล์ รูปร่างที่ซับซ้อน หรือระบุ "ลําดับกอง" ของลักษณะที่รูปภาพควรแสดงสัมพันธ์กับการวางซ้อนอื่นๆ หากต้องการเพิ่มรูปร่างลงในเครื่องหมายใน v2 คุณต้องระบุพร็อพเพอร์ตี้เพิ่มเติมในแต่ละอินสแตนซ์ GIcon
แล้วส่งค่านี้เป็นตัวเลือกไปยังคอนสตรคเตอร์ GMarker
ใน v3 ไอคอนที่ระบุด้วยวิธีนี้ควรตั้งค่าพร็อพเพอร์ตี้ icon
เป็นออบเจ็กต์ประเภท Icon
เวอร์ชัน 3 ไม่รองรับเงาเครื่องหมาย
ตัวอย่างต่อไปนี้แสดงธงชายหาดที่หาดบอนไดในออสเตรเลีย โดยส่วนที่โปร่งใสของไอคอนจะคลิกไม่ได้
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(-25.363882, 131.044922), 4);
map.setUIToDefault();
var flagIcon = new GIcon(G_DEFAULT_ICON);
flagIcon.image = '/images/beachflag.png';
flagIcon.imageMap = [1, 1, 1, 20, 18, 20, 18 , 1];
var bbLatLng = new GLatLng(-33.890542, 151.274856);
map.addOverlay(new GMarker(bbLatLng, {
icon: flagIcon
}));
var map = new google.maps.Map(
document.getElementById('map'), {
center: new google.maps.LatLng(-25.363882, 131.044922),
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var shape = {
coord: [1, 1, 1, 20, 18, 20, 18 , 1],
type: 'poly'
};
var bbLatLng = new google.maps.LatLng(-33.890542, 151.274856);
var bbMarker = new google.maps.Marker({
icon: '/images/beachflag.png'
shape: shape,
position: bbLatLng,
map: map
});
เส้นประกอบ
เส้นประกอบประกอบด้วยอาร์เรย์ของ LatLng
รวมถึงชุดส่วนของเส้นที่เชื่อมต่อตำแหน่งเหล่านั้นตามลำดับ
การสร้างและการแสดงออบเจ็กต์ Polyline
ใน v3 คล้ายกับการใช้ออบเจ็กต์ GPolyline
ใน v2 ตัวอย่างต่อไปนี้วาดรูปหลายเส้นเชิงเรขาคณิตที่มีความกว้าง 3 พิกเซลและโปร่งแสงครึ่งหนึ่งจากซูริกไปซิดนีย์ผ่านสิงคโปร์
var polyline = new GPolyline(
[
new GLatLng(47.3690239, 8.5380326),
new GLatLng(1.352083, 103.819836),
new GLatLng(-33.867139, 151.207114)
],
'#FF0000', 3, 0.5, {
geodesic: true
});
map.addOverlay(polyline);
var polyline = new google.maps.Polyline({
path: [
new google.maps.LatLng(47.3690239, 8.5380326),
new google.maps.LatLng(1.352083, 103.819836),
new google.maps.LatLng(-33.867139, 151.207114)
],
strokeColor: '#FF0000',
strokeOpacity: 0.5,
strokeWeight: 3,
geodesic: true
});
polyline.setMap(map);
โพลีไลน์ที่เข้ารหัส
เวอร์ชัน 3 ไม่รองรับการสร้างออบเจ็กต์ Polyline
จากเส้นประกอบที่เข้ารหัสโดยตรง แต่ไลบรารีเรขาคณิตจะมีวิธีการเข้ารหัสและถอดรหัสเส้นประกอบแทน ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีโหลดไลบรารีนี้ได้ในส่วนไลบรารีใน Maps API เวอร์ชัน 3
ตัวอย่างด้านล่างวาดรูปหลายเส้นที่เข้ารหัสเดียวกัน โค้ด v3 ใช้เมธอด decodePath()
จากเนมสเปซ google.maps.geometry.encoding
var polyline = new GPolyline.fromEncoded({
points: 'kwb`Huqbs@ztzwGgvpdQbw}uEoif`H',
levels: 'PPP',
zoomFactor: 2,
numLevels: 18,
color: '#ff0000',
opacity: 0.8,
weight: 3
});
map.addOverlay(polyline);
var polyline = new google.maps.Polyline({
path: google.maps.geometry.encoding.decodePath(
'kwb`Huqbs@ztzwGgvpdQbw}uEoif`H'),
strokeColor: '#FF0000',
strokeOpacity: 0.5,
strokeWeight: 3,
});
polyline.setMap(map);
รูปหลายเหลี่ยม
รูปหลายเหลี่ยมจะกําหนดขอบเขตภายในลูปปิด ออบเจ็กต์ Polygon
ประกอบด้วยชุดจุดในลําดับที่เรียงตามลําดับ คล้ายกับออบเจ็กต์ Polyline
คลาส Polygon
ของ v3 คล้ายกับคลาส GPolygon
ของ v2 มาก ยกเว้นคุณไม่จําเป็นต้องระบุจุดเริ่มต้นที่ปลายเส้นทางซ้ำอีกเพื่อปิดลูป API v3 จะปิดรูปหลายเหลี่ยมโดยอัตโนมัติด้วยการวาดเส้นที่เชื่อมต่อพิกัดสุดท้ายกลับไปยังพิกัดแรก ข้อมูลโค้ดต่อไปนี้สร้างรูปหลายเหลี่ยมที่แสดงสามเหลี่ยมเบอร์มิวดา
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(24.886436, -70.268554), 5);
var bermudaTriangle = new GPolygon(
[
new GLatLng(25.774252, -80.190262),
new GLatLng(18.466465, -66.118292),
new GLatLng(32.321384, -64.75737),
new GLatLng(25.774252, -80.190262)
],
'#FF0000', 2, 0.8, '#FF0000', 0.35);
map.addOverlay(bermudaTriangle);
var map = new google.maps.Map(document.getElementById('map'), {
center: new google.maps.LatLng(24.886436, -70.268554),
mapTypeId: google.maps.MapTypeId.TERRAIN,
zoom: 5
});
var bermudaTriangle = new google.maps.Polygon({
paths: [
new google.maps.LatLng(25.774252, -80.190262),
new google.maps.LatLng(18.466465, -66.118292),
new google.maps.LatLng(32.321384, -64.75737)
],
strokeColor: '#FF0000',
strokeWeight: 2,
strokeOpacity: 0.8,
fillColor: '#FF0000',
fillOpacity: 0.35
});
bermudaTriangle.setMap(map);
รูปร่างที่ผู้ใช้แก้ไขได้
คุณสามารถทำให้ผู้ใช้แก้ไขเส้นประกอบและรูปหลายเหลี่ยมได้ ข้อมูลโค้ดต่อไปนี้มีความหมายเหมือนกัน
map.addOverlay(polyline);
polyline.enableEditing();
polyline.setMap(map);
polyline.setEditable(true);
ดูความสามารถในการวาดขั้นสูงเพิ่มเติมได้ในคลังภาพวาดในเอกสารประกอบ v3
หน้าต่างข้อมูล
InfoWindow
จะแสดงเนื้อหาในหน้าต่างที่ลอยอยู่เหนือแผนที่ ความแตกต่างที่สำคัญระหว่างวิดเจ็ตข้อมูลเวอร์ชัน 2 กับเวอร์ชัน 3 มีดังนี้
- API เวอร์ชัน 2 รองรับ
GInfoWindow
เพียงรายการเดียวต่อแผนที่ แต่ API เวอร์ชัน 3 รองรับ InfoWindow
หลายรายการพร้อมกันในแต่ละแผนที่
InfoWindow
เวอร์ชัน 3 จะยังคงเปิดอยู่เมื่อคุณคลิกแผนที่ GInfoWindow
ของ v2 จะปิดโดยอัตโนมัติเมื่อคุณคลิกแผนที่ คุณสามารถจําลองลักษณะการทํางานของ v2 ได้โดยการเพิ่ม click
listener ในออบเจ็กต์ Map
- API เวอร์ชัน 3 ไม่ได้รองรับ
InfoWindow
แบบแท็บโดยกำเนิด
การวางซ้อนพื้น
หากต้องการวางรูปภาพบนแผนที่ คุณควรใช้ออบเจ็กต์ GroundOverlay
ตัวสร้างของ GroundOverlay
นั้นเหมือนกันใน v2 และ v3 โดยพื้นฐานแล้ว โดยจะระบุ URL ของรูปภาพและขอบเขตของรูปภาพเป็นพารามิเตอร์
ตัวอย่างต่อไปนี้วางแผนที่โบราณของนวร์ก รัฐนิวเจอร์ซีย์บนแผนที่เป็นการวางซ้อน
var bounds = new GLatLngBounds(
new GLatLng(40.716216, -74.213393),
new GLatLng(40.765641, -74.139235));
var overlay = new GGroundOverlay(
'http://lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
bounds);
map.addOverlay(overlay);
var bounds = new google.maps.LatLngBounds(
new google.maps.LatLng(40.716216, -74.213393),
new google.maps.LatLng(40.765641, -74.139235));
var overlay = new google.maps.GroundOverlay(
'http://lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
bounds);
overlay.setMap(map);
ประเภทแผนที่
แผนที่ที่มีให้ใช้งานใน v2 และ v3 จะแตกต่างกันเล็กน้อย แต่แผนที่พื้นฐานทุกประเภทจะใช้ได้กับ API ทั้ง 2 เวอร์ชัน โดยค่าเริ่มต้น v2จะใช้ไทล์แผนที่ถนน "วาด" มาตรฐาน อย่างไรก็ตาม v3 กำหนดให้ต้องระบุประเภทแผนที่ที่เฉพาะเจาะจงเมื่อสร้างออบเจ็กต์ google.maps.Map
ประเภทแผนที่ที่พบบ่อย
แผนที่พื้นฐาน 4 ประเภทมีให้บริการทั้งในเวอร์ชัน 2 และ 3 ดังนี้
MapTypeId.ROADMAP
(แทนที่ G_NORMAL_MAP
)
แสดงมุมมองแผนที่ถนน
MapTypeId.SATELLITE
(แทนที่ G_SATELLITE_MAP
)
แสดงภาพถ่ายดาวเทียมของ Google Earth
MapTypeId.HYBRID
(แทนที่ G_HYBRID_MAP
)
แสดงมุมมองปกติและมุมมองดาวเทียมผสมกัน
MapTypeId.TERRAIN
(แทนที่ G_PHYSICAL_MAP
)
แสดงแผนที่ภูมิศาสตร์ตามข้อมูลภูมิประเทศ
ด้านล่างนี้คือตัวอย่าง v2 และ v3 การตั้งค่าแผนที่เป็นมุมมองภูมิประเทศ
map.setMapType(G_PHYSICAL_MAP);
map.setMapTypeId(google.maps.MapTypeId.TERRAIN);
Maps JavaScript API v3 ได้ทำการเปลี่ยนแปลงบางอย่างกับแผนที่ประเภทที่ใช้ไม่บ่อยด้วย ดังนี้
- ไทล์แผนที่สำหรับวัตถุท้องฟ้าที่ไม่ใช่โลกไม่มีให้บริการเป็นประเภทแผนที่ใน v3 API แต่เข้าถึงได้ในรูปแบบแผนที่ที่กำหนดเองตามที่แสดงในตัวอย่างนี้
- ไม่มีแผนที่ประเภทพิเศษใน v3 ที่จะมาแทนที่ประเภท
G_SATELLITE_3D_MAP
จาก v2 แต่คุณสามารถผสานรวมปลั๊กอิน Google Earth ในแผนที่ v3 ได้โดยใช้คลังนี้
ภาพระดับการซูมสูงสุด
ภาพถ่ายดาวเทียมอาจไม่พร้อมใช้งานในระดับการซูมสูงเสมอไป หากต้องการทราบระดับการซูมสูงสุดที่ใช้ได้ก่อนที่จะตั้งค่าระดับการซูม ให้ใช้คลาส google.maps.MaxZoomService
คลาสนี้จะแทนที่เมธอด GMapType.getMaxZoomAtLatLng()
จาก v2
var point = new GLatLng(
180 * Math.random() - 90, 360 * Math.random() - 180);
var map = new GMap2(document.getElementById("map"));
map.setUIToDefault();
map.setCenter(point);
map.setMapType(G_HYBRID_MAP);
map.getCurrentMapType().getMaxZoomAtLatLng(point,
function(response) {
if (response.status) {
map.setZoom(response.zoom);
} else {
alert("Error in Max Zoom Service.");
}
});
var myLatlng = new google.maps.LatLng(
180 * Math.random() - 90, 360 * Math.random() - 180);
var map = new google.maps.Map(
document.getElementById("map"),{
zoom: 0,
center: myLatlng,
mapTypeId: google.maps.MapTypeId.HYBRID
});
var maxZoomService = new google.maps.MaxZoomService();
maxZoomService.getMaxZoomAtLatLng(
myLatlng,
function(response) {
if (response.status == google.maps.MaxZoomStatus.OK) {
map.setZoom(response.zoom);
} else {
alert("Error in Max Zoom Service.");
}
});
ภาพถ่ายทางอากาศแบบมุมมอง
เมื่อเปิดใช้ภาพถ่ายทางอากาศใน v3 การควบคุมจะคล้ายกับการควบคุม GLargeZoomControl3D
ใน v2 โดยมีการควบคุมการหมุนเพิ่มเติมเพื่อหมุนไปยังทิศทางที่รองรับ
คุณติดตามเมืองที่มีภาพมุม 45° พร้อมให้บริการได้ในแผนที่นี้ เมื่อภาพมุม 45° พร้อมใช้งาน ระบบจะเพิ่มตัวเลือกเมนูย่อยลงในปุ่มดาวเทียมของ Maps API
เลเยอร์
เลเยอร์คือวัตถุบนแผนที่ที่ประกอบด้วยการวางซ้อนอย่างน้อย 1 รายการ โดยสามารถจัดการเป็นหน่วยเดียวและโดยทั่วไปจะแสดงถึงกลุ่มของวัตถุ
เลเยอร์ที่รองรับ
v3 API ให้สิทธิ์เข้าถึงเลเยอร์ต่างๆ เลเยอร์เหล่านี้ซ้อนทับกับคลาส v2 GLayer
ในพื้นที่ต่อไปนี้
-
ออบเจ็กต์
KmlLayer
จะแสดงผลองค์ประกอบ KML และ GeoRSS เป็นการวางซ้อน v3 ซึ่งเทียบเท่ากับเลเยอร์ GeoXml
v2
- ออบเจ็กต์
TrafficLayer
จะแสดงผลเลเยอร์ซึ่งแสดงสภาพการจราจร คล้ายกับการวางซ้อน GTrafficOverlay
เวอร์ชัน 2
เลเยอร์เหล่านี้แตกต่างจาก v2 โปรดดูความแตกต่างที่อธิบายไว้ด้านล่าง เลเยอร์สามารถเพิ่มลงในแผนที่ได้โดยเรียกใช้ setMap()
โดยส่งออบเจ็กต์ Map
ที่จะแสดงเลเยอร์
ดูข้อมูลเพิ่มเติมเกี่ยวกับเลเยอร์ที่ได้รับการรองรับได้ในเอกสารประกอบเกี่ยวกับเลเยอร์
เลเยอร์ KML และ GeoRSS
Maps JavaScript API รองรับรูปแบบข้อมูล KML และ GeoRSS สำหรับการแสดงข้อมูลทางภูมิศาสตร์ ไฟล์ KML หรือ GeoRSS ต้องเข้าถึงได้แบบสาธารณะหากคุณต้องการรวมไว้ในแผนที่ ใน v3 รูปแบบข้อมูลเหล่านี้จะแสดงโดยใช้อินสแตนซ์ของ KmlLayer
ซึ่งมาแทนที่ออบเจ็กต์ GGeoXml
จาก v2
API เวอร์ชัน 3 มีความยืดหยุ่นมากขึ้นเมื่อแสดงผล KML ซึ่งช่วยให้คุณซ่อน InfoWindows และแก้ไขการตอบสนองต่อการคลิกได้ ดูรายละเอียดเพิ่มเติมในเอกสารเลเยอร์ KML และ GeoRSS เวอร์ชัน 3
เมื่อแสดงผล KmlLayer
ระบบจะใช้ข้อจำกัดด้านขนาดและความซับซ้อน โปรดดูรายละเอียดในเอกสารประกอบของ KmlLayer
ตัวอย่างต่อไปนี้เปรียบเทียบวิธีโหลดไฟล์ KML
geoXml = new GGeoXml(
'https://googlearchive.github.io/js-v2-samples/ggeoxml/cta.kml');
map.addOverlay(geoXml);
var layer = new google.maps.KmlLayer(
'https://googlearchive.github.io/js-v2-samples/ggeoxml/cta.kml', {
preserveViewport: true
});
layer.setMap(map);
เลเยอร์การเข้าชม
v3 ให้คุณเพิ่มข้อมูลการจราจรแบบเรียลไทม์ (หากรองรับ) ลงในแผนที่ได้โดยใช้ออบเจ็กต์ TrafficLayer
ข้อมูลการจราจรจะแสดงตามเวลาที่ส่งคำขอ ตัวอย่างต่อไปนี้แสดงข้อมูลการจราจรสำหรับลอสแอนเจลิส
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(34.0492459, -118.241043), 13);
map.setUIToDefault();
var trafficOptions = {incidents:false};
trafficInfo = new GTrafficOverlay(trafficOptions);
map.addOverlay(trafficInfo);
var map = new google.maps.Map(
document.getElementById('map'), {
center: new google.maps.LatLng(34.0492459, -118.241043),
mapTypeId: google.maps.MapTypeId.ROADMAP,
zoom: 13
});
var trafficLayer = new google.maps.TrafficLayer();
trafficLayer.setMap(map);
ต่างจาก v2 ที่จะไม่มีตัวเลือกสำหรับตัวสร้าง TrafficLayer
ใน v3 เหตุการณ์ไม่พร้อมใช้งานใน v3
บริการ
การเข้ารหัสพิกัดภูมิศาสตร์
Maps JavaScript API มีออบเจ็กต์ geocoder
สำหรับการแปลงที่อยู่เป็นพิกัดภูมิศาสตร์แบบไดนามิกจากข้อมูลที่ผู้ใช้ป้อน หากต้องการเข้ารหัสพิกัดภูมิศาสตร์ของที่อยู่แบบคงที่ซึ่งทราบอยู่แล้ว โปรดดูเอกสารประกอบของ Geocoding API
Geocoding API ได้รับการอัปเกรดและปรับปรุงอย่างมาก โดยเพิ่มฟีเจอร์ใหม่ๆ และเปลี่ยนแปลงวิธีแสดงข้อมูล
GClientGeocoder
ใน API เวอร์ชัน 2 มี 2 วิธีที่แตกต่างกันในการเปลี่ยนที่อยู่เป็นพิกัดภูมิศาสตร์ตามลำดับและย้อนกลับ รวมถึงวิธีอื่นๆ ในการส่งผลต่อวิธีเปลี่ยนที่อยู่เป็นพิกัดภูมิศาสตร์ ในทางตรงกันข้าม ออบเจ็กต์ Geocoder
เวอร์ชัน 3 มีเพียงเมธอด geocode()
เท่านั้น ซึ่งใช้ลิเทอรัลออบเจ็กต์ที่มีคำที่ป้อน (ในรูปแบบออบเจ็กต์ Geocoding Request) และเมธอดการเรียกกลับ Geocoding API จะแสดงผลลัพธ์การเข้ารหัสพิกัดภูมิศาสตร์แบบย้อนกลับหรือแบบส่งต่อ ทั้งนี้ขึ้นอยู่กับว่าคำขอมีแอตทริบิวต์ address
แบบข้อความหรือออบเจ็กต์ LatLng
คุณกำหนดวิธีดำเนินการจับคู่พิกัดภูมิศาสตร์ได้โดยส่งฟิลด์เพิ่มเติมไปยังคำขอจับคู่พิกัดภูมิศาสตร์ ดังนี้
- การใส่
address
แบบข้อความจะทริกเกอร์การแปลงพิกัดภูมิศาสตร์แบบส่งต่อ ซึ่งเทียบเท่ากับการเรียกใช้เมธอด getLatLng()
- การใส่ออบเจ็กต์
latLng
จะทริกเกอร์การเข้ารหัสพิกัดภูมิศาสตร์แบบย้อนกลับ ซึ่งเทียบเท่ากับการเรียกเมธอด getLocations()
- การใส่แอตทริบิวต์
bounds
จะเปิดใช้การปรับความถ่วงของวิวพอร์ต ซึ่งเทียบเท่ากับการเรียกใช้เมธอด setViewport()
- การใส่แอตทริบิวต์
region
จะเปิดใช้การถ่วงน้ำหนักรหัสตามภูมิภาค ซึ่งเทียบเท่ากับการเรียกใช้เมธอด setBaseCountryCode()
การระบุพิกัดภูมิศาสตร์ใน v3 จะแตกต่างจากคำตอบใน v2 อย่างมาก API เวอร์ชัน 3 จะใช้โครงสร้างที่เรียบง่ายกว่าซึ่งง่ายต่อการแยกวิเคราะห์แทนโครงสร้างที่ฝังซ้อนกันซึ่งเวอร์ชัน 2 ใช้ นอกจากนี้ คำตอบเวอร์ชัน 3 ยังละเอียดยิ่งขึ้นอีกด้วย ผลลัพธ์แต่ละรายการมีคอมโพเนนต์การแก้ไขหลายรายการที่ช่วยให้เห็นภาพการแก้ปัญหาของผลลัพธ์แต่ละรายการได้ดียิ่งขึ้น
โค้ดต่อไปนี้จะนําที่อยู่แบบข้อความและแสดงผลลัพธ์แรกจากการจับคู่ที่อยู่ตามภูมิศาสตร์
var geocoder = new GClientGeocoder();
var infoPanel;
var map;
var AccuracyDescription = [
'Unknown accuracy', 'country level accuracy',
'region level accuracy', 'sub-region level accuracy',
'town level accuracy', 'post code level accuracy',
'street level accuracy', 'intersection level accuracy',
'address level accuracy', 'premise level accuracy',
];
function geocode_result_handler(response) {
if (!response || response.Status.code != 200) {
alert('Geocoding failed. ' + response.Status.code);
} else {
var bounds = new GLatLngBounds(new GLatLng(
response.Placemark[0].ExtendedData.LatLonBox.south,
response.Placemark[0].ExtendedData.LatLonBox.west
), new GLatLng(
response.Placemark[0].ExtendedData.LatLonBox.north,
response.Placemark[0].ExtendedData.LatLonBox.east
));
map.setCenter(bounds.getCenter(),
map.getBoundsZoomLevel(bounds));
var latlng = new GLatLng(
response.Placemark[0].Point.coordinates[1],
response.Placemark[0].Point.coordinates[0]);
infoPanel.innerHTML += '<p>1st result is <em>' +
// No info about location type
response.Placemark[0].address +
'</em> of <em>' +
AccuracyDescription[response.Placemark[0].
AddressDetails.Accuracy] +
'</em> at <tt>' + latlng + '</tt></p>';
var marker_title = response.Placemark[0].address +
' at ' + latlng;
map.clearOverlays();
var marker = marker = new GMarker(
latlng,
{'title': marker_title}
);
map.addOverlay(marker);
}
}
function geocode_address() {
var address = document.getElementById('input-text').value;
infoPanel.innerHTML = '<p>Original address: ' + address + '</p>';
geocoder.getLocations(address, geocode_result_handler);
}
function initialize() {
map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(38, 15), 2);
map.setUIToDefault();
infoPanel = document.getElementById('info-panel');
}
var geocoder = new google.maps.Geocoder();
var infoPanel;
var map;
var marker;
function geocode_result_handler(result, status) {
if (status != google.maps.GeocoderStatus.OK) {
alert('Geocoding failed. ' + status);
} else {
map.fitBounds(result[0].geometry.viewport);
infoPanel.innerHTML += '<p>1st result for geocoding is <em>' +
result[0].geometry.location_type.toLowerCase() +
'</em> to <em>' +
result[0].formatted_address + '</em> of types <em>' +
result[0].types.join('</em>, <em>').replace(/_/, ' ') +
'</em> at <tt>' + result[0].geometry.location +
'</tt></p>';
var marker_title = result[0].formatted_address +
' at ' + latlng;
if (marker) {
marker.setPosition(result[0].geometry.location);
marker.setTitle(marker_title);
} else {
marker = new google.maps.Marker({
position: result[0].geometry.location,
title: marker_title,
map: map
});
}
}
}
function geocode_address() {
var address = document.getElementById('input-text').value;
infoPanel.innerHTML = '<p>Original address: ' + address + '</p>';
geocoder.geocode({'address': address}, geocode_result_handler);
}
function initialize() {
map = new google.maps.Map(document.getElementById('map'), {
center: new google.maps.LatLng(38, 15),
zoom: 2,
mapTypeId: google.maps.MapTypeId.HYBRID
});
infoPanel = document.getElementById('info-panel');
}
เส้นทาง
Maps JavaScript API v3 ใช้คลาส DirectionsService
แทนคลาส GDirections
จาก v2 เพื่อคำนวณเส้นทาง
เมธอด route()
ใน v3 จะแทนที่ทั้งเมธอด load()
และ loadFromWaypoints()
จาก API เวอร์ชัน 2 เมธอดนี้ใช้ออบเจ็กต์ DirectionsRequest
เดียวที่เป็นลิเทอรัลซึ่งมีคําที่ป้อน และเมธอด Callback เพื่อเรียกใช้เมื่อได้รับคําตอบ ตัวเลือกอาจระบุไว้ในลิเทอรัลออบเจ็กต์นี้ ซึ่งคล้ายกับลิเทอรัลออบเจ็กต์ GDirectionsOptions
ใน v2
ใน Maps JavaScript API v3 งานการส่งคําขอเส้นทางแยกออกจากงานแสดงผลคําขอ ซึ่งตอนนี้จัดการด้วยคลาส DirectionsRenderer
คุณผูกออบเจ็กต์ DirectionsRenderer
กับแผนที่หรือออบเจ็กต์ DirectionsResult
ใดก็ได้ผ่านเมธอด setMap()
และ setDirections()
เนื่องจากโปรแกรมแสดงผลเป็น MVCObject
จึงจะตรวจหาการเปลี่ยนแปลงในพร็อพเพอร์ตี้และอัปเดตแผนที่เมื่อเส้นทางที่เกี่ยวข้องมีการเปลี่ยนแปลง
โค้ดต่อไปนี้แสดงวิธีขอเส้นทางเดินไปยังสถานที่ที่เฉพาะเจาะจงโดยใช้ทางเท้าจากที่อยู่ โปรดทราบว่ามีเพียง v3 เท่านั้นที่ให้เส้นทางเดินเท้าบนทางเท้าในสวนสัตว์ดับลินได้
var map;
var directions;
var directionsPanel;
function initialize() {
var origin = new google.maps.LatLng(53.348172, -6.297285);
var destination = new google.maps.LatLng(53.355502, -6.30557);
directionsPanel = document.getElementById("route");
map = new GMap2(document.getElementById('map'));
map.setCenter(origin, 10);
map.setUIToDefault();
directions = new GDirections(map, directionsPanel);
directions.loadFromWaypoints(
[origin, destination], {
travelMode: 'G_TRAVEL_MODE_WALKING',
});
}
var map;
var directionsRenderer;
var directionsService = new google.maps.DirectionsService();
function initialize() {
var origin = new google.maps.LatLng(53.348172, -6.297285);
var destination = new google.maps.LatLng(53.355502, -6.30557);
directionsRenderer = new google.maps.DirectionsRenderer();
map = new google.maps.Map(
document.getElementById('map'), {
center: origin,
zoom: 10,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
directionsRenderer.setPanel(document.getElementById("route"));
directionsRenderer.setMap(map);
directionsService.route({
origin: origin,
destination: destination,
travelMode: google.maps.DirectionsTravelMode.WALKING
}, function(result, status) {
if (status == google.maps.DirectionsStatus.OK) {
directionsRenderer.setDirections(result);
}
});
}
Street View
Google Street View แสดงภาพมุมมอง 360 องศาแบบอินเทอร์แอกทีฟจากสถานที่ที่กำหนดภายในพื้นที่ให้บริการ API เวอร์ชัน 3 รองรับ Street View โดยตรงภายในเบราว์เซอร์ ซึ่งแตกต่างจากเวอร์ชัน 2 ที่ต้องอาศัยปลั๊กอิน Flash® เพื่อแสดงภาพ Street View
ระบบรองรับรูปภาพ Street View ผ่านการใช้ออบเจ็กต์ StreetViewPanorama
ใน v3 หรือออบเจ็กต์ GStreetviewPanorama
ใน v2 คลาสเหล่านี้มีอินเทอร์เฟซที่แตกต่างกัน แต่มีบทบาทเหมือนกัน ซึ่งก็คือการเชื่อมต่อdiv
คอนเทนเนอร์กับภาพ Street View และให้คุณระบุตำแหน่งและ POV (จุดมอง) ของภาพพาโนรามา Street View
function initialize() {
var fenwayPark = new GLatLng(42.345573, -71.098326);
panoramaOptions = {
latlng: fenwayPark,
pov: {
heading: 35,
pitch: 5,
zoom: 1
}
};
var panorama = new GStreetviewPanorama(
document.getElementById('pano'),
panoramaOptions);
GEvent.addListener(myPano, "error", handleNoFlash);
}
function handleNoFlash(errorCode) {
if (errorCode == FLASH_UNAVAILABLE) {
alert('Error: Your browser does not support Flash');
return;
}
}
function initialize() {
var fenway = new google.maps.LatLng(42.345573, -71.098326);
var panoramaOptions = {
position: fenway,
pov: {
heading: 35,
pitch: 5,
zoom: 1
}
};
var panorama = new google.maps.StreetViewPanorama(
document.getElementById('pano'),
panoramaOptions);
}
คุณสามารถเข้าถึงข้อมูล Street View โดยตรงผ่านออบเจ็กต์ StreetViewService
ใน v3 หรือออบเจ็กต์ GStreetviewClient
ที่คล้ายกันใน v2 โดยทั้ง 2 แพลตฟอร์มมีอินเทอร์เฟซที่คล้ายกันในการดึงข้อมูลหรือตรวจสอบความพร้อมใช้งานของข้อมูล Street View และอนุญาตให้ค้นหาตามสถานที่หรือรหัสภาพพาโนรามา
ในเวอร์ชัน 3 ระบบจะเปิดใช้ Street View โดยค่าเริ่มต้น แผนที่จะปรากฏขึ้นพร้อมตัวควบคุม Pegman ของ Street View และ API จะใช้ div แผนที่ซ้ำเพื่อแสดงภาพพาโนรามาของ Street View โค้ดต่อไปนี้แสดงวิธีจําลองลักษณะการทํางานของ v2 โดยการแยกภาพพาโนรามาของ Street View ออกเป็น div แยกต่างหาก
var marker;
var panoClient = new GStreetviewClient();
function initialize() {
if (GBrowserIsCompatible()) {
var myPano = new GStreetviewPanorama(
document.getElementById('pano'));
GEvent.addListener(myPano, 'error', handleNoFlash);
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(42.345573, -71.098326), 16);
map.setUIToDefault();
GEvent.addListener(map, 'click', function(overlay, latlng) {
if (marker) {
marker.setLatLng(latlng);
} else {
marker = new GMarker(latlng);
map.addOverlay(marker);
}
var nearestPano = panoClient.getNearestPanorama(
latlng, processSVData);
});
function processSVData(panoData) {
if (panoData.code != 200) {
alert("Panorama data not found for this location.");
}
var latlng = marker.getLatLng();
var dLat = latlng.latRadians()
- panoData.location.latlng.latRadians();
var dLon = latlng.lngRadians()
- panoData.location.latlng.lngRadians();
var y = Math.sin(dLon) * Math.cos(latlng.latRadians());
var x = Math.cos(panoData.location.latlng.latRadians()) *
Math.sin(latlng.latRadians()) -
Math.sin(panoData.location.latlng.latRadians()) *
Math.cos(latlng.latRadians()) * Math.cos(dLon);
var bearing = Math.atan2(y, x) * 180 / Math.PI;
myPano.setLocationAndPOV(panoData.location.latlng, {
yaw: bearing
});
}
function handleNoFlash(errorCode) {
if (errorCode == FLASH_UNAVAILABLE) {
alert('Error: Your browser does not support Flash');
return;
}
}
}
}
// Load the API with libraries=geometry
var map;
var marker;
var panorama;
var sv = new google.maps.StreetViewService();
function radians(degrees) { return Math.PI * degrees / 180.0 };
function initialize() {
panorama = new google.maps.StreetViewPanorama(
document.getElementById("pano"));
map = new google.maps.Map(
document.getElementById('map'), {
center: new google.maps.LatLng(42.345573, -71.098326),
mapTypeId: google.maps.MapTypeId.ROADMAP,
zoom: 16
});
google.maps.event.addListener(map, 'click', function(event) {
if (!marker) {
marker = new google.maps.Marker({
position: event.latLng,
map: map
});
} else {
marker.setPosition(event.latLng);
}
sv.getPanoramaByLocation(event.latLng, 50, processSVData);
});
}
function processSVData(panoData, status) {
if (status == google.maps.StreetViewStatus.OK) {
alert("Panorama data not found for this location.");
}
var bearing = google.maps.geometry.spherical.computeHeading(
panoData.location.latLng, marker.getPosition());
panorama.setPano(panoData.location.pano);
panorama.setPov({
heading: bearing,
pitch: 0,
zoom: 1
});
panorama.setVisible(true);
marker.setMap(panorama);
}