การควบคุม

เลือกแพลตฟอร์ม Android iOS JavaScript

ภาพรวมการควบคุม

แผนที่ที่แสดงผ่าน Maps JavaScript API มี UI เพื่อให้ผู้ใช้โต้ตอบกับแผนที่ได้ องค์ประกอบเหล่านี้เรียกว่า ควบคุม และรวมรูปแบบต่างๆ ของการควบคุมเหล่านี้ไว้ใน แอปพลิเคชัน หรือไม่ดำเนินการใดๆ และปล่อยให้ Maps JavaScript API จะจัดการพฤติกรรมการควบคุมทั้งหมด

แผนที่ต่อไปนี้แสดงชุดการควบคุมเริ่มต้นที่ปรากฏโดย Maps JavaScript API:

ด้านล่างนี้เป็นรายการการควบคุมทั้งหมดที่คุณสามารถใช้ในแผนที่ได้

  • การควบคุมการซูมจะแสดง "+" และ "-" ปุ่ม สำหรับการเปลี่ยนระดับการซูมของแผนที่ การควบคุมนี้จะปรากฏโดยค่าเริ่มต้นใน ที่มุมขวาล่างของแผนที่
  • การควบคุมประเภทแผนที่มีอยู่ในเมนูแบบเลื่อนลง หรือรูปแบบแถบปุ่มแนวนอน ซึ่งช่วยให้ผู้ใช้เลือกประเภทแผนที่ (ROADMAP, SATELLITE, HYBRID หรือ TERRAIN) การควบคุมนี้จะปรากฏที่ด้านซ้ายบนโดยค่าเริ่มต้น มุมของแผนที่
  • การควบคุม Street View มีไอคอนเพ็กแมน ซึ่งสามารถลากไปไว้บนแผนที่เพื่อเปิดใช้ Street View ได้ การควบคุมนี้ จะปรากฏขึ้นโดยค่าเริ่มต้นบริเวณด้านขวาล่างของแผนที่
  • การควบคุมการหมุนมีชุดค่าผสมของ ตัวเลือกการเอียงและหมุนสำหรับแผนที่ที่มีภาพเอียง ช่วงเวลานี้ การควบคุมจะปรากฏขึ้นโดยค่าเริ่มต้นบริเวณด้านล่างขวาของแผนที่ โปรดดู 45° ภาพเพื่อดูข้อมูลเพิ่มเติม
  • การควบคุมมาตราส่วนจะแสดงองค์ประกอบมาตราส่วนแผนที่ การควบคุมนี้จะปิดใช้โดยค่าเริ่มต้น
  • การควบคุมแบบเต็มหน้าจอจะมีตัวเลือกในการเปิด แผนที่ในโหมดเต็มหน้าจอ การควบคุมนี้เปิดใช้อยู่โดยค่าเริ่มต้นบนเดสก์ท็อปและ อุปกรณ์เคลื่อนที่ หมายเหตุ: iOS ไม่รองรับฟีเจอร์แบบเต็มหน้าจอ ดังนั้น การควบคุมแบบเต็มหน้าจอจะเป็น ไม่ปรากฏในอุปกรณ์ iOS
  • การควบคุมแป้นพิมพ์ลัดจะแสดงรายการ แป้นพิมพ์ลัดสำหรับโต้ตอบกับแผนที่

คุณจะไม่เข้าถึงหรือแก้ไขการควบคุมแผนที่เหล่านี้โดยตรง แต่คุณ แก้ไขฟิลด์ MapOptions ของแผนที่ซึ่งจะมีผลต่อการมองเห็น และการนำเสนอการควบคุม คุณสามารถปรับการแสดงตัวควบคุมเมื่อ เริ่มต้นแผนที่ของคุณ (ด้วย MapOptions ที่เหมาะสม) หรือแก้ไข แผนที่แบบไดนามิกด้วยการเรียก setOptions() เพื่อเปลี่ยนแปลง ตัวเลือก

ตัวควบคุมเหล่านี้บางรายการไม่ได้เปิดใช้โดยค่าเริ่มต้น ดูข้อมูลเกี่ยวกับ UI เริ่มต้น พฤติกรรม (และวิธีแก้ไขลักษณะการทำงานดังกล่าว) โปรดดูที่ UI เริ่มต้นด้านล่าง

UI เริ่มต้น

โดยค่าเริ่มต้น ตัวควบคุมทั้งหมดจะหายไปหากแผนที่มีขนาดเล็กเกินไป (200x200 พิกเซล) คุณสามารถลบล้างลักษณะการทำงานนี้ได้โดยตั้งค่าตัวควบคุมเป็น มองเห็นได้ ดูการเพิ่มการควบคุมไปยัง แผนที่

ลักษณะการทำงานและรูปลักษณ์ของการควบคุมจะเหมือนกันทั้งในอุปกรณ์เคลื่อนที่และ อุปกรณ์เดสก์ท็อป ยกเว้นการควบคุมแบบเต็มหน้าจอ (ดูลักษณะการทำงาน ตามที่อธิบายไว้ในรายการควบคุม)

นอกจากนี้ การจัดการแป้นพิมพ์จะเปิดโดยค่าเริ่มต้นในทุกอุปกรณ์

การปิดใช้ UI เริ่มต้น

