إمالة وتدوير

اختيار النظام الأساسي: 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 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 لتغيير العنوان والإمالة والتوسيط والتكبير/التصغير آليًا. مزيد من المعلومات

التأثير على الطرق الأخرى

عند تطبيق الإمالة أو التدوير على الخريطة، يتأثر سلوك طرق واجهة برمجة تطبيقات JavaScript للخرائط الأخرى:

  • تعرض map.getBounds() دائمًا أصغر مربّع حدود يتضمن المنطقة المرئية، وعند تطبيق الإمالة، قد تمثل الحدود المعروضة منطقة أكبر من المنطقة المرئية لإطار عرض الخريطة.
  • سيعيد map.fitBounds() ضبط الإمالة والاتجاه إلى صفر قبل ملاءمة الحدود.
  • سيعيد map.panToBounds() ضبط الإمالة والاتجاه إلى صفر قبل تدوير الحدود.
  • تقبل map.setTilt() أي قيمة، ولكنها تقيّد الحد الأقصى للإمالة بناءً على مستوى تكبير/تصغير الخريطة الحالي.
  • تقبل الدالة map.setHeading() أي قيمة، وتعدّلها لتلائم النطاق [0, 360].