องค์ประกอบในแผนที่เวกเตอร์

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

ดูตัวอย่าง

Maps JavaScript API มีการใช้งานแผนที่ 2 แบบ ได้แก่ แรสเตอร์และเวกเตอร์ แผนที่แรสเตอร์จะโหลดแผนที่เป็นตารางกริดของชิ้นส่วนรูปภาพแรสเตอร์แบบพิกเซล ซึ่งสร้างขึ้นโดยฝั่งเซิร์ฟเวอร์ของ Google Maps Platform แล้วแสดงในเว็บแอปของคุณ แผนที่เวกเตอร์ประกอบด้วยชิ้นส่วนแบบเวกเตอร์ ซึ่งวาดขึ้น ณ เวลาที่โหลดในฝั่งไคลเอ็นต์โดยใช้ WebGL ซึ่งเป็นเทคโนโลยีเว็บที่ช่วยให้เบราว์เซอร์เข้าถึง GPU ในอุปกรณ์ของผู้ใช้เพื่อแสดงผลกราฟิก 2 มิติและ 3 มิติได้

แผนที่เวกเตอร์คือแผนที่ Google เดียวกันกับที่ผู้ใช้คุ้นเคย และมีข้อดีหลายประการเหนือแผนที่ไทล์แรสเตอร์เริ่มต้น โดยเฉพาะความคมชัดของรูปภาพแบบเวกเตอร์ และการเพิ่มสิ่งปลูกสร้าง 3 มิติที่ระดับการซูมใกล้ แผนที่เวกเตอร์รองรับฟีเจอร์ต่อไปนี้

เริ่มต้นใช้งานแผนที่เวกเตอร์

การเอียงและการหมุน

คุณสามารถตั้งค่าการเอียงและการหมุน (ทิศทาง) ในแผนที่เวกเตอร์ได้โดยใส่พร็อพเพอร์ตี้ heading และ tilt เมื่อเริ่มต้นแผนที่ และโดยเรียกใช้เมธอด setTilt และ setHeading ในแผนที่ ตัวอย่างต่อไปนี้จะเพิ่มปุ่มบางปุ่มลงในแผนที่ซึ่งแสดงการปรับการเอียงและการมุ่งหน้าโดยใช้โปรแกรมโดยเพิ่มขึ้นทีละ 20 องศา

TypeScript

function initMap(): void {
  const map = new google.maps.Map(
    document.getElementById("map") as HTMLElement,
    {
      center: {
        lat: 37.7893719,
        lng: -122.3942,
      },
      zoom: 16,
      heading: 320,
      tilt: 47.5,
      mapId: "90f87356969d889c",
    }
  );

  const buttons: [string, string, number, google.maps.ControlPosition][] = [
    ["Rotate Left", "rotate", 20, google.maps.ControlPosition.LEFT_CENTER],
    ["Rotate Right", "rotate", -20, google.maps.ControlPosition.RIGHT_CENTER],
    ["Tilt Down", "tilt", 20, google.maps.ControlPosition.TOP_CENTER],
    ["Tilt Up", "tilt", -20, google.maps.ControlPosition.BOTTOM_CENTER],
  ];

  buttons.forEach(([text, mode, amount, position]) => {
    const controlDiv = document.createElement("div");
    const controlUI = document.createElement("button");

    controlUI.classList.add("ui-button");
    controlUI.innerText = `${text}`;
    controlUI.addEventListener("click", () => {
      adjustMap(mode, amount);
    });
    controlDiv.appendChild(controlUI);
    map.controls[position].push(controlDiv);
  });

  const adjustMap = function (mode: string, amount: number) {
    switch (mode) {
      case "tilt":
        map.setTilt(map.getTilt()! + amount);
        break;
      case "rotate":
        map.setHeading(map.getHeading()! + amount);
        break;
      default:
        break;
    }
  };
}

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

JavaScript