คุณอาจต้องการปิดปุ่ม UI เริ่มต้นของ API อย่างสิ้นเชิง โดยดำเนินการดังนี้ กำหนดพร็อพเพอร์ตี้ disableDefaultUI ของแผนที่ (ภายใน MapOptions ของออบเจ็กต์) ไปยัง true พร็อพเพอร์ตี้นี้ ปิดใช้ปุ่มควบคุม UI จาก Maps JavaScript API ทั้งนี้ อย่างไรก็ตาม ไม่ส่งผลต่อท่าทางสัมผัสของเมาส์หรือแป้นพิมพ์ลัดที่อยู่บริเวณฐาน แผนที่ ซึ่งควบคุมโดย gestureHandling และ keyboardShortcuts พร็อพเพอร์ตี้ตามลำดับ

โค้ดต่อไปนี้ปิดใช้งานปุ่ม UI:

TypeScript

function initMap(): void {
  const map = new google.maps.Map(
    document.getElementById("map") as HTMLElement,
    {
      zoom: 4,
      center: { lat: -33, lng: 151 },
      disableDefaultUI: true,
    }
  );
}

declare global {
  interface Window {
    initMap: () => void;
  }
}
window.initMap = initMap;

JavaScript

function initMap() {
  const map = new google.maps.Map(document.getElementById("map"), {
    zoom: 4,
    center: { lat: -33, lng: 151 },
    disableDefaultUI: true,
  });
}

window.initMap = initMap;
ดูตัวอย่าง

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

การเพิ่มตัวควบคุมลงในแผนที่

คุณอาจต้องการปรับแต่งอินเทอร์เฟซโดยการลบ เพิ่ม หรือแก้ไข UI การทำงานหรือการควบคุม และตรวจสอบว่าการอัปเดตในอนาคตจะไม่แก้ไข พฤติกรรมของคุณ หากคุณต้องการแค่เพิ่มหรือแก้ไขลักษณะการทำงานที่มีอยู่ คุณต้อง ตรวจสอบว่ามีการเพิ่มการควบคุมในแอปพลิเคชันอย่างชัดเจน

ตัวควบคุมบางอย่างจะปรากฏบนแผนที่โดยค่าเริ่มต้น ขณะที่บางอย่างจะไม่ปรากฏ เว้นแต่คุณจะร้องขออย่างเจาะจง การเพิ่มหรือนําการควบคุมออกจาก มีการระบุการแมปไว้ในออบเจ็กต์ MapOptions ต่อไปนี้ ซึ่งคุณตั้งค่าเป็น true เพื่อให้แสดงหรือตั้งค่าเป็น false เพื่อซ่อน

{
  zoomControl: boolean,
  mapTypeControl: boolean,
  scaleControl: boolean,
  streetViewControl: boolean,
  rotateControl: boolean,
  fullscreenControl: boolean
}

โดยค่าเริ่มต้น ตัวควบคุมทั้งหมดจะหายไปหากแผนที่มีขนาดเล็กกว่า 200x200 พิกเซล คุณสามารถลบล้างลักษณะการทำงานนี้ได้โดยตั้งค่าตัวควบคุมเป็น มองเห็นได้ ตัวอย่างเช่น ตารางต่อไปนี้จะแสดงให้เห็นว่าตัวควบคุมการซูม มองเห็นได้หรือไม่ ตามขนาดของแผนที่และการตั้งค่าของ ช่อง zoomControl:

ขนาดของแผนที่ zoomControl มองเห็นได้ไหม
ตามแต่ละประเทศ false ไม่ได้
ตามแต่ละประเทศ true ใช่
>= 200x200 พิกเซล undefined ใช่
< 200x200 พิกเซล undefined ไม่ได้

ตัวอย่างต่อไปนี้กำหนดให้แผนที่ซ่อนการซูม และแสดงการควบคุมการปรับขนาด โปรดทราบว่าเราจะไม่ ปิดใช้ UI เริ่มต้น ดังนั้นการแก้ไขเหล่านี้จะเป็นส่วนเพิ่มเติมให้กับ UI เริ่มต้น พฤติกรรมของคุณ

TypeScript

function initMap(): void {
  const map = new google.maps.Map(
    document.getElementById("map") as HTMLElement,
    {
      zoom: 4,
      center: { lat: -33, lng: 151 },
      zoomControl: false,
      scaleControl: true,
    }
  );
}

declare global {
  interface Window {
    initMap: () => void;
  }
}
window.initMap = initMap;

JavaScript

function initMap() {
  const map = new google.maps.Map(document.getElementById("map"), {
    zoom: 4,
    center: { lat: -33, lng: 151 },
    zoomControl: false,
    scaleControl: true,
  });
}

window.initMap = initMap;
ดูตัวอย่าง

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

ตัวเลือกการควบคุม

การควบคุมจำนวนมากสามารถกำหนดค่าได้ ซึ่งช่วยให้คุณเปลี่ยนลักษณะการทำงานหรือ เปลี่ยนลักษณะที่ปรากฏ ตัวควบคุมประเภทแผนที่สำหรับ ตัวอย่างเช่น อาจปรากฏเป็นแถบแนวนอนหรือเมนูแบบเลื่อนลง

การควบคุมเหล่านี้มีการแก้ไขโดยการเปลี่ยนตัวเลือกการควบคุมที่เหมาะสม ภายในออบเจ็กต์ MapOptions ขณะสร้างแผนที่

