傾斜和旋轉

選取平台: Android iOS JavaScript

查看範例

總覽

如要進行向量地圖的傾斜和旋轉 (方向) 設定,請在地圖初始化時加入 headingtilt 屬性,並在地圖上呼叫 setTiltsetHeading 方法。下例會在地圖中加入幾個按鈕,透過程式輔助方式,依 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>
    <script src="https://polyfill.io/v3/polyfill.min.js?features=default"></script>

    <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 callback 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=beta"
      defer
    ></script>
  </body>
</html>

試用範例

使用滑鼠和鍵盤手勢

您可以使用滑鼠和鍵盤調整傾斜和旋轉角度:

  • 使用滑鼠:按住 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]。