function initMap() {
  const map = new google.maps.Map(document.getElementById("map"), {
    center: {
      lat: 37.7893719,
      lng: -122.3942,
    },
    zoom: 16,
    heading: 320,
    tilt: 47.5,
    mapId: "90f87356969d889c",
  });
  const buttons = [
    ["Rotate Left", "rotate", 20, google.maps.ControlPosition.LEFT_CENTER],
    ["Rotate Right", "rotate", -20, google.maps.ControlPosition.RIGHT_CENTER],
    ["Tilt Down", "tilt", 20, google.maps.ControlPosition.TOP_CENTER],
    ["Tilt Up", "tilt", -20, google.maps.ControlPosition.BOTTOM_CENTER],
  ];

  buttons.forEach(([text, mode, amount, position]) => {
    const controlDiv = document.createElement("div");
    const controlUI = document.createElement("button");

    controlUI.classList.add("ui-button");
    controlUI.innerText = `${text}`;
    controlUI.addEventListener("click", () => {
      adjustMap(mode, amount);
    });
    controlDiv.appendChild(controlUI);
    map.controls[position].push(controlDiv);
  });

  const adjustMap = function (mode, amount) {
    switch (mode) {
      case "tilt":
        map.setTilt(map.getTilt() + amount);
        break;
      case "rotate":
        map.setHeading(map.getHeading() + amount);
        break;
      default:
        break;
    }
  };
}

window.initMap = initMap;

CSS

/* 
 * Always set the map height explicitly to define the size of the div element
 * that contains the map. 
 */
#map {
  height: 100%;
}

/* 
 * Optional: Makes the sample page fill the window. 
 */
html,
body {
  height: 100%;
  margin: 0;
  padding: 0;
}

.ui-button {
  background-color: #fff;
  border: 0;
  border-radius: 2px;
  box-shadow: 0 1px 4px -1px rgba(0, 0, 0, 0.3);
  margin: 10px;
  padding: 0 0.5em;
  font: 400 18px Roboto, Arial, sans-serif;
  overflow: hidden;
  height: 40px;
  cursor: pointer;
}
.ui-button:hover {
  background: rgb(235, 235, 235);
}

HTML

<html>
  <head>
    <title>Tilt and Rotation</title>

    <link rel="stylesheet" type="text/css" href="./style.css" />
    <script type="module" src="./index.js"></script>
  </head>
  <body>
    <div id="map"></div>

    <!-- 
      The `defer` attribute causes the script to execute after the full HTML
      document has been parsed. For non-blocking uses, avoiding race conditions,
      and consistent behavior across browsers, consider loading using Promises. See
      https://developers.google.com/maps/documentation/javascript/load-maps-js-api
      for more information.
      -->
    <script
      src="https://maps.googleapis.com/maps/api/js?key=AIzaSyB41DRUbKWJHPxaFjMAwdrzWzbVKartNGg&callback=initMap&v=weekly"
      defer
    ></script>
  </body>
</html>

ใช้ท่าทางสัมผัสของเมาส์และแป้นพิมพ์

หากเปิดใช้การโต้ตอบของผู้ใช้สำหรับการเอียงและการหมุน (ทิศทาง) (ไม่ว่าจะโดยการเขียนโปรแกรมหรือในคอนโซล Google Cloud) ผู้ใช้จะปรับการเอียงและการหมุนได้โดยใช้เมาส์และแป้นพิมพ์ ดังนี้

  • เมื่อใช้เมาส์ ให้กดปุ่ม Shift ค้างไว้ แล้วลากเมาส์ขึ้นและลงเพื่อปรับการเอียง และลากไปทางขวาและซ้ายเพื่อปรับทิศทาง
  • เมื่อใช้แป้นพิมพ์ ให้กดแป้น Shift ค้างไว้ จากนั้นใช้แป้นลูกศรขึ้นและลงเพื่อปรับการเอียง และใช้แป้นลูกศรขวาและซ้ายเพื่อปรับทิศทาง

ปรับการเอียงและทิศทางแบบเป็นโปรแกรม