ตัวอย่างเช่น ตัวเลือกสำหรับแก้ไขการควบคุมประเภทแผนที่จะระบุไว้ใน mapTypeControlOptions ตัวควบคุมประเภทแผนที่อาจปรากฏใน ตัวเลือกใดตัวเลือกหนึ่งจาก style รายการต่อไปนี้:

  • google.maps.MapTypeControlStyle.HORIZONTAL_BAR แสดง อาร์เรย์ของการควบคุมในรูปแบบปุ่มในแถบแนวนอนตามที่แสดงใน Google Maps
  • google.maps.MapTypeControlStyle.DROPDOWN_MENU แสดง การควบคุมด้วยปุ่มเดียวซึ่งช่วยให้คุณเลือกประเภทแผนที่ผ่านเมนูแบบเลื่อนลงได้ เมนู
  • google.maps.MapTypeControlStyle.DEFAULT แสดง การทำงานตามค่าเริ่มต้น ขึ้นอยู่กับขนาดหน้าจอและอาจมีการเปลี่ยนแปลงในอนาคต เวอร์ชันต่างๆ ของ API

โปรดทราบว่าถ้าคุณแก้ไขตัวเลือกการควบคุม คุณควรเปิดใช้ ควบคุมด้วยโดยตั้งค่า MapOptions ที่เหมาะสม ไปยัง true ตัวอย่างเช่น ในการตั้งค่าตัวควบคุมประเภทแผนที่ เพื่อแสดงรูปแบบ DROPDOWN_MENU ให้ใช้โค้ดต่อไปนี้ภายใน ออบเจ็กต์ MapOptions:

  ...
  mapTypeControl: true,
  mapTypeControlOptions: {
    style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
  }
  ...

ตัวอย่างต่อไปนี้แสดงวิธีเปลี่ยนตำแหน่งเริ่มต้นและ ของการควบคุม

TypeScript

// You can set control options to change the default position or style of many
// of the map controls.

function initMap(): void {
  const map = new google.maps.Map(
    document.getElementById("map") as HTMLElement,
    {
      zoom: 4,
      center: { lat: -33, lng: 151 },
      mapTypeControl: true,
      mapTypeControlOptions: {
        style: google.maps.MapTypeControlStyle.DROPDOWN_MENU,
        mapTypeIds: ["roadmap", "terrain"],
      },
    }
  );
}

declare global {
  interface Window {
    initMap: () => void;
  }
}
window.initMap = initMap;

JavaScript

// You can set control options to change the default position or style of many
// of the map controls.
function initMap() {
  const map = new google.maps.Map(document.getElementById("map"), {
    zoom: 4,
    center: { lat: -33, lng: 151 },
    mapTypeControl: true,
    mapTypeControlOptions: {
      style: google.maps.MapTypeControlStyle.DROPDOWN_MENU,
      mapTypeIds: ["roadmap", "terrain"],
    },
  });
}

window.initMap = initMap;
ดูตัวอย่าง

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

โดยปกติ การควบคุมจะถูกกำหนดค่าเมื่อมีการสร้างแผนที่ อย่างไรก็ตาม คุณสามารถแก้ไขการแสดงตัวควบคุมแบบไดนามิกได้โดย เรียกใช้เมธอด setOptions() ของ Map การส่งต่อตัวเลือกการควบคุมใหม่ๆ

การแก้ไขตัวควบคุม

คุณสามารถระบุการนำเสนอของการควบคุมเมื่อคุณสร้างแผนที่ของคุณ ผ่านช่องต่างๆ ภายในออบเจ็กต์ MapOptions ของแผนที่ เหล่านี้ ฟิลด์จะแสดงอยู่ด้านล่าง:

  • zoomControl เปิด/ปิดใช้ตัวควบคุมการซูม โดยค่าเริ่มต้น การควบคุมนี้จะปรากฏและปรากฏบริเวณด้านล่างขวาของแผนที่ นอกจากนี้ ช่อง zoomControlOptions ยังระบุ ZoomControlOptions เพื่อใช้กับการควบคุมนี้
  • mapTypeControl เปิด/ปิดใช้การควบคุมประเภทแผนที่ ซึ่งช่วยให้ผู้ใช้สลับใช้แผนที่ประเภทต่างๆ (เช่น แผนที่และดาวเทียม) ซึ่งตัวควบคุมนี้จะปรากฏและปรากฏขึ้นที่ด้านซ้ายบนโดยค่าเริ่มต้น มุมของแผนที่ ช่อง mapTypeControlOptions ระบุ MapTypeControlOptions เพิ่มเติม ที่ใช้สำหรับการควบคุมนี้
  • streetViewControl เปิด/ปิดใช้การควบคุมเพ็กแมน ซึ่งช่วยให้ผู้ใช้เปิดใช้งานภาพพาโนรามาของ Street View ได้ โดยค่าเริ่มต้น การควบคุมนี้จะปรากฏและปรากฏบริเวณด้านขวาล่าง ของแผนที่ ช่อง streetViewControlOptions ระบุ StreetViewControlOptions เพิ่มเติม ที่ใช้สำหรับการควบคุมนี้
  • rotateControl เปิด/ปิดใช้ลักษณะที่ปรากฏของ การควบคุมการหมุนสำหรับการควบคุมการวางแนวของภาพ 45° โดย โดยค่าเริ่มต้น การมีตัวควบคุมจะขึ้นอยู่กับการปรากฏหรือการไม่มีอยู่ ภาพ 45° สำหรับประเภทแผนที่ที่ระบุเมื่อซูมปัจจุบันและ ตำแหน่งนั้น คุณสามารถเปลี่ยนลักษณะการทำงานของตัวควบคุมได้โดยการตั้งค่า rotateControlOptions เพื่อระบุ RotateControlOptionsที่จะใช้ คุณไม่สามารถทำการ การควบคุมจะปรากฏขึ้น หากไม่มีภาพ 45° ในขณะนี้
  • scaleControl จะเปิด/ปิดใช้การควบคุมการปรับขนาดที่ จะแสดงมาตราส่วนแผนที่แบบง่าย คุณจะไม่เห็นการควบคุมนี้โดยค่าเริ่มต้น วันและเวลา เปิดใช้งานอยู่ ซึ่งจะปรากฏอยู่ที่มุมขวาล่างของแผนที่เสมอ scaleControlOptions ระบุ ScaleControlOptions เพื่อใช้กับการควบคุมนี้
  • fullscreenControl จะเปิด/ปิดใช้ตัวควบคุมที่เปิด แผนที่ในโหมดเต็มหน้าจอ การควบคุมนี้เปิดใช้อยู่โดยค่าเริ่มต้น บนเดสก์ท็อปและอุปกรณ์ Android เมื่อเปิดใช้ ตัวควบคุมจะปรากฏบริเวณด้านขวาบนของแผนที่ fullscreenControlOptions ระบุ FullscreenControlOptions เพื่อใช้กับการควบคุมนี้

