Maps JavaScript API มีการติดตั้งใช้งานแผนที่ 2 แบบ ได้แก่ แรสเตอร์และเวกเตอร์ แผนที่แรสเตอร์จะโหลดแผนที่เป็นตารางกริดของไทล์รูปภาพแรสเตอร์ที่อิงตามพิกเซล ซึ่งสร้างขึ้นโดยฝั่งเซิร์ฟเวอร์ของ Google Maps Platform แล้วแสดงผลในเว็บแอป แผนที่เวกเตอร์ประกอบด้วยไทล์ที่อิงตามเวกเตอร์ ซึ่งวาดขึ้นในฝั่งไคลเอ็นต์ในเวลาที่ใช้ในการโหลดโดยใช้ WebGL ซึ่งเป็นเทคโนโลยีเว็บที่ช่วยให้เบราว์เซอร์เข้าถึง GPU ในอุปกรณ์ของผู้ใช้เพื่อแสดงกราฟิก 2 มิติและ 3 มิติ
แผนที่เวกเตอร์เป็นแผนที่ Google แบบเดียวกับที่ผู้ใช้คุ้นเคย และมีข้อดีหลายประการเหนือแผนที่ไทล์แรสเตอร์เริ่มต้น โดยเฉพาะอย่างยิ่งความคมชัดของรูปภาพที่อิงตามเวกเตอร์ และการเพิ่มสิ่งปลูกสร้าง 3 มิติในระดับการซูมใกล้ แผนที่เวกเตอร์รองรับฟีเจอร์ต่อไปนี้
- การควบคุมการเอียงและการวางแนวแบบเป็นโปรแกรม
- การควบคุมกล้องที่ดียิ่งขึ้น
- การซูมแบบเศษส่วนเพื่อการซูมที่ราบรื่นยิ่งขึ้น
สำหรับแผนที่ที่โหลดโดยใช้องค์ประกอบ
divและ JavaScript ประเภทการแสดงผลเริ่มต้นคือgoogle.maps.RenderingType.RASTERสำหรับแผนที่ที่โหลดโดยใช้องค์ประกอบ
gmp-mapประเภทการแสดงผลเริ่มต้นคือgoogle.maps.RenderingType.VECTORโดยเปิดใช้การควบคุมการเอียงและการวางแนว
การเอียงและการหมุน
คุณสามารถตั้งค่าการเอียงและการหมุน (การวางแนว) ในแผนที่เวกเตอร์
ได้โดยใส่พร็อพเพอร์ตี้ heading และ tilt เมื่อเริ่มต้นแผนที่ และ
โดยเรียกใช้เมธอด setTilt และ setHeading ในแผนที่ ตัวอย่างต่อไปนี้จะเพิ่มปุ่มบางปุ่มลงในแผนที่ ซึ่งแสดงการปรับการเอียงและการวางแนวแบบเป็นโปรแกรมทีละ 20 องศา
TypeScript
function initMap(): void { const map = new google.maps.Map( document.getElementById("map") as HTMLElement, { center: { lat: 37.7893719, lng: -122.3942, }, zoom: 16, heading: 320, tilt: 47.5, mapId: "90f87356969d889c", } ); const buttons: [string, string, number, google.maps.ControlPosition][] = [ ["Rotate Left", "rotate", 20, google.maps.ControlPosition.LEFT_CENTER], ["Rotate Right", "rotate", -20, google.maps.ControlPosition.RIGHT_CENTER], ["Tilt Down", "tilt", 20, google.maps.ControlPosition.TOP_CENTER], ["Tilt Up", "tilt", -20, google.maps.ControlPosition.BOTTOM_CENTER], ]; buttons.forEach(([text, mode, amount, position]) => { const controlDiv = document.createElement("div"); const controlUI = document.createElement("button"); controlUI.classList.add("ui-button"); controlUI.innerText = `${text}`; controlUI.addEventListener("click", () => { adjustMap(mode, amount); }); controlDiv.appendChild(controlUI); map.controls[position].push(controlDiv); }); const adjustMap = function (mode: string, amount: number) { switch (mode) { case "tilt": map.setTilt(map.getTilt()! + amount); break; case "rotate": map.setHeading(map.getHeading()! + amount); break; default: break; } }; } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
function initMap() { const map = new google.maps.Map(document.getElementById("map"), { center: { lat: 37.7893719, lng: -122.3942, }, zoom: 16, heading: 320, tilt: 47.5, mapId: "90f87356969d889c", }); const buttons = [ ["Rotate Left", "rotate", 20, google.maps.ControlPosition.LEFT_CENTER], ["Rotate Right", "rotate", -20, google.maps.ControlPosition.RIGHT_CENTER], ["Tilt Down", "tilt", 20, google.maps.ControlPosition.TOP_CENTER], ["Tilt Up", "tilt", -20, google.maps.ControlPosition.BOTTOM_CENTER], ]; buttons.forEach(([text, mode, amount, position]) => { const controlDiv = document.createElement("div"); const controlUI = document.createElement("button"); controlUI.classList.add("ui-button"); controlUI.innerText = `${text}`; controlUI.addEventListener("click", () => { adjustMap(mode, amount); }); controlDiv.appendChild(controlUI); map.controls[position].push(controlDiv); }); const adjustMap = function (mode, amount) { switch (mode) { case "tilt": map.setTilt(map.getTilt() + amount); break; case "rotate": map.setHeading(map.getHeading() + amount); break; default: break; } }; } window.initMap = initMap;
CSS
/* * Always set the map height explicitly to define the size of the div element * that contains the map. */ #map { height: 100%; } /* * Optional: Makes the sample page fill the window. */ html, body { height: 100%; margin: 0; padding: 0; } .ui-button { background-color: #fff; border: 0; border-radius: 2px; box-shadow: 0 1px 4px -1px rgba(0, 0, 0, 0.3); margin: 10px; padding: 0 0.5em; font: 400 18px Roboto, Arial, sans-serif; overflow: hidden; height: 40px; cursor: pointer; } .ui-button:hover { background: rgb(235, 235, 235); }
HTML
<html>
<head>
<title>Tilt and Rotation</title>
<link rel="stylesheet" type="text/css" href="./style.css" />
<script type="module" src="./index.js"></script>
</head>
<body>
<div id="map"></div>
<!--
The `defer` attribute causes the script to execute after the full HTML
document has been parsed. For non-blocking uses, avoiding race conditions,
and consistent behavior across browsers, consider loading using Promises. See
https://developers.google.com/maps/documentation/javascript/load-maps-js-api
for more information.
-->
<script
src="https://maps.googleapis.com/maps/api/js?key=AIzaSyB41DRUbKWJHPxaFjMAwdrzWzbVKartNGg&callback=initMap&v=weekly"
defer
></script>
</body>
</html>ลองใช้ตัวอย่าง
ใช้ท่าทางสัมผัสด้วยเมาส์และแป้นพิมพ์
หากเปิดใช้การโต้ตอบของผู้ใช้สำหรับการเอียงและการหมุน (การวางแนว) (แบบเป็นโปรแกรมหรือในคอนโซล Google Cloud) ผู้ใช้จะปรับการเอียงและการหมุนโดยใช้เมาส์และแป้นพิมพ์ได้ดังนี้
- การใช้เมาส์ ให้กดปุ่ม Shift ค้างไว้ แล้วลากเมาส์ ขึ้นและลงเพื่อปรับการเอียง และลากไปทางขวาและซ้ายเพื่อปรับการวางแนว
- การใช้แป้นพิมพ์ ให้กดปุ่ม Shift ค้างไว้ แล้วใช้ปุ่มลูกศรขึ้นและลง เพื่อปรับการเอียง และใช้ปุ่มลูกศรขวาและซ้ายเพื่อปรับ การวางแนว
ปรับการเอียงและการวางแนวแบบเป็นโปรแกรม
ใช้เมธอด setTilt() และ setHeading() เพื่อปรับการเอียงและการวางแนวในแผนที่เวกเตอร์แบบเป็นโปรแกรม การวางแนวคือทิศทางที่กล้องหันไปตามเข็มนาฬิกาโดยเริ่มจากทิศเหนือ ดังนั้น map.setHeading(90) จะหมุนแผนที่เพื่อให้ทิศตะวันออกหันขึ้น มุมเอียงวัดจากจุดเหนือศีรษะ ดังนั้น map.setTilt(0) จะมองตรงลงมา ในขณะที่ map.setTilt(45) จะแสดงมุมมองเฉียง
- เรียกใช้
setTilt()เพื่อตั้งค่ามุมเอียงของแผนที่ ใช้getTilt()เพื่อรับค่าการเอียงปัจจุบัน - เรียกใช้
setHeading()เพื่อตั้งค่าการวางแนวของแผนที่ ใช้getHeading()เพื่อรับค่าการวางแนวปัจจุบัน
หากต้องการเปลี่ยนจุดกึ่งกลางของแผนที่ขณะที่ยังคงการเอียงและการวางแนวไว้ ให้ใช้ map.setCenter() หรือ map.panBy()
โปรดทราบว่าช่วงของมุมที่ใช้ได้จะแตกต่างกันไปตามระดับการซูมปัจจุบัน ค่าที่อยู่นอกช่วงนี้จะถูกจำกัดให้อยู่ในช่วงที่อนุญาต
นอกจากนี้ คุณยังใช้เมธอด moveCamera เพื่อเปลี่ยนการวางแนว การเอียง จุดกึ่งกลาง และการซูมแบบเป็นโปรแกรมได้ด้วย
ดูข้อมูลเพิ่มเติม
ผลกระทบต่อเมธอดอื่นๆ
เมื่อใช้การเอียงหรือการหมุนกับแผนที่ ลักษณะการทำงานของเมธอดอื่นๆ ของ Maps JavaScript API จะได้รับผลกระทบดังนี้
map.getBounds()จะแสดงผลกรอบล้อมรอบที่เล็กที่สุดซึ่งรวมถึงภูมิภาคที่มองเห็นได้เสมอ เมื่อใช้การเอียง ขอบเขตที่แสดงผลอาจแสดงถึงภูมิภาคที่ใหญ่กว่าภูมิภาคที่มองเห็นได้ของวิวพอร์ตของแผนที่map.fitBounds()จะรีเซ็ตการเอียงและการวางแนวเป็น 0 ก่อนที่จะปรับขอบเขตmap.panToBounds()จะรีเซ็ตการเอียงและการวางแนวเป็น 0 ก่อนที่จะเลื่อนขอบเขตmap.setTilt()ยอมรับค่าใดก็ได้ แต่จะจำกัดการเอียงสูงสุดตามระดับการซูมของแผนที่ปัจจุบันmap.setHeading()ยอมรับค่าใดก็ได้ และจะแก้ไขค่าดังกล่าวให้พอดีกับช่วง[0, 360]
ควบคุมกล้อง
ใช้ฟังก์ชัน map.moveCamera() เพื่ออัปเดตพร็อพเพอร์ตี้ของกล้องหลายรายการพร้อมกัน map.moveCamera() ยอมรับพารามิเตอร์เดียวที่มีพร็อพเพอร์ตี้ของกล้องทั้งหมดที่จะอัปเดต ตัวอย่างต่อไปนี้แสดงการเรียกใช้ map.moveCamera() เพื่อตั้งค่า center, zoom, heading และ tilt พร้อมกัน
map.moveCamera({
center: new google.maps.LatLng(37.7893719, -122.3942),
zoom: 16,
heading: 320,
tilt: 47.5
});
คุณสามารถสร้างภาพเคลื่อนไหวของพร็อพเพอร์ตี้ของกล้องได้โดยเรียกใช้ map.moveCamera() ด้วยลูปภาพเคลื่อนไหว ดังที่แสดงไว้ที่นี่
const degreesPerSecond = 3;
function animateCamera(time) {
// Update the heading, leave everything else as-is.
map.moveCamera({
heading: (time / 1000) * degreesPerSecond
});
requestAnimationFrame(animateCamera);
}
// Start the animation.
requestAnimationFrame(animateCamera);
ตำแหน่งกล้อง
มุมมองแผนที่ได้รับการจำลองเป็นกล้อง ที่มองลงมายังระนาบแบน ตำแหน่ง ของกล้อง (และดังนั้นการแสดงผลของแผนที่) จะระบุโดย พร็อพเพอร์ตี้ต่อไปนี้ ได้แก่ เป้าหมาย (ตำแหน่งละติจูด/ลองจิจูด) ทิศทาง การเอียง และ การซูม
เป้าหมาย (ตำแหน่ง)
เป้าหมายของกล้องคือตำแหน่งของจุดกึ่งกลางของแผนที่ ซึ่งระบุเป็นพิกัดละติจูดและลองจิจูด
ละติจูดสามารถอยู่ระหว่าง -85 ถึง 85 องศา รวมถึงค่าขอบเขต ค่าที่สูงกว่าหรือต่ำกว่าช่วงนี้จะถูกจำกัดให้อยู่ในค่าที่ใกล้ที่สุดภายในช่วงนี้ เช่น การระบุละติจูดเป็น 100 จะตั้งค่าเป็น 85 ลองจิจูดอยู่ระหว่าง -180 ถึง 180 องศา รวมถึงค่าขอบเขต ค่าที่สูงกว่าหรือต่ำกว่าช่วงนี้จะถูกปรับให้พอดีกับช่วง (-180, 180) เช่น 480, 840 และ 1200 จะถูกปรับให้พอดีกับ 120 องศาทิศทาง (การวางแนว)
ทิศทางของกล้องจะระบุทิศทางเข็มทิศ ซึ่งวัดเป็นองศาจากทิศเหนือจริง และสอดคล้องกับขอบด้านบนของแผนที่ หากคุณวาดเส้นแนวตั้งจากจุดกึ่งกลางของแผนที่ไปยังขอบด้านบนของแผนที่ ทิศทางจะสอดคล้องกับการวางแนวของกล้อง (วัดเป็นองศา) เทียบกับทิศเหนือจริง
ทิศทาง 0 หมายความว่าด้านบนของแผนที่ชี้ไปทางทิศเหนือจริง ค่าทิศทาง 90 หมายความว่าด้านบนของแผนที่ชี้ไปทางทิศตะวันออก (90 องศาบนเข็มทิศ) ค่า 180 หมายความว่าด้านบนของแผนที่ชี้ไปทางทิศใต้
Maps API ช่วยให้คุณเปลี่ยนทิศทางของแผนที่ได้ ตัวอย่างเช่น ผู้ที่ขับรถมักจะหมุนแผนที่ถนนให้ตรงกับทิศทางการเดินทาง ในขณะที่นักเดินป่าที่ใช้แผนที่และเข็มทิศมักจะวางแนวแผนที่เพื่อให้เส้นแนวตั้งชี้ไปทางทิศเหนือ
การเอียง (มุมมอง)
การเอียงจะกำหนดตำแหน่งของกล้องบนส่วนโค้งเหนือตำแหน่งกึ่งกลางของแผนที่โดยตรง ซึ่งวัดเป็นองศาจาก จุดที่ต่ำที่สุด (ทิศทางที่ชี้ลงใต้กล้องโดยตรง) ค่า 0 สอดคล้องกับกล้องที่ชี้ลงมาโดยตรง ค่าที่มากกว่า 0 สอดคล้องกับกล้องที่เอียงไปทางขอบฟ้าตามจำนวนองศาที่ระบุ เมื่อคุณเปลี่ยนมุมมอง แผนที่จะปรากฏในมุมมองเปอร์สเปกทีฟ โดยฟีเจอร์ที่อยู่ไกลจะปรากฏเล็กลง และฟีเจอร์ที่อยู่ใกล้จะปรากฏใหญ่ขึ้น ภาพประกอบต่อไปนี้แสดงให้เห็นลักษณะดังกล่าว
ในรูปภาพด้านล่าง มุมมองคือ 0 องศา รูปภาพแรกแสดงแผนผังของลักษณะนี้ โดยตำแหน่ง 1 คือตำแหน่งกล้อง และตำแหน่ง 2 คือตำแหน่งแผนที่ปัจจุบัน แผนที่ที่ได้จะแสดงอยู่ด้านล่าง
|
|
ในรูปภาพด้านล่าง มุมมองคือ 45 องศา โปรดสังเกตว่ากล้องจะเคลื่อนที่ไปครึ่งทางตามส่วนโค้งระหว่างเหนือศีรษะโดยตรง (0 องศา) กับพื้น (90 องศา) ไปยังตำแหน่ง 3 กล้องยังคงชี้ไปที่จุดศูนย์กลางของแผนที่ แต่ตอนนี้พื้นที่ที่แสดงด้วยเส้นที่ตำแหน่ง 4 มองเห็นได้แล้ว
|
|
แผนที่ในภาพหน้าจอนี้ยังคงอยู่กึ่งกลางที่จุดเดียวกับในแผนที่เดิม แต่มีฟีเจอร์เพิ่มเติมปรากฏขึ้นที่ด้านบนของแผนที่ เมื่อคุณเพิ่มมุมให้เกิน 45 องศา ฟีเจอร์ระหว่างกล้องกับตำแหน่งแผนที่จะปรากฏใหญ่ขึ้นตามสัดส่วน ในขณะที่ฟีเจอร์ที่อยู่เลยตำแหน่งแผนที่จะปรากฏเล็กลงตามสัดส่วน ซึ่งจะทำให้เกิดเอฟเฟกต์สามมิติ
ซูม
ระดับการซูมของกล้องจะเป็นตัวกำหนดมาตราส่วนของแผนที่ ระดับการซูมที่สูงขึ้นจะแสดงรายละเอียดเพิ่มเติมบนหน้าจอ ในขณะที่ระดับการซูมที่ต่ำลงจะแสดงส่วนต่างๆ ของโลกมากขึ้นบนหน้าจอ
ระดับการซูมไม่จำเป็นต้องเป็นจำนวนเต็ม ช่วงระดับการซูมที่แผนที่อนุญาตจะขึ้นอยู่กับปัจจัยหลายอย่าง รวมถึงเป้าหมาย ประเภทแผนที่ และขนาดหน้าจอ ระบบจะแปลงตัวเลขที่อยู่นอกช่วงเป็นค่าที่ถูกต้องที่ใกล้เคียงที่สุด ซึ่งอาจเป็นระดับการซูมต่ำสุดหรือระดับการซูมสูงสุด รายการต่อไปนี้แสดงระดับความละเอียดโดยประมาณที่คุณคาดว่าจะเห็นในแต่ละระดับการซูม
- 1: โลก
- 5: ผืนดินขนาดใหญ่/ทวีป
- 10: เมือง
- 15: ถนน
- 20: สิ่งปลูกสร้าง
|
|
|
การซูมแบบเศษส่วน
แผนที่เวกเตอร์รองรับการซูมแบบเศษส่วน ซึ่งช่วยให้คุณซูมโดยใช้ค่าเศษส่วนแทนจำนวนเต็มได้ แม้ว่าทั้งแผนที่แรสเตอร์และเวกเตอร์จะรองรับการซูมแบบเศษส่วน แต่การซูมแบบเศษส่วนจะเปิดอยู่โดยค่าเริ่มต้นสำหรับแผนที่เวกเตอร์ และปิดอยู่โดยค่าเริ่มต้นสำหรับแผนที่แรสเตอร์ ใช้ตัวเลือกแผนที่ isFractionalZoomEnabled เพื่อเปิดและปิดการซูมแบบเศษส่วน
ตัวอย่างต่อไปนี้แสดงการเปิดใช้การซูมแบบเศษส่วนเมื่อเริ่มต้นแผนที่
map = new google.maps.Map(document.getElementById('map'), {
center: {lat: -34.397, lng: 150.644},
zoom: 8,
isFractionalZoomEnabled: true
});
นอกจากนี้ คุณยังเปิดและปิดการซูมแบบเศษส่วนได้โดยตั้งค่าตัวเลือกแผนที่ isFractionalZoomEnabled ดังที่แสดงไว้ที่นี่
// Using map.set
map.set('isFractionalZoomEnabled', true);
// Using map.setOptions
map.setOptions({isFractionalZoomEnabled: true});
คุณสามารถตั้งค่า Listener เพื่อตรวจหาว่ามีการเปิดใช้การซูมแบบเศษส่วนหรือไม่ ซึ่งจะมีประโยชน์มากที่สุดในกรณีที่คุณไม่ได้ตั้งค่า isFractionalZoomEnabled เป็น true หรือ false อย่างชัดเจน โค้ดตัวอย่างต่อไปนี้จะตรวจสอบว่ามีการเปิดใช้การซูมแบบเศษส่วนหรือไม่
map.addListener('isfractionalzoomenabled_changed', () => {
const isFractionalZoomEnabled = map.get('isFractionalZoomEnabled');
if (isFractionalZoomEnabled === false) {
console.log('not using fractional zoom');
} else if (isFractionalZoomEnabled === true) {
console.log('using fractional zoom');
} else {
console.log('map not done initializing yet');
}
});