ใช้เมธอด setTilt() และ setHeading() เพื่อปรับการเอียงและทิศทางบนแผนที่เวกเตอร์แบบเป็นโปรแกรม ทิศทางคือทิศทางที่กล้องหันไปในหน่วยองศาตามเข็มนาฬิกาโดยเริ่มจากทิศเหนือ ดังนั้น map.setHeading(90) จะหมุนแผนที่เพื่อให้ทิศตะวันออกหันขึ้นด้านบน มุมเอียงจะวัดจากจุดยอด ดังนั้น map.setTilt(0) จะมองตรงลงไป ขณะที่ map.setTilt(45) จะทำให้ได้มุมมองเฉียง

  • เรียกใช้ setTilt() เพื่อตั้งค่ามุมเอียงของแผนที่ ใช้ getTilt() เพื่อรับค่าการเอียงปัจจุบัน
  • เรียกใช้ setHeading() เพื่อตั้งค่าทิศทางของแผนที่ ใช้ getHeading() เพื่อรับค่าทิศทางปัจจุบัน

หากต้องการเปลี่ยนศูนย์กลางแผนที่ขณะที่ยังคงการเอียงและทิศทางไว้ ให้ใช้ map.setCenter() หรือ map.panBy()

โปรดทราบว่าช่วงของมุมที่ใช้ได้จะแตกต่างกันไปตามระดับการซูมปัจจุบัน ค่าที่อยู่นอกช่วงนี้จะถูกจำกัดให้อยู่ในช่วงที่อนุญาต

นอกจากนี้ คุณยังใช้เมธอด moveCamera เพื่อเปลี่ยนการมุ่งหน้า การเอียง ศูนย์กลาง และการซูมแบบเป็นโปรแกรมได้ด้วย ดูข้อมูลเพิ่มเติม

ผลกระทบต่อวิธีอื่นๆ

เมื่อใช้การเอียงหรือการหมุนกับแผนที่ ลักษณะการทำงานของเมธอด Maps JavaScript API อื่นๆ จะได้รับผลกระทบดังนี้

  • map.getBounds() จะแสดงผลกรอบล้อมรอบที่เล็กที่สุดซึ่งรวมถึงพื้นที่ที่มองเห็นได้เสมอ เมื่อใช้การเอียง ขอบเขตที่แสดงผลอาจแสดงพื้นที่ที่ใหญ่กว่าพื้นที่ที่มองเห็นได้ของวิวพอร์ตของแผนที่
  • map.fitBounds() จะรีเซ็ตการเอียงและทิศทางเป็นศูนย์ก่อนที่จะปรับให้พอดีกับขอบเขต
  • map.panToBounds() จะรีเซ็ตการเอียงและทิศทางเป็นศูนย์ก่อนที่จะเลื่อนขอบเขต
  • map.setTilt() ยอมรับค่าใดก็ได้ แต่จำกัดการเอียงสูงสุดตามระดับการซูมแผนที่ปัจจุบัน
  • map.setHeading() ยอมรับค่าใดก็ได้ และจะแก้ไขค่าดังกล่าวให้พอดีกับช่วง [0, 360]

ควบคุมกล้อง

ใช้ฟังก์ชัน map.moveCamera() เพื่ออัปเดตพร็อพเพอร์ตี้กล้องแบบผสมผสานพร้อมกัน map.moveCamera() ยอมรับพารามิเตอร์เดียวที่มีพร็อพเพอร์ตี้ทั้งหมดของกล้องที่จะอัปเดต ตัวอย่างต่อไปนี้แสดงการเรียกใช้ map.moveCamera() เพื่อตั้งค่า center, zoom, heading และ tilt พร้อมกัน

map.moveCamera({
  center: new google.maps.LatLng(37.7893719, -122.3942),
  zoom: 16,
  heading: 320,
  tilt: 47.5
});

คุณสามารถทำให้พร็อพเพอร์ตี้กล้องเคลื่อนไหวได้โดยเรียกใช้ map.moveCamera() ด้วยลูปภาพเคลื่อนไหว ดังที่แสดงที่นี่

const degreesPerSecond = 3;