โปรดทราบว่าคุณจะระบุตัวเลือกสำหรับการควบคุมที่คุณปิดใช้ในตอนแรกได้

การควบคุมการจัดตำแหน่ง

ตัวเลือกการควบคุมส่วนใหญ่มีพร็อพเพอร์ตี้ position (ประเภท ControlPosition) ซึ่งระบุตำแหน่งบนแผนที่ไปยัง วางตัวควบคุม การวางตำแหน่งของตัวควบคุมเหล่านี้ไม่สมบูรณ์แบบ แต่ API จะจัดวางการควบคุมอย่างชาญฉลาดด้วยการเลื่อนไปรอบๆ องค์ประกอบแผนที่ที่มีอยู่ หรือการควบคุมอื่นๆ ภายในข้อจำกัดที่กำหนด (เช่น ขนาดแผนที่)

หมายเหตุ: ไม่มีการรับประกันใดๆ อาจไม่ทับซ้อนกันเมื่อใช้เลย์เอาต์ที่ซับซ้อน แม้ว่า API จะ เพื่อจัดระเบียบอย่างชาญฉลาด

ตำแหน่งการควบคุมที่รองรับมีดังนี้

  • TOP_CENTER บ่งชี้ว่าควรวางตัวควบคุม ที่ศูนย์กลางด้านบนของแผนที่
  • TOP_LEFT บ่งชี้ว่าควรวางตัวควบคุมไว้ ด้านซ้ายบนของแผนที่ พร้อมด้วยองค์ประกอบย่อยของตัวควบคุม "ต่อเนื่อง" ให้ไปยังตรงกลางด้านบน
  • TOP_RIGHT บ่งชี้ว่าควรวางตัวควบคุมไว้ ที่ด้านขวาบนของแผนที่พร้อมกับองค์ประกอบย่อยของการควบคุมแบบ "ต่อเนื่อง" ให้ไปตรงกลางด้านบน
  • LEFT_TOP บ่งชี้ว่าควรวางตัวควบคุมไว้ ด้านบนซ้ายของแผนที่ แต่อยู่ใต้องค์ประกอบ TOP_LEFT
  • RIGHT_TOP บ่งชี้ว่าควรวางตัวควบคุมไว้ ที่ด้านขวาบนของแผนที่ แต่ใต้ TOP_RIGHT จากองค์ประกอบเหล่านี้
  • LEFT_CENTER บ่งชี้ว่าควรวางตัวควบคุม ทางด้านซ้ายของแผนที่ ซึ่งอยู่ตรงกลางระหว่าง TOP_LEFT และ BOTTOM_LEFT ตำแหน่ง
  • RIGHT_CENTER บ่งชี้ว่าควรวางตัวควบคุม ทางด้านขวาของแผนที่ โดยให้อยู่ตรงกลางระหว่าง ตำแหน่งTOP_RIGHTและBOTTOM_RIGHT
  • LEFT_BOTTOM บ่งชี้ว่าควรวางตัวควบคุม ตามด้านล่างซ้ายของแผนที่ แต่อยู่เหนือ BOTTOM_LEFT จากองค์ประกอบเหล่านี้
  • RIGHT_BOTTOM บ่งชี้ว่าควรวางตัวควบคุม ตามด้านล่างขวาของแผนที่ แต่อยู่เหนือ BOTTOM_RIGHT จากองค์ประกอบเหล่านี้
  • BOTTOM_CENTER บ่งชี้ว่าควรวางตัวควบคุม ที่กึ่งกลางด้านล่างของแผนที่
  • BOTTOM_LEFT บ่งชี้ว่าควรวางตัวควบคุม ที่ด้านซ้ายล่างของแผนที่ พร้อมด้วยองค์ประกอบย่อยของตัวควบคุม "ลื่นไหล" ไปจนถึงตรงกลางด้านล่าง
  • BOTTOM_RIGHT บ่งชี้ว่าควรวางตัวควบคุม ที่ด้านขวาล่างของแผนที่ พร้อมด้วยองค์ประกอบย่อยของตัวควบคุม "ลื่นไหล" ไปจนถึงตรงกลางด้านล่าง

