वेक्टर मैप सुविधाएं

प्लैटफ़ॉर्म चुनें: Android iOS JavaScript

सैंपल देखें

Maps JavaScript API, मैप को लागू करने के दो अलग-अलग तरीके उपलब्ध कराता है: रेस्टर और वेक्टर. रेस्टर मैप, मैप को पिक्सल पर आधारित रेस्टर इमेज टाइल के ग्रिड के तौर पर लोड करता है. ये टाइल, Google Maps Platform के सर्वर साइड से जनरेट होती हैं. इसके बाद, इन्हें आपके वेब ऐप्लिकेशन पर दिखाया जाता है. वेक्टर मैप, वेक्टर पर आधारित टाइल से बना होता है. इन्हें क्लाइंट-साइड पर लोड होने के समय, WebGL का इस्तेमाल करके बनाया जाता है. यह एक वेब टेक्नोलॉजी है, जिसकी मदद से ब्राउज़र, उपयोगकर्ता के डिवाइस पर मौजूद जीपीयू को ऐक्सेस करके 2D और 3D ग्राफ़िक रेंडर कर सकता है.

वेक्टर मैप, वही Google मैप है जिसका इस्तेमाल आपके उपयोगकर्ता करते हैं. यह डिफ़ॉल्ट रेस्टर टाइल मैप की तुलना में कई फ़ायदे देता है. इनमें, वेक्टर पर आधारित इमेज की बेहतर क्वालिटी और ज़ूम लेवल के हिसाब से 3D इमारतों को जोड़ना शामिल है. वेक्टर मैप में ये सुविधाएं काम करती हैं:

वेक्टर मैप का इस्तेमाल शुरू करना

झुकाना और घुमाना

वेक्टर मैप पर झुकाव और घुमाव (हेडिंग) सेट किया जा सकता है. इसके लिए, मैप को शुरू करते समय 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;

सीएसएस

