Maps JavaScript API ম্যাপের দুটি আলাদা ইমপ্লিমেন্টেশন অফার করে: রাস্টার ও ভেক্টর। র্যাস্টার ম্যাপ, পিক্সেল-ভিত্তিক র্যাস্টার ইমেজ টাইলের গ্রিড হিসেবে ম্যাপ লোড করে, যা Google Maps Platform সার্ভার-সাইড দ্বারা তৈরি করা হয়, তারপর আপনার ওয়েব অ্যাপে পরিবেশন করা হয়। ভেক্টর ম্যাপ ভেক্টর-ভিত্তিক টাইলস দ্বারা গঠিত, যা WebGL ব্যবহার করে ক্লায়েন্ট-সাইডে লোড করার সময় আঁকা হয়, এটি একটি ওয়েব প্রযুক্তি যা ব্রাউজারকে 2D এবং 3D গ্রাফিক্স রেন্ডার করার জন্য ব্যবহারকারীর ডিভাইসে GPU অ্যাক্সেস করতে দেয়।
ভেক্টর ম্যাপ হল সেই একই Google ম্যাপ যা আপনার ব্যবহারকারীরা ব্যবহার করতে অভ্যস্ত এবং ডিফল্ট রাস্টার টাইল ম্যাপের তুলনায় এটি অনেক সুবিধা প্রদান করে, যার মধ্যে সবচেয়ে উল্লেখযোগ্য হল ভেক্টর-ভিত্তিক ছবির শার্পনেস এবং কাছাকাছি জুম লেভেলে 3D বিল্ডিংয়ের সংযোজন। ভেক্টর ম্যাপে এইসব ফিচার কাজ করে:
- প্রোগ্রামাটিক টিল্ট ও হেডিং কন্ট্রোল
- উন্নত ক্যামেরা কন্ট্রোল
- আরও মসৃণভাবে জুম করার জন্য ফ্র্যাকশনাল জুম
divএলিমেন্ট এবং জাভাস্ক্রিপ্ট ব্যবহার করে লোড করা ম্যাপের জন্য, ডিফল্ট রেন্ডারিংয়ের ধরন হলgoogle.maps.RenderingType.RASTER।gmp-mapএলিমেন্ট ব্যবহার করে লোড করা ম্যাপের ক্ষেত্রে, ডিফল্ট রেন্ডারিং টাইপ হলgoogle.maps.RenderingType.VECTOR, যেখানে টিল্ট ও হেডিং কন্ট্রোল চালু করা থাকে।
টিল্ট ও রোটেশন
আপনি ভেক্টর ম্যাপে টিল্ট ও রোটেশন (হেডিং) সেট করতে পারবেন
ম্যাপ শুরু করার সময় heading ও tilt প্রপার্টি অন্তর্ভুক্ত করে এবং
ম্যাপে setTilt ও setHeading পদ্ধতি কল করে। নিম্নলিখিত
উদাহরণটি ম্যাপে কিছু বোতাম যোগ করে যা প্রোগ্রাম্যাটিকভাবে টিল্ট অ্যাডজাস্ট করা
এবং ২০-ডিগ্রি ইনক্রিমেন্টে হেডিং দেখায়।
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;
জাভাস্ক্রিপ্ট
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>
<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()-এ একটি প্যারামিটার থাকে যাতে
আপডেট করার জন্য ক্যামেরার সব প্রপার্টি থাকে। নিচের উদাহরণে দেখানো হয়েছে যে কীভাবে
map.moveCamera() কল করে একসাথে center, zoom, heading ও tilt সেট করা যায়:
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);
ক্যামেরার পজিশন
ম্যাপ ভিউকে এমনভাবে মডেল করা হয়েছে যাতে মনে হয় একটি ক্যামেরা সমতল ভূমির দিকে নিচের দিকে তাকিয়ে আছে। ক্যামেরার পজিশন (এবং সেই কারণে ম্যাপের রেন্ডারিং) নিম্নলিখিত প্রপার্টি দ্বারা নির্দিষ্ট করা হয়: টার্গেট (অক্ষাংশ/দ্রাঘিমাংশ লোকেশন), দিক, টিল্ট, এবং জুম।
টার্গেট (লোকেশন)
ক্যামেরা টার্গেট হল ম্যাপের কেন্দ্রের লোকেশন, যা অক্ষাংশ ও দ্রাঘিমাংশ কোঅর্ডিনেট হিসেবে নির্দিষ্ট করা থাকে।
অক্ষাংশ -৮৫ থেকে ৮৫ ডিগ্রির মধ্যে হতে পারে। এই রেঞ্জের উপরে বা নিচে থাকা ভ্যালু এই রেঞ্জের মধ্যে থাকা সবচেয়ে কাছের ভ্যালুর সাথে ক্ল্যাম্প করা হবে। যেমন, ১০০ অক্ষাংশ উল্লেখ করলে ভ্যালু ৮৫ হিসেবে সেট হবে। দ্রাঘিমাংশ -১৮০ থেকে ১৮০ ডিগ্রির মধ্যে হয়। এই রেঞ্জের উপরে বা নিচের ভ্যালু এমনভাবে র্যাপ করা হবে যাতে সেগুলি (-১৮০, ১৮০) রেঞ্জের মধ্যে পড়ে। যেমন, ৪৮০, ৮৪০ এবং ১২০০ সবই ১২০ ডিগ্রিতে র্যাপ করা হবে।বেয়ারিং (ওরিয়েন্টেশন)
ক্যামেরা বিয়ারিং কম্পাসের দিক নির্দেশ করে, যা ম্যাপের উপরের প্রান্তের সাথে সামঞ্জস্য রেখে প্রকৃত উত্তর দিক থেকে ডিগ্রিতে পরিমাপ করা হয়। আপনি যদি ম্যাপের কেন্দ্র থেকে ম্যাপের উপরের প্রান্ত পর্যন্ত একটি উল্লম্ব রেখা আঁকেন, তাহলে বিয়ারিংটি প্রকৃত উত্তরের সাপেক্ষে ক্যামেরার হেডিংয়ের (ডিগ্রিতে পরিমাপ করা) সাথে সম্পর্কিত।
০ বিয়ারিংয়ের অর্থ হল ম্যাপের উপরের অংশটি প্রকৃত উত্তর দিক নির্দেশ করে। বেয়ারিং ভ্যালু ৯০ মানে ম্যাপের উপরের অংশ পূর্ব দিকে (কম্পাসে ৯০ ডিগ্রি) নির্দেশ করছে। ১৮০ ভ্যালু মানে ম্যাপের উপরের দিকটি দক্ষিণ দিকে নির্দেশ করে।
Maps API আপনাকে ম্যাপের কম্পাস পরিবর্তন করতে দেয়। যেমন, গাড়ি চালানোর সময় চালক প্রায়ই ম্যাপটি ঘুরিয়ে নেন যাতে সেটি তার ভ্রমণের দিকের সাথে সামঞ্জস্যপূর্ণ হয়, আবার হাইকাররা ম্যাপ ও কম্পাস ব্যবহার করার সময় সাধারণত ম্যাপটি এমনভাবে সেট করেন যাতে একটি উল্লম্ব রেখা উত্তর দিক নির্দেশ করে।
টিল্ট (ভিউয়িং অ্যাঙ্গেল)
টিল্ট, ম্যাপের কেন্দ্রবিন্দুর ঠিক উপরে একটি আর্কের উপর ক্যামেরার অবস্থানকে সংজ্ঞায়িত করে, যা নাদির (ক্যামেরার ঠিক নিচে নির্দেশ করা দিক) থেকে ডিগ্রিতে পরিমাপ করা হয়। ০ ভ্যালু থাকলে বুঝতে হবে যে ক্যামেরা সরাসরি নিচের দিকে তাক করা আছে। ০-এর থেকে বেশি মান থাকলে বুঝতে হবে যে ক্যামেরাটি দিগন্তের দিকে নির্দিষ্ট ডিগ্রি কোণে ঝুঁকে আছে। আপনি দেখার অ্যাঙ্গেল পরিবর্তন করলে, ম্যাপটি পার্সপেক্টিভে দেখা যায়, যেখানে দূরের ফিচারগুলি ছোট এবং কাছের ফিচারগুলি বড় দেখায়। নিম্নলিখিত ছবিতে এটি দেখানো হয়েছে।
নিচের ছবিতে, দেখার অ্যাঙ্গেল হল ০ ডিগ্রি। প্রথম ছবিতে এর একটি রেখাচিত্র দেখানো হয়েছে; ১ হল ক্যামেরার পজিশন এবং ২ হল বর্তমান ম্যাপের পজিশন। এর নিচে ম্যাপের ফলাফল দেখানো হয়েছে।
|
|
নিচের ছবিতে, দেখার অ্যাঙ্গেল হল ৪৫ ডিগ্রি। লক্ষ্য করুন যে ক্যামেরাটি মাথার ঠিক উপরে (০ ডিগ্রি) এবং মাটি (৯০ ডিগ্রি)-র মধ্যে একটি বৃত্তচাপের অর্ধেক পথ অতিক্রম করে, ৩ পজিশনে আসে। ক্যামেরা এখনও ম্যাপের কেন্দ্রবিন্দুতে ফোকাস করে আছে, তবে 4 পজিশনে লাইন দ্বারা দেখানো এলাকাটি এখন দেখা যাচ্ছে।
|
|
এই স্ক্রিনশটের ম্যাপটি এখনও আসল ম্যাপের মতো একই পয়েন্টে কেন্দ্র করে আছে, তবে ম্যাপের উপরে আরও ফিচার দেখা যাচ্ছে। আপনি ৪৫ ডিগ্রির বেশি কোণ বাড়ালে, ক্যামেরা এবং ম্যাপের অবস্থানের মধ্যে থাকা ফিচারগুলি আনুপাতিকভাবে বড় দেখায়, যখন ম্যাপের অবস্থানের বাইরের ফিচারগুলি আনুপাতিকভাবে ছোট দেখায়, যার ফলে একটি ত্রিমাত্রিক এফেক্ট তৈরি হয়।
জুম করুন
ক্যামেরার জুম লেভেল ম্যাপের স্কেল নির্ধারণ করে। জুম লেভেল বেশি হলে স্ক্রিনে আরও বেশি বিবরণ দেখা যায়, আবার জুম লেভেল কম হলে স্ক্রিনে পৃথিবীর আরও বেশি অংশ দেখা যায়।
জুম লেভেল পূর্ণসংখ্যা না হলেও চলবে। ম্যাপে অনুমোদিত জুম লেভেলের রেঞ্জ টার্গেট, ম্যাপের ধরন ও স্ক্রিনের সাইজ সহ একাধিক বিষয়ের উপর নির্ভর করে। রেঞ্জের বাইরে থাকা যেকোনও সংখ্যাকে পরবর্তী সবচেয়ে কাছাকাছি সঠিক ভ্যালুতে পরিবর্তন করা হবে, যা সর্বনিম্ন জুম লেভেল বা সর্বোচ্চ জুম লেভেল হতে পারে। নিচের তালিকায় প্রতিটি জুম লেভেলে আপনি আনুমানিক কতটা বিস্তারিত তথ্য দেখতে পাবেন তা দেখানো হয়েছে:
- ১: বিশ্ব
- ৫: স্থলভাগ/মহাদেশ
- ১০: শহর
- ১৫: রাস্তা
- ২০: বিল্ডিং
|
|
|
ফ্র্যাকশনাল জুম
ভেক্টর ম্যাপে ফ্র্যাকশনাল জুমের সুবিধা আছে, যা আপনাকে পূর্ণসংখ্যার পরিবর্তে ভগ্নাংশ মান ব্যবহার করে জুম করতে দেয়। র্যাস্টার ও ভেক্টর ম্যাপ, দুটিতেই ফ্র্যাকশনাল জুম কাজ করলেও, ভেক্টর ম্যাপের ক্ষেত্রে ফ্র্যাকশনাল জুম ডিফল্ট হিসেবে চালু থাকে এবং র্যাস্টার ম্যাপের ক্ষেত্রে ডিফল্ট হিসেবে বন্ধ থাকে। ফ্র্যাকশনাল জুম চালু ও বন্ধ করতে 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');
}
});