โปรดทราบว่าตำแหน่งเหล่านี้อาจสัมพันธ์กับตำแหน่งขององค์ประกอบ UI ซึ่งมีตำแหน่งที่คุณไม่สามารถแก้ไข (เช่น ลิขสิทธิ์และโลโก้ของ Google) ในกรณีเหล่านั้น การควบคุมจะดำเนินการตามตรรกะที่ระบุไว้สำหรับ แต่ละตำแหน่งและปรากฏใกล้กับตำแหน่งนั้นๆ มากที่สุด ตำแหน่ง

ตัวอย่างต่อไปนี้จะแสดงแผนที่แบบง่ายๆ ที่เปิดใช้งานการควบคุมทั้งหมดไว้ใน ได้หลายตำแหน่ง

TypeScript

function initMap(): void {
  const map = new google.maps.Map(
    document.getElementById("map") as HTMLElement,
    {
      zoom: 12,
      center: { lat: -28.643387, lng: 153.612224 },
      mapTypeControl: true,
      mapTypeControlOptions: {
        style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
        position: google.maps.ControlPosition.TOP_CENTER,
      },
      zoomControl: true,
      zoomControlOptions: {
        position: google.maps.ControlPosition.LEFT_CENTER,
      },
      scaleControl: true,
      streetViewControl: true,
      streetViewControlOptions: {
        position: google.maps.ControlPosition.LEFT_TOP,
      },
      fullscreenControl: true,
    }
  );
}

declare global {
  interface Window {
    initMap: () => void;
  }
}
window.initMap = initMap;

JavaScript

function initMap() {
  const map = new google.maps.Map(document.getElementById("map"), {
    zoom: 12,
    center: { lat: -28.643387, lng: 153.612224 },
    mapTypeControl: true,
    mapTypeControlOptions: {
      style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
      position: google.maps.ControlPosition.TOP_CENTER,
    },
    zoomControl: true,
    zoomControlOptions: {
      position: google.maps.ControlPosition.LEFT_CENTER,
    },
    scaleControl: true,
    streetViewControl: true,
    streetViewControlOptions: {
      position: google.maps.ControlPosition.LEFT_TOP,
    },
    fullscreenControl: true,
  });
}

window.initMap = initMap;
ดูตัวอย่าง

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

การควบคุมที่กำหนดเอง

นอกจากการแก้ไขรูปแบบและตำแหน่งของการควบคุม API ที่มีอยู่แล้ว คุณยัง สร้างตัวควบคุมของคุณเองเพื่อจัดการการโต้ตอบกับผู้ใช้ได้ ปุ่มควบคุม คือวิดเจ็ตที่อยู่นิ่งที่ลอยอยู่เหนือแผนที่ในตำแหน่งสัมบูรณ์ ตรงข้ามกับการวางซ้อนที่เลื่อนไปตามแผนที่ที่มีอยู่ เพิ่มเติม โดยพื้นฐานแล้ว ตัวควบคุมคือองค์ประกอบ <div> จะมีตำแหน่งสัมบูรณ์บนแผนที่ แสดง UI บางส่วนให้ผู้ใช้เห็น และ จัดการการโต้ตอบกับผู้ใช้หรือแผนที่ ซึ่งมักจะทำผ่านเหตุการณ์ เครื่องจัดการ

การสร้างการควบคุมที่กำหนดเองจำเป็นต้องใช้กฎ 2-3 ข้อ อย่างไรก็ตาม หลักเกณฑ์ต่อไปนี้ถือเป็นแนวทางปฏิบัติแนะนำ

  • กำหนด CSS ที่เหมาะสมสำหรับองค์ประกอบควบคุมที่จะแสดง
  • จัดการการโต้ตอบกับผู้ใช้หรือแผนที่ผ่านตัวแฮนเดิลเหตุการณ์ จับคู่การเปลี่ยนแปลงพร็อพเพอร์ตี้หรือเหตุการณ์ของผู้ใช้ (เช่น 'click' เหตุการณ์)
  • สร้างองค์ประกอบ <div> เพื่อเก็บการควบคุมและเพิ่ม องค์ประกอบนี้ลงในพร็อพเพอร์ตี้ controls ของ Map

ซึ่งกล่าวถึงข้อกังวลแต่ละข้อด้านล่างนี้

การวาดตัวควบคุมที่กำหนดเอง

การวาดการควบคุมนั้นขึ้นอยู่กับคุณ โดยทั่วไป เราขอแนะนำให้คุณ วางงานนำเสนอการควบคุมทั้งหมดของคุณไว้ใน <div> ให้คุณปรับแต่งการควบคุม หนึ่งหน่วย เราจะใช้รูปแบบการออกแบบนี้ในตัวอย่างที่แสดงด้านล่าง

การออกแบบการควบคุมที่น่าสนใจจำเป็นต้องมีความรู้บางอย่างเกี่ยวกับ CSS และ DOM ใหม่ โค้ดต่อไปนี้แสดงฟังก์ชันในการสร้างองค์ประกอบปุ่ม ที่เลื่อนแผนที่ให้เป็นจุดศูนย์กลางของชิคาโก