/* 
 * 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>
  <head>
    <title>Tilt and Rotation</title>

    <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 तरीके का भी इस्तेमाल किया जा सकता है. ज़्यादा जानें.

अन्य तरीकों पर असर

मैप पर झुकाव या घुमाव लागू करने पर, Maps JavaScript API के अन्य तरीकों के व्यवहार पर असर पड़ता है:

  • map.getBounds() हमेशा सबसे छोटा बाउंडिंग बॉक्स दिखाता है, जिसमें दिखने वाला इलाका शामिल होता है. जब टिल्ट लागू होता है, तो दिखाए गए बॉर्डर, मैप के व्यूपोर्ट के दिखने वाले इलाके से ज़्यादा बड़े इलाके को दिखा सकते हैं.
  • map.fitBounds(), सीमाओं को फ़िट करने से पहले, झुकाव और हेडिंग को शून्य पर रीसेट कर देगा.
  • map.panToBounds(), पैन करने से पहले, झुकाव और हेडिंग को शून्य पर रीसेट कर देगा.
  • map.setTilt() में कोई भी वैल्यू डाली जा सकती है. हालांकि, मैप के मौजूदा ज़ूम लेवल के आधार पर, ज़्यादा से ज़्यादा झुकाव पर पाबंदी लगाई जाती है.
  • map.setHeading() किसी भी वैल्यू को स्वीकार करता है और उसे [0, 360] की रेंज में फ़िट करने के लिए बदल देगा.

कैमरे को कंट्रोल करना

कैमरे की सभी प्रॉपर्टी को एक साथ अपडेट करने के लिए, map.moveCamera() फ़ंक्शन का इस्तेमाल करें. map.moveCamera() एक पैरामीटर स्वीकार करता है, जिसमें अपडेट की जाने वाली सभी कैमरा प्रॉपर्टी होती हैं. यहां दिए गए उदाहरण में, center, zoom, heading, और tilt को एक साथ सेट करने के लिए, map.moveCamera() को कॉल करने का तरीका बताया गया है:

map.moveCamera({
  center: new google.maps.LatLng(37.7893719, -122.3942),
  zoom: 16,
  heading: 320,
  tilt: 47.5
});

कैमरा प्रॉपर्टी को ऐनिमेट करने के लिए, ऐनिमेशन लूप के साथ map.moveCamera() को कॉल करें, जैसा कि यहां दिखाया गया है:

const degreesPerSecond = 3;

function animateCamera(time) {
  // Update the heading, leave everything else as-is.
  map.moveCamera({
    heading: (time / 1000) * degreesPerSecond
  });

  requestAnimationFrame(animateCamera);
}

// Start the animation.
requestAnimationFrame(animateCamera);

कैमरे की स्थिति

मैप व्यू को कैमरे के तौर पर मॉडल किया गया है, जो किसी सपाट विमान को नीचे से देख रहा है. कैमरे की पोज़िशन (इसलिए, मैप का रेंडरिंग) इन प्रॉपर्टी से तय होती है: टारगेट (अक्षांश/देशांतर की जगह), बियरिंग, टिल्ट, और ज़ूम.

कैमरे की प्रॉपर्टी का डायग्राम

टारगेट (जगह)

कैमरे का टारगेट, मैप के बीच में मौजूद जगह होती है. इसे अक्षांश और देशांतर के निर्देशांक के तौर पर दिखाया जाता है.

अक्षांश -85 से 85 डिग्री के बीच हो सकता है. इस सीमा से ऊपर या नीचे की वैल्यू, इस सीमा में मौजूद सबसे करीब की वैल्यू पर सेट कर दी जाएंगी. उदाहरण के लिए, अक्षांश की वैल्यू 100 डालने पर, वैल्यू 85 पर सेट हो जाएगी. देशांतर, -180 से 180 डिग्री के बीच होता है. इस रेंज से ऊपर या नीचे की वैल्यू को इस तरह रैप किया जाएगा कि वे (-180, 180) की रेंज में आ जाएं. उदाहरण के लिए, 480, 840, और 1200 को 120 डिग्री पर रैप किया जाएगा.

बीयरिंग (ओरिएंटेशन)

कैमरे की बियरिंग से कंपास की दिशा का पता चलता है. इसे मैप के सबसे ऊपरी किनारे से, 'ट्रू नॉर्थ' से डिग्री में मेज़र किया जाता है. अगर मैप के बीच से लेकर सबसे ऊपर तक वर्टिकल लाइन खींची जाती है, तो यह मैप के उत्तरी हिस्से के हिसाब से कैमरे की हेडिंग (डिग्री में मेज़र की जाती है) से मेल खाती है.

बियरिंग 0 होने का मतलब है कि मैप का सबसे ऊपरी हिस्सा, 'ट्रू नॉर्थ' (सही उत्तर) की ओर है. अगर दिशा की वैल्यू 90 है, तो इसका मतलब है कि नक्शे का सबसे ऊपरी हिस्सा पूर्व की ओर है (कम्पास पर 90 डिग्री). अगर वैल्यू 180 है, तो इसका मतलब है कि मैप के सबसे ऊपरी हिस्से से दक्षिण की ओर इशारा किया जा रहा है.

Maps API की मदद से, मैप की दिशा बदली जा सकती है. उदाहरण के लिए, कार चलाने वाला व्यक्ति अक्सर सड़क के मैप को अपनी यात्रा की दिशा के हिसाब से अलाइन करता है. वहीं, मैप और कंपास का इस्तेमाल करने वाले लोग, आम तौर पर मैप को इस तरह से अलाइन करते हैं कि वर्टिकल लाइन उत्तर की ओर हो.

झुकाव (देखने का ऐंगल)

टिल्ट से, मैप के बीच में मौजूद कैमरे की पोज़िशन का पता चलता है. इसे नादिर (कैमरे के ठीक नीचे की दिशा) से डिग्री में मेज़र किया जाता है. 0 की वैल्यू का मतलब है कि कैमरा सीधे नीचे की ओर है. 0 से ज़्यादा की वैल्यू, ऐसे कैमरे से जुड़ी होती है जिसे तय डिग्री के हिसाब से, क्षितिज की ओर झुकाया गया हो. व्यू के ऐंगल को बदलने पर, मैप पर चीज़ें अलग-अलग दिखती हैं. जैसे, दूर की चीज़ें छोटी और आस-पास की चीज़ें बड़ी दिखती हैं. नीचे दिए गए उदाहरणों में इस बारे में बताया गया है.

नीचे दी गई इमेज में, व्यूइंग ऐंगल 0 डिग्री है. पहली इमेज में इसका स्कीमैटिक दिखाया गया है. इसमें, पोज़िशन 1 कैमरे की पोज़िशन है और पोज़िशन 2 मैप की मौजूदा पोज़िशन है. इसके नीचे, नतीजा दिखाने वाला मैप दिखेगा.

मैप का स्क्रीनशॉट, जिसमें कैमरा 0 डिग्री के व्यू ऐंगल पर और 18 के ज़ूम लेवल पर है.
कैमरे के डिफ़ॉल्ट व्यू ऐंगल के साथ दिखाया गया मैप.
यह डायग्राम, कैमरे की डिफ़ॉल्ट पोज़िशन दिखाता है. यह पोज़िशन, मैप की पोज़िशन के ठीक ऊपर 0 डिग्री के ऐंगल पर होती है.
कैमरे का डिफ़ॉल्ट व्यू ऐंगल.

नीचे दी गई इमेज में, व्यूइंग ऐंगल 45 डिग्री है. ध्यान दें कि कैमरा 3 पोज़िशन पर जाने के लिए, सीधे ऊपर (0 डिग्री) और ज़मीन (90 डिग्री) के बीच आर्क के आधे हिस्से तक चलता है. कैमरा अब भी मैप के सेंटर पॉइंट पर है, लेकिन 4 पोज़िशन पर लाइन से दिखाया गया इलाका अब दिख रहा है.

मैप का स्क्रीनशॉट, जिसमें कैमरा 45 डिग्री के व्यू ऐंगल पर है और ज़ूम लेवल 18 है.
45 डिग्री के व्यू ऐंगल के साथ दिखाया गया मैप.
डायग्राम, जिसमें कैमरे का व्यूइंग ऐंगल 45 डिग्री पर सेट है. साथ ही, ज़ूम लेवल अब भी 18 पर सेट है.
कैमरे का व्यू ऐंगल 45 डिग्री होना चाहिए.

इस स्क्रीनशॉट में मौजूद मैप, अब भी उसी पॉइंट पर सेंटर किया गया है जिस पर मूल मैप में था. हालांकि, मैप के सबसे ऊपर ज़्यादा सुविधाएं दिख रही हैं. 45 डिग्री से ज़्यादा का ऐंगल चुनने पर, कैमरे और मैप की पोज़िशन के बीच की चीज़ें, अनुपात के हिसाब से बड़ी दिखती हैं. वहीं, मैप की पोज़िशन से आगे की चीज़ें, अनुपात के हिसाब से छोटी दिखती हैं. इससे 3D इफ़ेक्ट मिलता है.

ज़ूम करें

कैमरे के ज़ूम लेवल से मैप का स्केल तय होता है. ज़ूम करने के बड़े लेवल पर, स्क्रीन पर ज़्यादा जानकारी देखी जा सकती है. वहीं, ज़ूम करने के छोटे लेवल पर, स्क्रीन पर दुनिया का ज़्यादा हिस्सा देखा जा सकता है.

ज़ूम लेवल के लिए, पूर्णांक होना ज़रूरी नहीं है. मैप पर ज़ूम करने की अनुमति वाली रेंज, कई बातों पर निर्भर करती है. जैसे, टारगेट, मैप टाइप, और स्क्रीन साइज़. रेंज से बाहर का कोई भी नंबर, सबसे करीब की मान्य वैल्यू में बदल जाएगा. यह वैल्यू, ज़ूम का कम से कम या ज़्यादा से ज़्यादा लेवल हो सकता है. इस सूची में बताया गया है कि ज़ूम के हर लेवल पर, आपको कितनी जानकारी दिख सकती है:

  • 1: दुनिया
  • 5: देश/महाद्वीप
  • 10: शहर
  • 15: सड़कें
  • 20: बिल्डिंग
यहां दी गई इमेज में, अलग-अलग ज़ूम लेवल के विज़ुअल दिखाए गए हैं:
ज़ूम लेवल 5 पर मैप का स्क्रीनशॉट
ज़ूम लेवल 5 पर मौजूद मैप.
ज़ूम लेवल 15 पर मैप का स्क्रीनशॉट
ज़ूम लेवल 15 पर मैप.
ज़ूम लेवल 20 पर मैप का स्क्रीनशॉट
ज़ूम लेवल 20 पर मैप.

फ़्रैक्शनल ज़ूम

वेक्टर मैप में फ़्रैक्शनल ज़ूम की सुविधा काम करती है. इसकी मदद से, पूर्णांक के बजाय फ़्रैक्शनल वैल्यू का इस्तेमाल करके ज़ूम किया जा सकता है. रेस्टर और वेक्टर, दोनों मैप में फ़्रैक्शनल ज़ूम की सुविधा काम करती है. हालांकि, वेक्टर मैप के लिए फ़्रैक्शनल ज़ूम डिफ़ॉल्ट रूप से चालू होता है और रेस्टर मैप के लिए डिफ़ॉल्ट रूप से बंद होता है. फ़्रैक्शनल ज़ूम को चालू और बंद करने के लिए, isFractionalZoomEnabled मैप विकल्प का इस्तेमाल करें.

यहां दिए गए उदाहरण में, मैप को शुरू करते समय थोड़ा-थोड़ा करके ज़ूम करने की सुविधा चालू करने का तरीका बताया गया है:

map = new google.maps.Map(document.getElementById('map'), {
  center: {lat: -34.397, lng: 150.644},
  zoom: 8,
  isFractionalZoomEnabled: true
});

isFractionalZoomEnabled मैप विकल्प को यहां दिखाए गए तरीके से सेट करके, फ़्रैक्शनल ज़ूम को चालू और बंद भी किया जा सकता है:

// Using map.set
map.set('isFractionalZoomEnabled', true);

// Using map.setOptions
map.setOptions({isFractionalZoomEnabled: true});

फ़्रैक्शनल ज़ूम की सुविधा चालू है या नहीं, यह पता लगाने के लिए किसी लिसनर को सेट किया जा सकता है. यह तब सबसे ज़्यादा काम आता है, जब आपने isFractionalZoomEnabled को true या false पर साफ़ तौर पर सेट न किया हो. यहां दिए गए उदाहरण में, यह जांच की जाती है कि फ़्रैक्शनल ज़ूम चालू है या नहीं:

map.addListener('isfractionalzoomenabled_changed', () => {
  const isFractionalZoomEnabled = map.get('isFractionalZoomEnabled');
  if (isFractionalZoomEnabled === false) {
    console.log('not using fractional zoom');
  } else if (isFractionalZoomEnabled === true) {
    console.log('using fractional zoom');
  } else {
    console.log('map not done initializing yet');
  }
});