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

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

ดูตัวอย่าง

ภาพรวม

คุณสามารถตั้งค่าการเอียงและการหมุน (ส่วนหัว) บนแผนที่เวกเตอร์ โดยรวมพร็อพเพอร์ตี้ 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 Console) ผู้ใช้ก็จะปรับการเอียงได้ และการหมุนโดยใช้เมาส์และแป้นพิมพ์

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

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

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

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

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

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

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

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

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

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