function createCenterControl(map) {
  const controlButton = document.createElement("button");

  // Set CSS for the control.
  controlButton.style.backgroundColor = "#fff";
  controlButton.style.border = "2px solid #fff";
  controlButton.style.borderRadius = "3px";
  controlButton.style.boxShadow = "0 2px 6px rgba(0,0,0,.3)";
  controlButton.style.color = "rgb(25,25,25)";
  controlButton.style.cursor = "pointer";
  controlButton.style.fontFamily = "Roboto,Arial,sans-serif";
  controlButton.style.fontSize = "16px";
  controlButton.style.lineHeight = "38px";
  controlButton.style.margin = "8px 0 22px";
  controlButton.style.padding = "0 5px";
  controlButton.style.textAlign = "center";

  controlButton.textContent = "Center Map";
  controlButton.title = "Click to recenter the map";
  controlButton.type = "button";

  // Setup the click event listeners: simply set the map to Chicago.
  controlButton.addEventListener("click", () => {
    map.setCenter(chicago);
  });

  return controlButton;
}

การจัดการเหตุการณ์จากการควบคุมที่กำหนดเอง

หากต้องการใช้ประโยชน์จากการควบคุม จะต้องดำเนินการบางอย่างจริงๆ สิ่งที่ควบคุม ขึ้นอยู่กับคุณ ตัวควบคุมอาจตอบสนองต่อข้อมูลจากผู้ใช้ หรืออาจตอบสนอง การเปลี่ยนแปลงในสถานะของ Map

สําหรับตอบกลับข้อมูลของผู้ใช้ ให้ใช้ addEventListener() ที่จัดการเหตุการณ์ DOM ที่รองรับ ข้อมูลโค้ดต่อไปนี้เพิ่ม Listener สำหรับ 'click' ของเบราว์เซอร์ กิจกรรม โปรดทราบว่าเหตุการณ์นี้มาจาก DOM ไม่ใช่จากแผนที่

// Setup the click event listener: set the map to center on Chicago
var chicago = {lat: 41.850, lng: -87.650};

controlButton.addEventListener('click', () => {
  map.setCenter(chicago);
});

การทำให้การควบคุมที่กำหนดเองสามารถเข้าถึงได้

วิธีตรวจสอบว่าตัวควบคุมได้รับเหตุการณ์เกี่ยวกับแป้นพิมพ์และปรากฏต่อโปรแกรมอ่านหน้าจออย่างถูกต้อง

  • ใช้องค์ประกอบ HTML ที่มีอยู่แต่เดิมสำหรับปุ่ม องค์ประกอบแบบฟอร์ม และป้ายกำกับ ใช้เฉพาะ DIV เป็นคอนเทนเนอร์สำหรับเก็บการควบคุมแบบเนทีฟ อย่าใช้ DIV ซ้ำเป็น UI แบบอินเทอร์แอกทีฟ
  • ใช้องค์ประกอบ label แอตทริบิวต์ title หรือ aria-label ตามที่เหมาะสม เพื่อระบุข้อมูลเกี่ยวกับองค์ประกอบ UI

การวางตำแหน่งการควบคุมที่กำหนดเอง

ระบบจะวางตำแหน่งตัวควบคุมที่กำหนดเองบนแผนที่โดยการวางไว้ในตำแหน่งที่เหมาะสม ตำแหน่งภายใน controls ของออบเจ็กต์ Map พร็อพเพอร์ตี้นี้มีอาร์เรย์ของ google.maps.ControlPosition วินาที คุณเพิ่มการควบคุมที่กำหนดเองลงใน โดยการเพิ่ม Node (โดยทั่วไปคือ <div>) เป็น ControlPosition ที่เหมาะสม (สำหรับข้อมูลเกี่ยวกับ โปรดดูควบคุมการจัดตำแหน่ง above.)

ControlPosition แต่ละรายการจัดเก็บ MVCArray ของ ที่แสดงในตำแหน่งนั้น ผลที่ได้คือเมื่อมีการเพิ่มตัวควบคุมหรือ นำออกจากตำแหน่งแล้ว API จะอัปเดตตัวควบคุมให้สอดคล้องกัน

API จะวางการควบคุมในแต่ละตำแหน่งตามลำดับของ พร็อพเพอร์ตี้ index ที่มีดัชนีต่ำกว่าจะได้รับตำแหน่งก่อน ตัวอย่างเช่น การควบคุมที่กำหนดเอง 2 รายการที่ตำแหน่ง BOTTOM_RIGHT จะ แสดงตามลำดับดัชนีนี้ โดยค่าดัชนีที่ต่ำกว่าจะใช้ ลำดับความสำคัญ โดยค่าเริ่มต้น การควบคุมที่กำหนดเองทั้งหมดจะแสดงหลังจากวาง การควบคุม API เริ่มต้นทั้งหมด คุณสามารถลบล้างลักษณะการทำงานนี้ได้โดยตั้งค่า พร็อพเพอร์ตี้ index ของตัวควบคุมเป็นค่าลบ การควบคุมที่กำหนดเอง ไม่สามารถวางด้านซ้ายของโลโก้หรือด้านขวาของ ลิขสิทธิ์