function animateCamera(time) {
  // Update the heading, leave everything else as-is.
  map.moveCamera({
    heading: (time / 1000) * degreesPerSecond
  });

  requestAnimationFrame(animateCamera);
}

// Start the animation.
requestAnimationFrame(animateCamera);

ตำแหน่งกล้อง

มุมมองแผนที่จะจำลองเป็นกล้องที่มองลงมายังระนาบแบนราบ ตำแหน่งของกล้อง (และการแสดงผลแผนที่) จะระบุโดยพร็อพเพอร์ตี้ต่อไปนี้ เป้าหมาย (ตำแหน่งละติจูด/ลองจิจูด), ทิศทาง, การเอียง และการซูม

แผนภาพคุณสมบัติของกล้อง

เป้าหมาย (สถานที่ตั้ง)

เป้าหมายของกล้องคือตำแหน่งของศูนย์กลางแผนที่ ซึ่งระบุเป็นพิกัดละติจูดและลองจิจูด

ละติจูดต้องอยู่ระหว่าง -85 ถึง 85 องศา ค่าที่สูงกว่าหรือต่ำกว่าช่วงนี้จะถูกจำกัดให้อยู่ในค่าที่ใกล้เคียงที่สุดภายในช่วงนี้ เช่น การระบุละติจูดเป็น 100 จะตั้งค่าเป็น 85 ลองจิจูดมีค่าระหว่าง -180 ถึง 180 องศา ค่าที่สูงกว่าหรือต่ำกว่าช่วงนี้จะถูกตัดให้สอดคล้องกับช่วง (-180, 180) ตัวอย่างเช่น 480, 840 และ 1200 จะถูกตัดเป็น 120 องศาทั้งหมด

ทิศทาง (การวางแนว)

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

ทิศทาง 0 หมายความว่าด้านบนของแผนที่ชี้ไปทางทิศเหนือจริง ค่าทิศทาง 90 หมายความว่าด้านบนของแผนที่ชี้ไปทางทิศตะวันออก (90 องศาบนเข็มทิศ) ค่า 180 หมายความว่าด้านบนของแผนที่ชี้ไปทางทิศใต้

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

การเอียง (มุมมอง)

การเอียงจะกำหนดตำแหน่งของกล้องบนส่วนโค้งเหนือตำแหน่งกึ่งกลางของแผนที่โดยตรง โดยวัดเป็นองศาจากจุดต่ำสุด (ทิศทางที่ชี้ลงด้านล่างของกล้องโดยตรง) ค่า 0 สอดคล้องกับกล้องที่ชี้ลงตรงๆ ค่าที่มากกว่า 0 สอดคล้องกับกล้องที่หันไปทางขอบฟ้าตามจำนวนองศาที่ระบุ เมื่อคุณเปลี่ยนมุมมอง แผนที่จะปรากฏในมุมมองที่มีลักษณะที่อยู่ไกลออกไปจะดูเล็กลง และลักษณะที่อยู่ใกล้จะดูใหญ่ขึ้น ภาพต่อไปนี้แสดงให้เห็นถึงกรณีดังกล่าว

ในรูปภาพด้านล่าง มุมมองคือ 0 องศา ภาพแรกแสดงแผนผังของตำแหน่งนี้ โดยตำแหน่ง 1 คือตำแหน่งกล้อง และตำแหน่ง 2 คือตำแหน่งแผนที่ปัจจุบัน แผนที่ที่ได้จะแสดงอยู่ด้านล่าง

ภาพหน้าจอของแผนที่ที่มีกล้องอยู่ในมุมมอง 0 องศาที่ระดับการซูม 18
แผนที่ที่แสดงด้วยมุมมองเริ่มต้นของกล้อง
แผนภาพที่แสดงตำแหน่งเริ่มต้นของกล้องซึ่งอยู่เหนือตำแหน่งแผนที่โดยตรงที่มุม 0 องศา
มุมมองเริ่มต้นของกล้อง

