ประเภทแผนที่

เลือกแพลตฟอร์ม แอนดรอยด์ iOS JavaScript

เอกสารนี้จะกล่าวถึงประเภทของแผนที่ที่คุณสามารถแสดงได้โดยใช้ 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;
ดูตัวอย่าง

ลองใช้ตัวอย่าง