โค้ดต่อไปนี้จะสร้างการควบคุมที่กำหนดเองใหม่ (ตัวสร้างไม่ใช่ แสดง) แล้วเพิ่มลงในแผนที่ในตำแหน่งTOP_RIGHT

var map = new google.maps.Map(document.getElementById('map'), mapOptions);

// Create a DIV to attach the control UI to the Map.
const centerControlDiv = document.createElement("div");

// Create the control. This code calls a function that
// creates a new instance of a button control.
const centerControl = createCenterControl(map);

// Append the control to the DIV.
centerControlDiv.appendChild(centerControl);

// Add the control to the map at a designated control position
// by pushing it on the position's array. This code will
// implicitly add the control to the DOM, through the Map
// object. You should not attach the control manually.
map.controls[google.maps.ControlPosition.TOP_CENTER].push(centerControlDiv);

ตัวอย่างการควบคุมที่กำหนดเอง

การควบคุมต่อไปนี้ทำได้ง่าย (แต่อาจไม่มีประโยชน์มากนัก) และ รวมรูปแบบที่แสดงด้านบน การควบคุมนี้ตอบสนองต่อ DOM 'click' เหตุการณ์โดยตั้งศูนย์กลางของแผนที่ไว้ที่ค่าเริ่มต้นบางอย่าง ตำแหน่งที่ตั้ง:

TypeScript

let map: google.maps.Map;

const chicago = { lat: 41.85, lng: -87.65 };

/**
 * Creates a control that recenters the map on Chicago.
 */
 function createCenterControl(map) {
  const controlButton = document.createElement('button');

  // Set CSS for the control.
  controlButton.style.backgroundColor = '#fff';
  controlButton.style.border = '2px solid #fff';
  controlButton.style.borderRadius = '3px';
  controlButton.style.boxShadow = '0 2px 6px rgba(0,0,0,.3)';
  controlButton.style.color = 'rgb(25,25,25)';
  controlButton.style.cursor = 'pointer';
  controlButton.style.fontFamily = 'Roboto,Arial,sans-serif';
  controlButton.style.fontSize = '16px';
  controlButton.style.lineHeight = '38px';
  controlButton.style.margin = '8px 0 22px';
  controlButton.style.padding = '0 5px';
  controlButton.style.textAlign = 'center';

  controlButton.textContent = 'Center Map';
  controlButton.title = 'Click to recenter the map';
  controlButton.type = 'button';

  // Setup the click event listeners: simply set the map to Chicago.
  controlButton.addEventListener('click', () => {
    map.setCenter(chicago);
  });

  return controlButton;
}

function initMap() {
  map = new google.maps.Map(document.getElementById('map') as HTMLElement, {
    zoom: 12,
    center: chicago,
  });

  // Create the DIV to hold the control.
  const centerControlDiv = document.createElement('div');
  // Create the control.
  const centerControl = createCenterControl(map);
  // Append the control to the DIV.
  centerControlDiv.appendChild(centerControl);

  map.controls[google.maps.ControlPosition.TOP_CENTER].push(centerControlDiv);
}

declare global {
  interface Window {
    initMap: () => void;
  }
}
window.initMap = initMap;

JavaScript

let map;
const chicago = { lat: 41.85, lng: -87.65 };

/**
 * Creates a control that recenters the map on Chicago.
 */
function createCenterControl(map) {
  const controlButton = document.createElement("button");

  // Set CSS for the control.
  controlButton.style.backgroundColor = "#fff";
  controlButton.style.border = "2px solid #fff";
  controlButton.style.borderRadius = "3px";
  controlButton.style.boxShadow = "0 2px 6px rgba(0,0,0,.3)";
  controlButton.style.color = "rgb(25,25,25)";
  controlButton.style.cursor = "pointer";
  controlButton.style.fontFamily = "Roboto,Arial,sans-serif";
  controlButton.style.fontSize = "16px";
  controlButton.style.lineHeight = "38px";
  controlButton.style.margin = "8px 0 22px";
  controlButton.style.padding = "0 5px";
  controlButton.style.textAlign = "center";
  controlButton.textContent = "Center Map";
  controlButton.title = "Click to recenter the map";
  controlButton.type = "button";
  // Setup the click event listeners: simply set the map to Chicago.
  controlButton.addEventListener("click", () => {
    map.setCenter(chicago);
  });
  return controlButton;
}

function initMap() {
  map = new google.maps.Map(document.getElementById("map"), {
    zoom: 12,
    center: chicago,
  });

  // Create the DIV to hold the control.
  const centerControlDiv = document.createElement("div");
  // Create the control.
  const centerControl = createCenterControl(map);

  // Append the control to the DIV.
  centerControlDiv.appendChild(centerControl);
  map.controls[google.maps.ControlPosition.TOP_CENTER].push(centerControlDiv);
}

window.initMap = initMap;
ดูตัวอย่าง

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

การเพิ่มสถานะไปยังตัวควบคุม

ตัวควบคุมอาจจัดเก็บสถานะเอาไว้ด้วย ตัวอย่างต่อไปนี้คล้ายกับ แสดงก่อนหน้านี้ แต่ตัวควบคุมมี "ตั้งค่าหน้าแรก" เพิ่มเติม ที่ ตั้งค่าตัวควบคุมเพื่อแสดงตำแหน่งบ้านใหม่ โดยการสร้าง พร็อพเพอร์ตี้ home_ ภายในการควบคุมเพื่อจัดเก็บสถานะนี้และ จัดหา Getters และ Setters สำหรับรัฐนั้น