ในรูปภาพด้านล่าง มุมมองคือ 45 องศา สังเกตว่ากล้องจะเคลื่อนที่ไปครึ่งทางตามส่วนโค้งระหว่างตำแหน่งเหนือศีรษะตรงๆ (0 องศา) และพื้น (90 องศา) ไปยังตำแหน่ง 3 กล้องยังคงชี้ไปที่จุดศูนย์กลางของแผนที่ แต่ตอนนี้พื้นที่ที่แสดงด้วยเส้นที่ตำแหน่ง 4 จะมองเห็นได้

ภาพหน้าจอของแผนที่ที่มีกล้องอยู่ในมุมมอง 45 องศาที่ระดับการซูม 18
แผนที่แสดงด้วยมุมมอง 45 องศา
แผนภาพที่แสดงมุมมองของกล้องที่ตั้งค่าเป็น 45 องศา โดยระดับการซูมยังคงตั้งค่าเป็น 18
มุมมองกล้อง 45 องศา

แผนที่ในภาพหน้าจอนี้ยังคงอยู่ตรงกลางจุดเดียวกับในแผนที่ต้นฉบับ แต่มีฟีเจอร์เพิ่มเติมปรากฏที่ด้านบนของแผนที่ เมื่อคุณเพิ่มมุมเกิน 45 องศา ฟีเจอร์ระหว่างกล้องและตำแหน่งแผนที่จะปรากฏขึ้นตามสัดส่วนที่ใหญ่ขึ้น ขณะที่ฟีเจอร์ที่อยู่นอกตำแหน่งแผนที่จะปรากฏขึ้นตามสัดส่วนที่เล็กลง ซึ่งจะทำให้เกิดเอฟเฟกต์ 3 มิติ

ซูม

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

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

  • 1: โลก
  • 5: ผืนแผ่นดิน/ทวีป
  • 10: เมือง
  • 15: ถนน
  • 20: อาคาร
รูปภาพต่อไปนี้แสดงลักษณะที่ปรากฏของระดับการซูมที่แตกต่างกัน
ภาพหน้าจอของแผนที่ที่ระดับการซูม 5
แผนที่ที่ระดับการซูม 5
ภาพหน้าจอของแผนที่ที่ระดับการซูม 15
แผนที่ที่ระดับการซูม 15
ภาพหน้าจอของแผนที่ที่ระดับการซูม 20
แผนที่ที่ระดับการซูม 20

การซูมแบบเศษส่วน

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

ตัวอย่างต่อไปนี้แสดงการเปิดใช้การซูมแบบเศษส่วนเมื่อเริ่มต้นแผนที่

map = new google.maps.Map(document.getElementById('map'), {
  center: {lat: -34.397, lng: 150.644},
  zoom: 8,
  isFractionalZoomEnabled: true
});

นอกจากนี้ คุณยังเปิดและปิดการซูมแบบเศษส่วนได้โดยตั้งค่าตัวเลือกแผนที่ isFractionalZoomEnabled ดังที่แสดงที่นี่

// Using map.set
map.set('isFractionalZoomEnabled', true);

// Using map.setOptions
map.setOptions({isFractionalZoomEnabled: true});

คุณสามารถตั้งค่า Listener เพื่อตรวจจับว่าการซูมแบบเศษส่วนเปิดอยู่หรือไม่ ซึ่งจะมีประโยชน์มากที่สุดหากคุณไม่ได้ตั้งค่า isFractionalZoomEnabled เป็น true หรือ false อย่างชัดเจน โค้ดตัวอย่างต่อไปนี้จะตรวจสอบว่ามีการเปิดใช้การซูมแบบเศษส่วนหรือไม่

map.addListener('isfractionalzoomenabled_changed', () => {
  const isFractionalZoomEnabled = map.get('isFractionalZoomEnabled');
  if (isFractionalZoomEnabled === false) {
    console.log('not using fractional zoom');
  } else if (isFractionalZoomEnabled === true) {
    console.log('using fractional zoom');
  } else {
    console.log('map not done initializing yet');
  }
});