เอกสารนี้จะกล่าวถึงประเภทของแผนที่ที่คุณสามารถแสดงได้โดยใช้
Maps JavaScript API API ใช้ MapType
เพื่อเก็บข้อมูลเกี่ยวกับแผนที่เหล่านี้ MapType
เป็นอินเทอร์เฟซที่กำหนดการแสดงผลและการใช้ชิ้นส่วนแผนที่และ
การแปลระบบพิกัดจากพิกัดของหน้าจอเป็นโลก
พิกัด (บนแผนที่) MapType
แต่ละรายการต้องมีองค์ประกอบ
ไม่กี่วิธีในการจัดการดึงข้อมูลและปล่อยชิ้นส่วน และคุณสมบัติ
ที่กำหนดลักษณะการทำงานของการแสดงภาพ
การทำงานภายในของแผนที่ประเภทต่างๆ ภายใน Maps JavaScript API เป็นหัวข้อขั้นสูง นักพัฒนาซอฟต์แวร์ส่วนใหญ่สามารถใช้ ประเภทแผนที่พื้นฐานที่ระบุไว้ด้านล่าง อย่างไรก็ตาม คุณยังสามารถแก้ไขงานนำเสนอของ ประเภทแผนที่ที่มีอยู่โดยใช้แผนที่ที่มีการจัดรูปแบบ หรือกำหนดชิ้นส่วนแผนที่ของคุณเองโดยใช้ประเภทแผนที่ที่กำหนดเอง เมื่อระบุประเภทแผนที่ที่กำหนดเอง คุณจะต้องเข้าใจวิธีแก้ไขแท็ก รีจิสทรีประเภทแผนที่
ประเภทแผนที่พื้นฐาน
แผนที่ใน Maps JavaScript API มี 4 ประเภท นอกเหนือจาก "สี" ที่ทุกคนคุ้นเคย ชิ้นส่วนแผนที่ถนน Maps JavaScript API ยังรองรับแผนที่ประเภทอื่นๆ ด้วย
แผนที่ประเภทต่อไปนี้มีอยู่ใน Maps JavaScript API
roadmap
แสดงมุมมองแผนที่ถนนเริ่มต้น ช่วงเวลานี้ เป็นประเภทแผนที่เริ่มต้นsatellite
แสดงดาวเทียม Google Earth รูปภาพhybrid
แสดงทั้งภาพปกติและดาวเทียม ครั้งterrain
แสดงแผนที่ทางกายภาพตามภูมิประเทศ
คุณแก้ไขประเภทแผนที่ที่ Map
ใช้อยู่ได้โดยตั้งค่า
พร็อพเพอร์ตี้ mapTypeId
ภายในตัวสร้างผ่านการตั้งค่า
Map options
ของออบเจ็กต์ หรือการเรียกฟังก์ชัน
setMapTypeId()
พร็อพเพอร์ตี้ mapTypeID
ค่าเริ่มต้นคือ roadmap
การตั้งค่า mapTypeId
ขณะสร้าง
var myLatlng = new google.maps.LatLng(-34.397, 150.644); var mapOptions = { zoom: 8, center: myLatlng, mapTypeId: 'satellite' }; var map = new google.maps.Map(document.getElementById('map'), mapOptions);
การแก้ไข mapTypeId
แบบไดนามิก
map.setMapTypeId('terrain');
โปรดทราบว่าคุณไม่ได้ตั้งค่าประเภทแผนที่โดยตรง
แต่ตั้งค่า mapTypeId
ให้อ้างอิง
MapType
โดยใช้ตัวระบุ
Maps JavaScript API ใช้รีจิสทรีประเภทแผนที่
ซึ่งอธิบายไว้ด้านล่าง เพื่อจัดการการอ้างอิงเหล่านี้
ภาพ 45°
Maps JavaScript API สนับสนุนภาพ 45° แบบพิเศษสำหรับ สถานที่บางแห่ง ภาพความละเอียดสูงนี้ มุมมองของทั้ง 2 ด้าน (เหนือ ใต้ ตะวันออก ตะวันตก) รูปภาพเหล่านี้มีอยู่ใน ระดับการซูมสำหรับประเภทแผนที่ที่สนับสนุน
รูปภาพต่อไปนี้แสดงมุมมอง 45° ของนครนิวยอร์ก
แผนที่ประเภท satellite
และ hybrid
รองรับ 45°
ภาพในระดับการซูมสูง (12 ขึ้นไป) หากมี หากผู้ใช้
ขยายไปยังตำแหน่งที่มีภาพดังกล่าว แผนที่ประเภทเหล่านี้
ปรับเปลี่ยนมุมมองของผู้ใช้ในลักษณะต่อไปนี้โดยอัตโนมัติ
- ภาพจากดาวเทียมหรือภาพแบบผสมจะแทนที่ด้วยภาพที่แสดงขนาด 45°
โดยเน้นที่ตำแหน่งปัจจุบัน โดยค่าเริ่มต้น มุมมองเหล่านี้
ให้มุ่งสู่ทิศเหนือ หากผู้ใช้ซูมออก ดาวเทียมเริ่มต้น หรือ
ภาพแบบผสมจะปรากฏขึ้นอีกครั้ง ลักษณะการทำงานจะแตกต่างกันไปตามระดับการซูม
และค่าของ
tilt
: - ระหว่างระดับการซูม 12 ถึง 18 แผนที่ฐานจากด้านบน (0°) จะแสดงตาม
ค่าเริ่มต้น เว้นแต่จะตั้งค่า
tilt
เป็น 45 - ที่ระดับการซูม 18 ขึ้นไป แผนที่ฐาน 45° จะแสดง ยกเว้น
ตั้งค่า
tilt
เป็น 0 - ตัวควบคุมการหมุนจะปรากฏขึ้น ตัวควบคุมการหมุนจะมีตัวเลือก
ที่ช่วยให้ผู้ใช้สลับการเอียงและหมุนมุมมองใน 90°
เพิ่มขึ้นในทิศทางใดทิศทางหนึ่ง หากต้องการซ่อนตัวควบคุมการหมุน ให้ตั้งค่า
rotateControl
ไปยังfalse
การซูมออกจากแผนที่ประเภทที่แสดงภาพ 45° จะเปลี่ยนกลับ การเปลี่ยนแปลงเหล่านี้แต่ละรายการ เป็นการสร้างแผนที่ประเภทเดิมขึ้นมาอีกครั้ง
การเปิดใช้งานและปิดใช้งานภาพ 45°
คุณสามารถปิดใช้งานภาพ 45° โดยโทรไปที่ setTilt(0)
ใน
Map
ออบเจ็กต์ หากต้องการเปิดภาพ 45° สำหรับประเภทแผนที่ที่สนับสนุน
โทรหา setTilt(45)
getTilt()
ของ Map
จะแสดง tilt
ปัจจุบันที่แสดงอยู่ใน
แผนที่ ถ้าคุณตั้งค่า tilt
บนแผนที่แล้วลบในภายหลัง
tilt
(เช่น การขยายแผนที่ออก) ของ
เมธอด getTilt()
จะส่งกลับ 0
สำคัญ: รองรับภาพ 45° เฉพาะบน แผนที่แรสเตอร์ ไม่สามารถใช้ภาพนี้กับแผนที่เวกเตอร์
ตัวอย่างต่อไปนี้แสดงมุมมอง 45° ของนครนิวยอร์ก
TypeScript
function initMap(): void { const map = new google.maps.Map( document.getElementById("map") as HTMLElement, { center: { lat: 40.76, lng: -73.983 }, zoom: 15, mapTypeId: "satellite", } ); map.setTilt(45); } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
function initMap() { const map = new google.maps.Map(document.getElementById("map"), { center: { lat: 40.76, lng: -73.983 }, zoom: 15, mapTypeId: "satellite", }); map.setTilt(45); } window.initMap = initMap;
ลองใช้ตัวอย่าง
กำลังหมุนภาพ 45°
ภาพ 45° ที่จริงแล้วประกอบด้วยคอลเล็กชันรูปภาพ
สำหรับแต่ละทิศหลัก (เหนือ ใต้ ตะวันออก ตะวันตก) เมื่อแผนที่ของคุณ
กำลังแสดงภาพ 45° คุณสามารถจัดแนว
ภาพไปยังหนึ่งในเส้นทางสำคัญ โดยการโทร
setHeading()
บนออบเจ็กต์ Map
ผ่าน
ค่าตัวเลขที่แสดงเป็นองศาจากทิศเหนือ
ตัวอย่างต่อไปนี้แสดงแผนที่ทางอากาศและหมุนอัตโนมัติ แผนที่ทุกๆ 3 วินาทีเมื่อมีการคลิกปุ่ม:
TypeScript
let map: google.maps.Map; function initMap(): void { map = new google.maps.Map(document.getElementById("map") as HTMLElement, { center: { lat: 40.76, lng: -73.983 }, zoom: 15, mapTypeId: "satellite", heading: 90, tilt: 45, }); // add listener to button document.getElementById("rotate")!.addEventListener("click", autoRotate); } function rotate90(): void { const heading = map.getHeading() || 0; map.setHeading(heading + 90); } function autoRotate(): void { // Determine if we're showing aerial imagery. if (map.getTilt() !== 0) { window.setInterval(rotate90, 3000); } } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
let map; function initMap() { map = new google.maps.Map(document.getElementById("map"), { center: { lat: 40.76, lng: -73.983 }, zoom: 15, mapTypeId: "satellite", heading: 90, tilt: 45, }); // add listener to button document.getElementById("rotate").addEventListener("click", autoRotate); } function rotate90() { const heading = map.getHeading() || 0; map.setHeading(heading + 90); } function autoRotate() { // Determine if we're showing aerial imagery. if (map.getTilt() !== 0) { window.setInterval(rotate90, 3000); } } window.initMap = initMap;
ลองใช้ตัวอย่าง
การแก้ไขรีจิสทรีประเภทแผนที่
mapTypeId
ของแผนที่เป็นตัวระบุสตริง
ที่ใช้เพื่อเชื่อมโยง MapType
กับ
ค่าที่ไม่ซ้ำ ออบเจ็กต์ Map
แต่ละรายการจะมี
MapTypeRegistry
ที่มีคอลเล็กชันของ
MapType
พร้อมใช้งานสำหรับแผนที่นั้น รีจิสทรีนี้
จะใช้เพื่อเลือกประเภทของแผนที่ที่สามารถดูได้
ตัวควบคุม MapType ของแผนที่ เป็นต้น
คุณไม่ได้อ่านจากรีจิสทรีประเภทแผนที่โดยตรง แต่
คุณแก้ไขรีจิสทรีโดยเพิ่มประเภทแผนที่ที่กำหนดเองและการเชื่อมโยง
ด้วยตัวระบุสตริงที่คุณเลือก คุณไม่สามารถแก้ไข
หรือปรับเปลี่ยนแผนที่พื้นฐาน (แต่คุณสามารถลบออกจาก
โดยการปรับเปลี่ยนลักษณะที่ปรากฏของ
mapTypeControlOptions
)
รหัสต่อไปนี้กำหนดให้แผนที่แสดงเฉพาะ
ประเภทแผนที่ 2 ประเภทใน mapTypeControlOptions
ของแผนที่
และแก้ไขรีจิสทรีเพื่อเพิ่มการเชื่อมโยงกับ
ตัวระบุนี้กับการใช้งานจริงของ
MapType
// Modify the control to only display two maptypes, the // default ROADMAP and the custom 'mymap'. // Note that because this is an association, we // don't need to modify the MapTypeRegistry beforehand. var MY_MAPTYPE_ID = 'mymaps'; var mapOptions = { zoom: 12, center: brooklyn, mapTypeControlOptions: { mapTypeIds: ['roadmap', MY_MAPTYPE_ID] }, mapTypeId: MY_MAPTYPE_ID }; // Create our map. This creation will implicitly create a // map type registry. map = new google.maps.Map(document.getElementById('map'), mapOptions); // Create your custom map type using your own code. // (See below.) var myMapType = new MyMapType(); // Set the registry to associate 'mymap' with the // custom map type we created, and set the map to // show that map type. map.mapTypes.set(MY_MAPTYPE_ID, myMapType);
แผนที่ที่มีการปรับลักษณะ
StyledMapType
ช่วยให้คุณสามารถปรับแต่งการนำเสนอ
แผนที่ฐานมาตรฐานของ Google การเปลี่ยนการแสดงผลภาพขององค์ประกอบดังกล่าว
เป็นถนน สวนสาธารณะ และพื้นที่ที่สร้างขึ้นเพื่อให้สอดคล้องกับสไตล์ที่ต่างจากเดิม
ที่ใช้ในประเภทแผนที่เริ่มต้น
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ StyledMapType
โปรดดูคู่มือเพื่อ
แผนที่ที่มีการจัดรูปแบบ
ประเภทแผนที่ที่กำหนดเอง
Maps JavaScript API รองรับการแสดงผล และการจัดการประเภทแผนที่ที่กำหนดเอง ซึ่งทำให้คุณสามารถ ภาพแผนที่หรือการวางซ้อนชิ้นส่วนแผนที่ของคุณเอง
มีการใช้งานแผนที่หลายประเภทที่เป็นไปได้ภายใน Maps JavaScript API:
- ชุดชิ้นส่วนมาตรฐานที่ประกอบด้วยรูปภาพที่
รวมกันเป็นแผนที่แผนที่ทั้งหมด การ์ดเหล่านี้
ชุดเรียกอีกอย่างว่าแผนที่ประเภทฐาน แผนที่ประเภทเหล่านี้
ดำเนินการและปฏิบัติหน้าที่เหมือนกับประเภทแผนที่เริ่มต้นที่มีอยู่
roadmap
satellite
hybrid
และterrain
คุณสามารถเพิ่ม ประเภทแผนที่ที่กำหนดเองกับอาร์เรย์mapTypes
ของแผนที่เพื่อ ช่วยให้ UI ภายใน Maps JavaScript API สามารถ ถือว่าประเภทแผนที่ที่กำหนดเองของคุณเป็นประเภทแผนที่มาตรฐาน (โดยนำไปรวมไว้ใน MapType เป็นต้น) - การวางซ้อนชิ้นส่วนรูปภาพซึ่งแสดงอยู่ด้านบน ประเภทแผนที่ฐานที่มีอยู่ โดยทั่วไป แผนที่ประเภทเหล่านี้ ที่ใช้ในการเสริมประเภทแผนที่ที่มีอยู่เพื่อแสดง และมักจะจำกัดไว้เฉพาะตำแหน่งที่เจาะจง และ/หรือระดับการซูม โปรดทราบว่าชิ้นส่วนเหล่านี้อาจโปร่งใส ซึ่งทำให้คุณสามารถเพิ่มจุดสนใจลงในแผนที่ที่มีอยู่
- ประเภทแผนที่ที่ไม่ใช่รูปภาพ ซึ่งให้คุณจัดการ การแสดงข้อมูลแผนที่ในระดับพื้นฐานที่สุด
ตัวเลือกแต่ละรายการเหล่านี้ขึ้นอยู่กับการสร้างชั้นเรียนที่
ใช้MapType
ของ Google นอกจากนี้
คลาส ImageMapType
จะมีฟังก์ชันในตัว
ลดความซับซ้อนในการสร้างประเภทแผนที่ภาพ
อินเทอร์เฟซของ MapType
ก่อนสร้างชั้นเรียนที่ใช้ MapType
คุณจึงต้องเข้าใจวิธีที่ Google Maps กำหนด
พิกัด และตัดสินใจว่าจะแสดงส่วนใดของแผนที่ สิ่งที่คุณต้องทำ
ใช้ตรรกะที่คล้ายกันสำหรับแผนที่ฐานหรือซ้อนทับทุกประเภท
อ่านคู่มือการทำแผนที่
และพิกัดแผนที่ย่อย
ประเภทแผนที่ที่กำหนดเองต้องใช้ MapType
ของ Google อินเทอร์เฟซนี้จะระบุพร็อพเพอร์ตี้บางอย่างและ
เมธอดที่อนุญาตให้ API เริ่มคำขอไปยังแผนที่ของคุณ
ประเภทเมื่อ API ระบุว่าจำเป็นต้องแสดงแผนที่
ภายในวิวพอร์ตและระดับการซูมปัจจุบัน คุณเป็นคนจัดการ
เพื่อตัดสินใจว่าจะโหลดการ์ดใด
หมายเหตุ: คุณสามารถสร้าง
คลาสของตัวเองเพื่อติดตั้งใช้งานอินเทอร์เฟซนี้ หรือหากคุณมี
ซึ่งคุณสามารถใช้
ImageMapType
คลาสที่นำไปใช้แล้ว
อินเทอร์เฟซนี้
ชั้นเรียนที่ใช้อินเทอร์เฟซ MapType
กําหนดและป้อนข้อมูลพร็อพเพอร์ตี้ต่อไปนี้
tileSize
(ต้องระบุ) ระบุขนาดของชิ้นส่วน (ของประเภทgoogle.maps.Size
) ขนาดต้องเป็นสี่เหลี่ยมผืนผ้า แต่ไม่จำเป็นต้องเป็นรูปสี่เหลี่ยมจัตุรัสmaxZoom
(ต้องระบุ) ระบุการซูมสูงสุด ระดับที่จะแสดงชิ้นส่วนแผนที่ประเภทนี้minZoom
(ไม่บังคับ) ระบุการซูมขั้นต่ำ ระดับที่จะแสดงชิ้นส่วนแผนที่ประเภทนี้ โดยค่าเริ่มต้น ค่านี้คือ0
ซึ่งบ่งบอกว่าไม่มีขั้นต่ำ ซึ่งมีระดับการซูมname
(ไม่บังคับ) ระบุชื่อของแผนที่นี้ ประเภท คุณสมบัตินี้จำเป็นเฉพาะเมื่อคุณต้องการแผนที่ประเภทนี้ เพื่อให้สามารถเลือกได้ภายในตัวควบคุม MapType (โปรดดู กำลังเพิ่มตัวควบคุมMapType
ที่ด้านล่าง)alt
(ไม่บังคับ) ระบุข้อความสำรองสำหรับกรณีนี้ ประเภทแผนที่ซึ่งแสดงเป็นข้อความที่แสดงเมื่อเลื่อนเมาส์ผ่าน พร็อพเพอร์ตี้นี้เป็นรายการที่จำเป็นเท่านั้น ถ้าคุณต้องการให้ระบบเลือกประเภทแผนที่นี้ภายในตัวควบคุม MapType ได้ (โปรดดูการเพิ่มตัวควบคุมMapType
below.)
นอกจากนี้ ชั้นเรียนที่ใช้อินเทอร์เฟซ MapType
ต้องใช้วิธีการต่อไปนี้
-
ระบบจะเรียกใช้
getTile()
(ต้องระบุ) เมื่อใดก็ตามที่ API แผนที่จำเป็นต้องแสดงชิ้นส่วนใหม่สำหรับ วิวพอร์ต เมธอดgetTile()
ต้องมีสิ่งต่อไปนี้ ลายเซ็น:getTile(tileCoord:Point,zoom:number,ownerDocument:Document):Node
API จะระบุว่าต้องเรียกใช้
getTile()
หรือไม่ อิงตามtileSize
ของMapType
minZoom
และmaxZoom
พร็อพเพอร์ตี้ และวิวพอร์ตและระดับการซูมปัจจุบันของแผนที่ ตัวจัดการ สำหรับเมธอดนี้ควรแสดงผลเอลิเมนต์ HTML ที่ระบุพิกัดที่ส่งผ่าน ระดับการซูม และองค์ประกอบ DOM ที่จะผนวกรูปภาพชิ้นส่วน -
ระบบจะเรียก
releaseTile()
(ไม่บังคับ) ทุกครั้งที่ API ระบุว่าแผนที่จำเป็นต้องนำชิ้นส่วนออกเมื่อหลุดออกจากมุมมอง เมธอดนี้ต้องมีลายเซ็นต่อไปนี้releaseTile(tile:Node)
โดยทั่วไปคุณควรจัดการการนำองค์ประกอบใดก็ตามออก ซึ่งแนบไปกับชิ้นส่วนแผนที่นอกเหนือจากแผนที่ ตัวอย่างเช่น หากคุณแนบ Listener เหตุการณ์กับไทล์แผนที่ คุณควรนำโฆษณาซ้อนทับเหล่านั้นออกที่นี่
เมธอด getTile()
จะทําหน้าที่เป็นตัวควบคุมหลักสำหรับ
กำหนดว่าจะโหลดไทล์ใดภายในวิวพอร์ตที่กำหนด
ประเภทแผนที่ฐาน
ประเภทแผนที่ที่คุณสร้างในลักษณะนี้อาจมีลักษณะเป็น
เพียงอย่างเดียวหรือรวมกับแผนที่ประเภทอื่นๆ เป็นการวางซ้อน สแตนด์อโลน
ประเภทแผนที่เรียกว่าประเภทแผนที่ฐาน คุณอาจต้องใช้ API
จะปฏิบัติต่อ MapType
ที่กำหนดเองเช่นเดียวกันกับ URL อื่นๆ ที่มีอยู่
ประเภทแผนที่ฐาน (ROADMAP
, TERRAIN
ฯลฯ) สิ่งต้องทำ
ดังนั้น ให้เพิ่ม MapType
ที่กำหนดเองของคุณในฟิลด์ Map
พร็อพเพอร์ตี้ mapTypes
พร็อพเพอร์ตี้นี้เป็นประเภท
MapTypeRegistry
โค้ดต่อไปนี้สร้าง MapType
ฐานเพื่อแสดง
พิกัดของชิ้นส่วนแผนที่ และวาดโครงร่างของชิ้นส่วนแผนที่ ดังนี้
TypeScript
/* * This demo demonstrates how to replace default map tiles with custom imagery. * In this case, the CoordMapType displays gray tiles annotated with the tile * coordinates. * * Try panning and zooming the map to see how the coordinates change. */ class CoordMapType { tileSize: google.maps.Size; maxZoom = 19; name = "Tile #s"; alt = "Tile Coordinate Map Type"; constructor(tileSize: google.maps.Size) { this.tileSize = tileSize; } getTile( coord: google.maps.Point, zoom: number, ownerDocument: Document ): HTMLElement { const div = ownerDocument.createElement("div"); div.innerHTML = String(coord); div.style.width = this.tileSize.width + "px"; div.style.height = this.tileSize.height + "px"; div.style.fontSize = "10"; div.style.borderStyle = "solid"; div.style.borderWidth = "1px"; div.style.borderColor = "#AAAAAA"; div.style.backgroundColor = "#E5E3DF"; return div; } releaseTile(tile: HTMLElement): void {} } function initMap(): void { const map = new google.maps.Map( document.getElementById("map") as HTMLElement, { zoom: 10, center: { lat: 41.85, lng: -87.65 }, streetViewControl: false, mapTypeId: "coordinate", mapTypeControlOptions: { mapTypeIds: ["coordinate", "roadmap"], style: google.maps.MapTypeControlStyle.DROPDOWN_MENU, }, } ); map.addListener("maptypeid_changed", () => { const showStreetViewControl = (map.getMapTypeId() as string) !== "coordinate"; map.setOptions({ streetViewControl: showStreetViewControl, }); }); // Now attach the coordinate map type to the map's registry. map.mapTypes.set( "coordinate", new CoordMapType(new google.maps.Size(256, 256)) ); } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
/* * This demo demonstrates how to replace default map tiles with custom imagery. * In this case, the CoordMapType displays gray tiles annotated with the tile * coordinates. * * Try panning and zooming the map to see how the coordinates change. */ class CoordMapType { tileSize; maxZoom = 19; name = "Tile #s"; alt = "Tile Coordinate Map Type"; constructor(tileSize) { this.tileSize = tileSize; } getTile(coord, zoom, ownerDocument) { const div = ownerDocument.createElement("div"); div.innerHTML = String(coord); div.style.width = this.tileSize.width + "px"; div.style.height = this.tileSize.height + "px"; div.style.fontSize = "10"; div.style.borderStyle = "solid"; div.style.borderWidth = "1px"; div.style.borderColor = "#AAAAAA"; div.style.backgroundColor = "#E5E3DF"; return div; } releaseTile(tile) {} } function initMap() { const map = new google.maps.Map(document.getElementById("map"), { zoom: 10, center: { lat: 41.85, lng: -87.65 }, streetViewControl: false, mapTypeId: "coordinate", mapTypeControlOptions: { mapTypeIds: ["coordinate", "roadmap"], style: google.maps.MapTypeControlStyle.DROPDOWN_MENU, }, }); map.addListener("maptypeid_changed", () => { const showStreetViewControl = map.getMapTypeId() !== "coordinate"; map.setOptions({ streetViewControl: showStreetViewControl, }); }); // Now attach the coordinate map type to the map's registry. map.mapTypes.set( "coordinate", new CoordMapType(new google.maps.Size(256, 256)), ); } window.initMap = initMap;
ลองใช้ตัวอย่าง
ประเภทแผนที่ซ้อนทับ
แผนที่บางประเภทได้รับการออกแบบมาให้ทำงานที่ด้านบนของแผนที่ที่มีอยู่ ประเภทต่างๆ แผนที่ประเภทดังกล่าวอาจมีเลเยอร์โปร่งใสที่ระบุ จุดที่น่าสนใจ หรือแสดงข้อมูลเพิ่มเติมแก่ผู้ใช้
ในกรณีเหล่านี้ คุณไม่ต้องการให้ระบบถือว่าแผนที่เป็นเอนทิตีแยกต่างหาก แต่เป็นการวางซ้อน
ซึ่งคุณสามารถทำได้ด้วยการเพิ่มประเภทแผนที่ลงใน MapType
ที่มีอยู่โดยตรงโดยใช้
พร็อพเพอร์ตี้ overlayMapTypes
ของ Map
พร็อพเพอร์ตี้นี้ประกอบด้วย
MVCArray
ของ MapType
แผนที่ทุกประเภท
(ฐานและโฆษณาซ้อนทับ) จะแสดงผลภายในแท็ก
mapPane
ประเภทแผนที่วางซ้อนจะแสดงอยู่ด้านบนของแผนที่ฐาน
แนบอยู่ ตามลำดับที่ปรากฏใน
อาร์เรย์ Map.overlayMapTypes
(ซ้อนทับที่มีดัชนีสูงกว่า
จะแสดงหน้าการวางซ้อนที่มีค่าดัชนีต่ำกว่า)
ตัวอย่างต่อไปนี้เหมือนกับตัวอย่างก่อนหน้านี้
ยกเว้นเราได้สร้างการวางซ้อนของชิ้นส่วนแผนที่ MapType
ที่ด้านบนของแผนที่ประเภท ROADMAP
:
TypeScript
/* * This demo illustrates the coordinate system used to display map tiles in the * API. * * Tiles in Google Maps are numbered from the same origin as that for * pixels. For Google's implementation of the Mercator projection, the origin * tile is always at the northwest corner of the map, with x values increasing * from west to east and y values increasing from north to south. * * Try panning and zooming the map to see how the coordinates change. */ class CoordMapType implements google.maps.MapType { tileSize: google.maps.Size; alt: string|null = null; maxZoom: number = 17; minZoom: number = 0; name: string|null = null; projection: google.maps.Projection|null = null; radius: number = 6378137; constructor(tileSize: google.maps.Size) { this.tileSize = tileSize; } getTile( coord: google.maps.Point, zoom: number, ownerDocument: Document ): HTMLElement { const div = ownerDocument.createElement("div"); div.innerHTML = String(coord); div.style.width = this.tileSize.width + "px"; div.style.height = this.tileSize.height + "px"; div.style.fontSize = "10"; div.style.borderStyle = "solid"; div.style.borderWidth = "1px"; div.style.borderColor = "#AAAAAA"; return div; } releaseTile(tile: Element): void {} } function initMap(): void { const map = new google.maps.Map( document.getElementById("map") as HTMLElement, { zoom: 10, center: { lat: 41.85, lng: -87.65 }, } ); // Insert this overlay map type as the first overlay map type at // position 0. Note that all overlay map types appear on top of // their parent base map. const coordMapType = new CoordMapType(new google.maps.Size(256, 256)) map.overlayMapTypes.insertAt( 0, coordMapType ); } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
/* * This demo illustrates the coordinate system used to display map tiles in the * API. * * Tiles in Google Maps are numbered from the same origin as that for * pixels. For Google's implementation of the Mercator projection, the origin * tile is always at the northwest corner of the map, with x values increasing * from west to east and y values increasing from north to south. * * Try panning and zooming the map to see how the coordinates change. */ class CoordMapType { tileSize; alt = null; maxZoom = 17; minZoom = 0; name = null; projection = null; radius = 6378137; constructor(tileSize) { this.tileSize = tileSize; } getTile(coord, zoom, ownerDocument) { const div = ownerDocument.createElement("div"); div.innerHTML = String(coord); div.style.width = this.tileSize.width + "px"; div.style.height = this.tileSize.height + "px"; div.style.fontSize = "10"; div.style.borderStyle = "solid"; div.style.borderWidth = "1px"; div.style.borderColor = "#AAAAAA"; return div; } releaseTile(tile) {} } function initMap() { const map = new google.maps.Map(document.getElementById("map"), { zoom: 10, center: { lat: 41.85, lng: -87.65 }, }); // Insert this overlay map type as the first overlay map type at // position 0. Note that all overlay map types appear on top of // their parent base map. const coordMapType = new CoordMapType(new google.maps.Size(256, 256)); map.overlayMapTypes.insertAt(0, coordMapType); } window.initMap = initMap;
ลองใช้ตัวอย่าง
ประเภทการแมปภาพ
การใช้ MapType
เพื่อทำหน้าที่เป็นแผนที่ฐาน
เป็นงานที่ต้องใช้เวลาและต้องใช้แรงงานมาก API
มีคลาสพิเศษที่ใช้ MapType
ของประเภทแผนที่ที่พบมากที่สุด ได้แก่ ประเภทแผนที่ที่ประกอบด้วย
ของชิ้นส่วนที่สร้างขึ้นจากไฟล์ภาพเดียว
ชั้นเรียนนี้ ชั้นเรียน ImageMapType
สร้างขึ้นโดยใช้ ImageMapTypeOptions
ข้อกำหนดของออบเจ็กต์ที่ระบุสิ่งต่อไปนี้
พร็อพเพอร์ตี้:
tileSize
(ต้องระบุ) ระบุขนาดของชิ้นส่วน (ของประเภทgoogle.maps.Size
) ขนาดต้องเป็นสี่เหลี่ยมผืนผ้า แต่ไม่จำเป็นต้องเป็นรูปสี่เหลี่ยมจัตุรัสgetTileUrl
(ต้องระบุ) ระบุฟังก์ชัน มักถูกระบุเป็นฟังก์ชันลิเทอรัลฟังก์ชันในบรรทัด การเลือกไทล์รูปภาพที่เหมาะสมตามที่ให้ไว้ ในระดับพิกัดโลกและระดับการซูม
โค้ดต่อไปนี้จะใช้ ImageMapType
พื้นฐาน
โดยใช้การ์ดดวงจันทร์ของ Google ตัวอย่างนี้ใช้การปรับมาตรฐาน
เพื่อตรวจสอบว่าชิ้นส่วนวนซ้ำตามแกน x แต่ไม่แสดงตามแนวแกน x
แกน y ของแผนที่ของคุณ
TypeScript
function initMap(): void { const map = new google.maps.Map( document.getElementById("map") as HTMLElement, { center: { lat: 0, lng: 0 }, zoom: 1, streetViewControl: false, mapTypeControlOptions: { mapTypeIds: ["moon"], }, } ); const moonMapType = new google.maps.ImageMapType({ getTileUrl: function (coord, zoom): string { const normalizedCoord = getNormalizedCoord(coord, zoom); if (!normalizedCoord) { return ""; } const bound = Math.pow(2, zoom); return ( "https://mw1.google.com/mw-planetary/lunar/lunarmaps_v1/clem_bw" + "/" + zoom + "/" + normalizedCoord.x + "/" + (bound - normalizedCoord.y - 1) + ".jpg" ); }, tileSize: new google.maps.Size(256, 256), maxZoom: 9, minZoom: 0, // @ts-ignore TODO 'radius' does not exist in type 'ImageMapTypeOptions' radius: 1738000, name: "Moon", }); map.mapTypes.set("moon", moonMapType); map.setMapTypeId("moon"); } // Normalizes the coords that tiles repeat across the x axis (horizontally) // like the standard Google map tiles. function getNormalizedCoord(coord, zoom) { const y = coord.y; let x = coord.x; // tile range in one direction range is dependent on zoom level // 0 = 1 tile, 1 = 2 tiles, 2 = 4 tiles, 3 = 8 tiles, etc const tileRange = 1 << zoom; // don't repeat across y-axis (vertically) if (y < 0 || y >= tileRange) { return null; } // repeat across x-axis if (x < 0 || x >= tileRange) { x = ((x % tileRange) + tileRange) % tileRange; } return { x: x, y: y }; } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
function initMap() { const map = new google.maps.Map(document.getElementById("map"), { center: { lat: 0, lng: 0 }, zoom: 1, streetViewControl: false, mapTypeControlOptions: { mapTypeIds: ["moon"], }, }); const moonMapType = new google.maps.ImageMapType({ getTileUrl: function (coord, zoom) { const normalizedCoord = getNormalizedCoord(coord, zoom); if (!normalizedCoord) { return ""; } const bound = Math.pow(2, zoom); return ( "https://mw1.google.com/mw-planetary/lunar/lunarmaps_v1/clem_bw" + "/" + zoom + "/" + normalizedCoord.x + "/" + (bound - normalizedCoord.y - 1) + ".jpg" ); }, tileSize: new google.maps.Size(256, 256), maxZoom: 9, minZoom: 0, // @ts-ignore TODO 'radius' does not exist in type 'ImageMapTypeOptions' radius: 1738000, name: "Moon", }); map.mapTypes.set("moon", moonMapType); map.setMapTypeId("moon"); } // Normalizes the coords that tiles repeat across the x axis (horizontally) // like the standard Google map tiles. function getNormalizedCoord(coord, zoom) { const y = coord.y; let x = coord.x; // tile range in one direction range is dependent on zoom level // 0 = 1 tile, 1 = 2 tiles, 2 = 4 tiles, 3 = 8 tiles, etc const tileRange = 1 << zoom; // don't repeat across y-axis (vertically) if (y < 0 || y >= tileRange) { return null; } // repeat across x-axis if (x < 0 || x >= tileRange) { x = ((x % tileRange) + tileRange) % tileRange; } return { x: x, y: y }; } window.initMap = initMap;
ลองใช้ตัวอย่าง
การคาดการณ์
โลกเป็นทรงกลม 3 มิติ (โดยประมาณ) แผนที่จะเป็นพื้นผิวเรียบ 2 มิติ แผนที่ที่คุณเห็นภายใน เช่นเดียวกับแผนที่ธรรมดาๆ ของโลก JavaScript API คือ เส้นโครงของทรงกลมลงบนพื้นผิวราบเรียบ ใช้งานง่ายที่สุด การคาดการณ์อาจหมายถึงการแมป ค่าละติจูด/ลองจิจูดลงในพิกัดบนแผนที่ของเส้นโครง
การคาดการณ์ใน Maps JavaScript API ต้องใช้
อินเทอร์เฟซของ Projection
Projection
จะต้องไม่มีการแมปจากพิกัดเพียงพิกัดเดียว
ระบบหนึ่งไปยังอีกระบบหนึ่ง แต่เป็นการแมปแบบ 2 ทิศทาง กล่าวคือ คุณต้อง
กำหนดวิธีแปลจากพิกัดโลก (LatLng
วัตถุ)
ในชั้นเรียน Projection
โลก
พิกัด และในทางกลับกัน Google Maps ใช้
เส้นโครงเมอร์เคเตอร์เพื่อสร้างแผนที่
จากข้อมูลทางภูมิศาสตร์ และแปลงเหตุการณ์บนแผนที่เป็น
พิกัดทางภูมิศาสตร์ คุณสามารถดูการคาดการณ์นี้ได้โดย
กำลังโทรหา getProjection()
บนถนน Map
(หรือประเภทฐานมาตรฐาน MapType
ประเภทใดก็ได้) สำหรับการใช้งานส่วนใหญ่
Projection
มาตรฐานนี้ก็เพียงพอแล้ว แต่คุณก็อาจ
กำหนดและใช้การฉายภาพที่คุณกำหนดเอง
การใช้การคาดการณ์
เมื่อใช้งานการฉายภาพที่กำหนดเอง คุณจะต้องระบุ มีอยู่ 2-3 อย่าง ได้แก่
- สูตรที่ใช้จับคู่พิกัดละติจูดและลองจิจูดลงใน
เครื่องบินคาร์ทีเซียน และเครื่องบินคาร์ทีเซียน (อินเทอร์เฟซ
Projection
รองรับเฉพาะการแปลงเป็นพิกัดเชิงเส้นเท่านั้น) - ขนาดการ์ดฐาน ชิ้นส่วนทั้งหมดต้องเป็นรูปสี่เหลี่ยมผืนผ้า
- "ขนาดทั่วโลก" ของแผนที่โดยใช้การตั้งค่าชิ้นส่วนพื้นฐานที่ระดับการซูม 0 โปรดทราบว่าสำหรับแผนที่ที่ประกอบด้วย 1 ไทล์ที่การซูม 0 ซึ่งเป็นขนาดในโลก และไทล์ฐานมีขนาดเท่ากัน
ประสานการแปลงใน การคาดการณ์
เส้นโครงแต่ละเส้นแสดง 2 วิธีซึ่งจะแปลไปมาระหว่าง 2 ค่านี้ ระบบพิกัด ที่ช่วยให้คุณแปลงระหว่างข้อมูลทางภูมิศาสตร์กับ พิกัดโลก:
- เมธอด
Projection.fromLatLngToPoint()
จะแปลงLatLng
เป็นค่าพิกัดโลก วิธีการนี้ใช้ เพื่อวางตำแหน่งการวางซ้อนบนแผนที่ (และกำหนดตำแหน่งแผนที่) - เมธอด
Projection.fromPointToLatLng()
จะแปลง พิกัดโลกเป็นค่าLatLng
ช่วงเวลานี้ ใช้เพื่อแปลงเหตุการณ์ต่างๆ เช่น การคลิกที่เกิดขึ้นใน ลงในพิกัดทางภูมิศาสตร์
Google Maps จะถือว่าเส้นโครงเป็นเส้นตรง
โดยทั่วไป คุณอาจใช้การคาดการณ์สำหรับ 2 กรณี ได้แก่ เพื่อสร้าง แผนที่โลก หรือ สร้างแผนที่ของท้องถิ่น ในกรณีก่อนหน้านี้ คุณควรตรวจสอบว่าการฉายภาพเป็นเส้นตรงและปกติ ที่ลองจิจูดทั้งหมด เส้นโครงบางส่วน (โดยเฉพาะเส้นโครงรูปกรวย) อาจเป็น "ปกติในท้องถิ่น" (เช่น ชี้ขึ้นเหนือ) แต่เบี่ยงเบนจากทิศเหนือจริง ตัวอย่างเช่น ยิ่งแผนที่วางอยู่ในตำแหน่งที่สัมพันธ์กับ ลองจิจูดอ้างอิง คุณอาจใช้การฉายภาพดังกล่าวเฉพาะที่ แต่ ทราบว่าการคาดการณ์อาจไม่แน่นอนและมีการเปลี่ยนแปลง จะเห็นได้ชัดเจนยิ่งขึ้นว่า ลองจิจูดอ้างอิงที่คุณเบี่ยงเบน
การเลือกชิ้นส่วนแผนที่ในเส้นโครง
การคาดการณ์ไม่เพียงแต่มีประโยชน์ในการกำหนดตำแหน่งของ
สถานที่หรือการวางซ้อน แต่สำหรับการกำหนดตำแหน่งตัวชิ้นส่วนแผนที่เอง
Maps JavaScript API แสดงแผนที่ฐานโดยใช้ MapType
ซึ่งต้องประกาศทั้งพร็อพเพอร์ตี้ projection
สำหรับ
ระบุการฉายภาพของแผนที่และgetTile()
วิธีเรียกชิ้นส่วนแผนที่ตาม
ไทล์
พิกัด พิกัดแผนที่ย่อยมาจาก
ทั้งขนาดชิ้นส่วนพื้นฐาน (ซึ่งต้องเป็นสี่เหลี่ยมผืนผ้า) และ "โลก"
ขนาด" ของแผนที่ของคุณ ซึ่งก็คือขนาดพิกเซลของโลกบนแผนที่ของคุณ
ที่ระดับการซูม 0 (สำหรับแผนที่ที่ประกอบด้วย 1 ไทล์ที่การซูม 0, ชิ้นส่วน
และขนาดทั่วโลกนั้นเท่ากัน)
คุณกำหนดขนาดชิ้นส่วนฐานภายใน MapType
พร็อพเพอร์ตี้ tileSize
คุณนิยามขนาดของโลกโดยนัย
ภายใน fromLatLngToPoint()
ของการคาดการณ์
และ fromPointToLatLng()
เมธอด
เนื่องจากการเลือกรูปภาพขึ้นอยู่กับค่าที่ส่งผ่านเหล่านี้ จึงมีประโยชน์มาก
เพื่อตั้งชื่อรูปภาพที่สามารถเลือกแบบเป็นโปรแกรมได้
ค่าที่ส่งผ่าน เช่น
map_zoom_tileX_tileY.png
ตัวอย่างต่อไปนี้ระบุ ImageMapType
โดยใช้
การคาดการณ์ Gall-Peters:
TypeScript
// This example defines an image map type using the Gall-Peters // projection. // https://en.wikipedia.org/wiki/Gall%E2%80%93Peters_projection function initMap(): void { // Create a map. Use the Gall-Peters map type. const map = new google.maps.Map( document.getElementById("map") as HTMLElement, { zoom: 0, center: { lat: 0, lng: 0 }, mapTypeControl: false, } ); initGallPeters(); map.mapTypes.set("gallPeters", gallPetersMapType); map.setMapTypeId("gallPeters"); // Show the lat and lng under the mouse cursor. const coordsDiv = document.getElementById("coords") as HTMLElement; map.controls[google.maps.ControlPosition.TOP_CENTER].push(coordsDiv); map.addListener("mousemove", (event: google.maps.MapMouseEvent) => { coordsDiv.textContent = "lat: " + Math.round(event.latLng!.lat()) + ", " + "lng: " + Math.round(event.latLng!.lng()); }); // Add some markers to the map. map.data.setStyle((feature) => { return { title: feature.getProperty("name") as string, optimized: false, }; }); map.data.addGeoJson(cities); } let gallPetersMapType; function initGallPeters() { const GALL_PETERS_RANGE_X = 800; const GALL_PETERS_RANGE_Y = 512; // Fetch Gall-Peters tiles stored locally on our server. gallPetersMapType = new google.maps.ImageMapType({ getTileUrl: function (coord, zoom) { const scale = 1 << zoom; // Wrap tiles horizontally. const x = ((coord.x % scale) + scale) % scale; // Don't wrap tiles vertically. const y = coord.y; if (y < 0 || y >= scale) return ""; return ( "https://developers.google.com/maps/documentation/" + "javascript/examples/full/images/gall-peters_" + zoom + "_" + x + "_" + y + ".png" ); }, tileSize: new google.maps.Size(GALL_PETERS_RANGE_X, GALL_PETERS_RANGE_Y), minZoom: 0, maxZoom: 1, name: "Gall-Peters", }); // Describe the Gall-Peters projection used by these tiles. gallPetersMapType.projection = { fromLatLngToPoint: function (latLng) { const latRadians = (latLng.lat() * Math.PI) / 180; return new google.maps.Point( GALL_PETERS_RANGE_X * (0.5 + latLng.lng() / 360), GALL_PETERS_RANGE_Y * (0.5 - 0.5 * Math.sin(latRadians)) ); }, fromPointToLatLng: function (point, noWrap) { const x = point.x / GALL_PETERS_RANGE_X; const y = Math.max(0, Math.min(1, point.y / GALL_PETERS_RANGE_Y)); return new google.maps.LatLng( (Math.asin(1 - 2 * y) * 180) / Math.PI, -180 + 360 * x, noWrap ); }, }; } // GeoJSON, describing the locations and names of some cities. const cities = { type: "FeatureCollection", features: [ { type: "Feature", geometry: { type: "Point", coordinates: [-87.65, 41.85] }, properties: { name: "Chicago" }, }, { type: "Feature", geometry: { type: "Point", coordinates: [-149.9, 61.218] }, properties: { name: "Anchorage" }, }, { type: "Feature", geometry: { type: "Point", coordinates: [-99.127, 19.427] }, properties: { name: "Mexico City" }, }, { type: "Feature", geometry: { type: "Point", coordinates: [-0.126, 51.5] }, properties: { name: "London" }, }, { type: "Feature", geometry: { type: "Point", coordinates: [28.045, -26.201] }, properties: { name: "Johannesburg" }, }, { type: "Feature", geometry: { type: "Point", coordinates: [15.322, -4.325] }, properties: { name: "Kinshasa" }, }, { type: "Feature", geometry: { type: "Point", coordinates: [151.207, -33.867] }, properties: { name: "Sydney" }, }, { type: "Feature", geometry: { type: "Point", coordinates: [0, 0] }, properties: { name: "0°N 0°E" }, }, ], }; declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
// This example defines an image map type using the Gall-Peters // projection. // https://en.wikipedia.org/wiki/Gall%E2%80%93Peters_projection function initMap() { // Create a map. Use the Gall-Peters map type. const map = new google.maps.Map(document.getElementById("map"), { zoom: 0, center: { lat: 0, lng: 0 }, mapTypeControl: false, }); initGallPeters(); map.mapTypes.set("gallPeters", gallPetersMapType); map.setMapTypeId("gallPeters"); // Show the lat and lng under the mouse cursor. const coordsDiv = document.getElementById("coords"); map.controls[google.maps.ControlPosition.TOP_CENTER].push(coordsDiv); map.addListener("mousemove", (event) => { coordsDiv.textContent = "lat: " + Math.round(event.latLng.lat()) + ", " + "lng: " + Math.round(event.latLng.lng()); }); // Add some markers to the map. map.data.setStyle((feature) => { return { title: feature.getProperty("name"), optimized: false, }; }); map.data.addGeoJson(cities); } let gallPetersMapType; function initGallPeters() { const GALL_PETERS_RANGE_X = 800; const GALL_PETERS_RANGE_Y = 512; // Fetch Gall-Peters tiles stored locally on our server. gallPetersMapType = new google.maps.ImageMapType({ getTileUrl: function (coord, zoom) { const scale = 1 << zoom; // Wrap tiles horizontally. const x = ((coord.x % scale) + scale) % scale; // Don't wrap tiles vertically. const y = coord.y; if (y < 0 || y >= scale) return ""; return ( "https://developers.google.com/maps/documentation/" + "javascript/examples/full/images/gall-peters_" + zoom + "_" + x + "_" + y + ".png" ); }, tileSize: new google.maps.Size(GALL_PETERS_RANGE_X, GALL_PETERS_RANGE_Y), minZoom: 0, maxZoom: 1, name: "Gall-Peters", }); // Describe the Gall-Peters projection used by these tiles. gallPetersMapType.projection = { fromLatLngToPoint: function (latLng) { const latRadians = (latLng.lat() * Math.PI) / 180; return new google.maps.Point( GALL_PETERS_RANGE_X * (0.5 + latLng.lng() / 360), GALL_PETERS_RANGE_Y * (0.5 - 0.5 * Math.sin(latRadians)), ); }, fromPointToLatLng: function (point, noWrap) { const x = point.x / GALL_PETERS_RANGE_X; const y = Math.max(0, Math.min(1, point.y / GALL_PETERS_RANGE_Y)); return new google.maps.LatLng( (Math.asin(1 - 2 * y) * 180) / Math.PI, -180 + 360 * x, noWrap, ); }, }; } // GeoJSON, describing the locations and names of some cities. const cities = { type: "FeatureCollection", features: [ { type: "Feature", geometry: { type: "Point", coordinates: [-87.65, 41.85] }, properties: { name: "Chicago" }, }, { type: "Feature", geometry: { type: "Point", coordinates: [-149.9, 61.218] }, properties: { name: "Anchorage" }, }, { type: "Feature", geometry: { type: "Point", coordinates: [-99.127, 19.427] }, properties: { name: "Mexico City" }, }, { type: "Feature", geometry: { type: "Point", coordinates: [-0.126, 51.5] }, properties: { name: "London" }, }, { type: "Feature", geometry: { type: "Point", coordinates: [28.045, -26.201] }, properties: { name: "Johannesburg" }, }, { type: "Feature", geometry: { type: "Point", coordinates: [15.322, -4.325] }, properties: { name: "Kinshasa" }, }, { type: "Feature", geometry: { type: "Point", coordinates: [151.207, -33.867] }, properties: { name: "Sydney" }, }, { type: "Feature", geometry: { type: "Point", coordinates: [0, 0] }, properties: { name: "0°N 0°E" }, }, ], }; window.initMap = initMap;