Наклон и ориентация

Выберите платформу: Android 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>
    <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() and 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].