نظرة عامة
يمكنك ضبط الإمالة والتدوير (العنوان) على خريطة المتجه
عن طريق تضمين الخاصيتين 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=weekly" 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
لتغيير العنوان والإمالة
والتوسيط والتكبير/التصغير آليًا. مزيد من المعلومات
التأثير في الطرق الأخرى
عند تطبيق الإمالة أو التدوير على الخريطة، يتأثر سلوك طرق API الأخرى لـ JavaScript:
- تعرض
map.getBounds()
دائمًا أصغر مربع حدود يتضمن المنطقة المرئية. وعند تطبيق الإمالة، قد تمثل الحدود المعروضة منطقة أكبر من المنطقة المرئية لإطار عرض الخريطة. - سيعيد
map.fitBounds()
ضبط درجة الإمالة والاتجاه إلى الصفر قبل ملاءمة الحدود. - سيعيد
map.panToBounds()
ضبط الإمالة والاتجاه إلى الصفر قبل تحريك الحدود. - تقبل دالة
map.setTilt()
أي قيمة، ولكنها تفرض الحد الأقصى للإمالة بناءً على مستوى تكبير الخريطة الحالي. - تقبل
map.setHeading()
أي قيمة، وتعدّلها لتلائم النطاق [0، 360].