TypeScript

let map: google.maps.Map;

const chicago: google.maps.LatLngLiteral = { lat: 41.85, lng: -87.65 };

/**
 * The CenterControl adds a control to the map that recenters the map on
 * Chicago.
 */
class CenterControl {
  private map_: google.maps.Map;
  private center_: google.maps.LatLng;
  constructor(
    controlDiv: HTMLElement,
    map: google.maps.Map,
    center: google.maps.LatLngLiteral
  ) {
    this.map_ = map;
    // Set the center property upon construction
    this.center_ = new google.maps.LatLng(center);
    controlDiv.style.clear = "both";

    // Set CSS for the control border
    const goCenterUI = document.createElement("button");

    goCenterUI.id = "goCenterUI";
    goCenterUI.title = "Click to recenter the map";
    controlDiv.appendChild(goCenterUI);

    // Set CSS for the control interior
    const goCenterText = document.createElement("div");

    goCenterText.id = "goCenterText";
    goCenterText.innerHTML = "Center Map";
    goCenterUI.appendChild(goCenterText);

    // Set CSS for the setCenter control border
    const setCenterUI = document.createElement("button");

    setCenterUI.id = "setCenterUI";
    setCenterUI.title = "Click to change the center of the map";
    controlDiv.appendChild(setCenterUI);

    // Set CSS for the control interior
    const setCenterText = document.createElement("div");

    setCenterText.id = "setCenterText";
    setCenterText.innerHTML = "Set Center";
    setCenterUI.appendChild(setCenterText);

    // Set up the click event listener for 'Center Map': Set the center of
    // the map
    // to the current center of the control.
    goCenterUI.addEventListener("click", () => {
      const currentCenter = this.center_;

      this.map_.setCenter(currentCenter);
    });

    // Set up the click event listener for 'Set Center': Set the center of
    // the control to the current center of the map.
    setCenterUI.addEventListener("click", () => {
      const newCenter = this.map_.getCenter()!;

      if (newCenter) {
        this.center_ = newCenter;
      }
    });
  }
}

function initMap(): void {
  map = new google.maps.Map(document.getElementById("map") as HTMLElement, {
    zoom: 12,
    center: chicago,
  });

  // Create the DIV to hold the control and call the CenterControl()
  // constructor passing in this DIV.
  const centerControlDiv = document.createElement("div");
  const control = new CenterControl(centerControlDiv, map, chicago);

  // @ts-ignore
  centerControlDiv.index = 1;
  centerControlDiv.style.paddingTop = "10px";
  map.controls[google.maps.ControlPosition.TOP_CENTER].push(centerControlDiv);
}

declare global {
  interface Window {
    initMap: () => void;
  }
}
window.initMap = initMap;

JavaScript

let map;
const chicago = { lat: 41.85, lng: -87.65 };

/**
 * The CenterControl adds a control to the map that recenters the map on
 * Chicago.
 */
class CenterControl {
  map_;
  center_;
  constructor(controlDiv, map, center) {
    this.map_ = map;
    // Set the center property upon construction
    this.center_ = new google.maps.LatLng(center);
    controlDiv.style.clear = "both";

    // Set CSS for the control border
    const goCenterUI = document.createElement("button");

    goCenterUI.id = "goCenterUI";
    goCenterUI.title = "Click to recenter the map";
    controlDiv.appendChild(goCenterUI);

    // Set CSS for the control interior
    const goCenterText = document.createElement("div");

    goCenterText.id = "goCenterText";
    goCenterText.innerHTML = "Center Map";
    goCenterUI.appendChild(goCenterText);

    // Set CSS for the setCenter control border
    const setCenterUI = document.createElement("button");

    setCenterUI.id = "setCenterUI";
    setCenterUI.title = "Click to change the center of the map";
    controlDiv.appendChild(setCenterUI);

    // Set CSS for the control interior
    const setCenterText = document.createElement("div");

    setCenterText.id = "setCenterText";
    setCenterText.innerHTML = "Set Center";
    setCenterUI.appendChild(setCenterText);
    // Set up the click event listener for 'Center Map': Set the center of
    // the map
    // to the current center of the control.
    goCenterUI.addEventListener("click", () => {
      const currentCenter = this.center_;

      this.map_.setCenter(currentCenter);
    });
    // Set up the click event listener for 'Set Center': Set the center of
    // the control to the current center of the map.
    setCenterUI.addEventListener("click", () => {
      const newCenter = this.map_.getCenter();

      if (newCenter) {
        this.center_ = newCenter;
      }
    });
  }
}

function initMap() {
  map = new google.maps.Map(document.getElementById("map"), {
    zoom: 12,
    center: chicago,
  });

  // Create the DIV to hold the control and call the CenterControl()
  // constructor passing in this DIV.
  const centerControlDiv = document.createElement("div");
  const control = new CenterControl(centerControlDiv, map, chicago);

  // @ts-ignore
  centerControlDiv.index = 1;
  centerControlDiv.style.paddingTop = "10px";
  map.controls[google.maps.ControlPosition.TOP_CENTER].push(centerControlDiv);
}

window.initMap = initMap;
ดูตัวอย่าง

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