Pochylenie i obrót

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

Wybierz platformę: Android iOS JavaScript

Wyświetl próbkę

Opis

Aby przechylić i obrócić (nagłówek) na mapie wektorowej, dodaj właściwości heading i tilt podczas inicjowania mapy oraz wywołaj na mapie metody setTilt i setHeading. W przykładzie poniżej dodaliśmy do mapy przyciski, które pozwalają automatycznie dostosowywać pochylenie i kierunek głowy w 20-stopniowych odstępach.

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
     with https://www.npmjs.com/package/@googlemaps/js-api-loader.
    -->
    <script
      src="https://maps.googleapis.com/maps/api/js?key=AIzaSyB41DRUbKWJHPxaFjMAwdrzWzbVKartNGg&callback=initMap&v=beta"
      defer
    ></script>
  </body>
</html>

Fragment

Korzystanie z gestów myszy i klawiatury

Możesz dostosować pochylenie i obrót za pomocą myszy i klawiatury:

  • Przy użyciu myszy przytrzymaj klawisz Shift, a potem kliknij i przeciągnij myszą w górę lub w dół, aby dostosować pochylenie, prawo i lewo, aby dostosować nagłówek.
  • Przy użyciu klawiatury przytrzymaj klawisz Shift, a następnie użyj klawiszy strzałek w górę i w dół, aby dostosować pochylenie, i w prawo i w lewo, aby dostosować nagłówek.

Automatyczne dostosowywanie pochylenia i nagłówka

Użyj metod setTilt() i setHeading(), aby automatycznie dostosowywać pochylenie i nagłówek na mapie wektorowej. Kierunek to kierunek, w którym kamera jest ustawiona zgodnie z ruchem wskazówek zegara, od północy w kierunku północnym, więc map.setHeading(90) obróci mapę zgodnie z kierunekem wschodnim. Kąt nachylenia jest mierzony od zenitu, przez co widok map.setTilt(0) jest skierowany prosto w dół, a map.setTilt(45) daje widok skośny.

  • Zadzwoń pod numer setTilt(), aby ustawić kąt nachylenia mapy. Aby uzyskać aktualną wartość pochylenia, użyj getTilt().
  • Zadzwoń pod numer setHeading(), aby ustawić nagłówek mapy. Aby poznać bieżącą wartość nagłówka, użyj polecenia getHeading().

Aby zmienić środek mapy przy zachowaniu przechylenia i nagłówka, użyj map.setCenter() lub map.panBy().

Zakres kątów, które można zastosować, zależy od bieżącego poziomu powiększenia. Wartości spoza tego zakresu są zmieniane na bieżące dozwolone zakresy.

Możesz też użyć metody moveCamera, aby automatycznie zmienić nagłówek, przechylenie, środek lub powiększenie. Więcej informacji

Wpływ na inne metody

Po zastosowaniu pochylenia lub obrócenia na mapie wpływa to na inne metody interfejsu Maps JavaScript API:

  • map.getBounds() zawsze zwraca najmniejsze ramki graniczne zawierające widoczny obszar. Po zastosowaniu pochylenia zwrócone granice mogą odpowiadać większemu obszarowi niż widoczny obszar widocznego obszaru mapy.
  • Przed zrównaniem granic map.fitBounds() zostanie wyzerowane pochylenie i ustawienie nagłówka na zero.
  • Przed przesunięciem granic map.panToBounds() zostanie wyzerowane przechylenie i nagłówek.
  • map.setTilt() akceptuje dowolną wartość, ale ogranicza maksymalny nachylenie w zależności od bieżącego poziomu powiększenia mapy.
  • map.setHeading() może przyjmować dowolną wartość i modyfikować ją do zakresu [0, 360].