১. শুরু করার আগে
গুগল ম্যাপস ব্যবহার করে অ্যাপ তৈরি করলে আপনি আপনার অ্যাপে স্যাটেলাইট চিত্র, ম্যাপের জন্য শক্তিশালী UI কন্ট্রোল, অবস্থান ট্র্যাকিং এবং অবস্থান চিহ্নিতকারী-এর মতো বৈশিষ্ট্য যোগ করতে পারেন। আপনি আপনার নিজস্ব ডেটাসেট থেকে তথ্য দেখিয়ে সাধারণ গুগল ম্যাপসকে আরও উন্নত করতে পারেন, যেমন সুপরিচিত মাছ ধরার বা পর্বতারোহণের জায়গাগুলোর অবস্থান। এছাড়াও আপনি এমন গেম তৈরি করতে পারেন যেখানে খেলোয়াড় বাস্তব জগৎ অন্বেষণ করে, যেমন গুপ্তধন খোঁজার খেলা বা এমনকি অগমেন্টেড রিয়েলিটি গেম।
এই পাঠে, আপনি Wander নামে একটি গুগল ম্যাপস অ্যাপ তৈরি করবেন যা কাস্টমাইজড ম্যাপ প্রদর্শন করে এবং ব্যবহারকারীর অবস্থান দেখায়।
পূর্বশর্ত
নিম্নলিখিত বিষয়ে জ্ঞান থাকা প্রয়োজন:
- অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে কীভাবে একটি সাধারণ অ্যান্ড্রয়েড অ্যাপ তৈরি ও চালানো যায়।
- স্ট্রিং-এর মতো রিসোর্স কীভাবে তৈরি ও পরিচালনা করতে হয়।
- অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে কীভাবে কোড রিফ্যাক্টর করবেন এবং ভেরিয়েবলের নাম পরিবর্তন করবেন।
- একজন ব্যবহারকারী হিসেবে কীভাবে গুগল ম্যাপ ব্যবহার করবেন।
- রানটাইম পারমিশন কীভাবে সেট করবেন।
আপনি যা শিখবেন
- গুগল এপিআই কনসোল থেকে কীভাবে একটি এপিআই কী পাবেন এবং আপনার অ্যাপে কীটি রেজিস্টার করবেন
- আপনার অ্যাপে কীভাবে গুগল ম্যাপ যুক্ত করবেন
- বিভিন্ন ধরণের মানচিত্র কীভাবে প্রদর্শন করবেন
- গুগল ম্যাপ কীভাবে স্টাইল করবেন
- আপনার মানচিত্রে মার্কার যোগ করার উপায়
- ব্যবহারকারীকে আগ্রহের স্থানে (POI) মার্কার স্থাপন করার সুবিধা কীভাবে দেওয়া যায়
- অবস্থান ট্র্যাকিং কীভাবে সক্রিয় করবেন
- কীভাবে The
Wanderঅ্যাপটি তৈরি করবেন, যেটিতে গুগল ম্যাপ এমবেড করা আছে - আপনার অ্যাপের জন্য কীভাবে কাস্টম ফিচার তৈরি করবেন, যেমন মার্কার এবং স্টাইলিং
- আপনার অ্যাপে লোকেশন ট্র্যাকিং কীভাবে চালু করবেন
২. অ্যাপের সংক্ষিপ্ত বিবরণ
এই কোডল্যাবে, আপনি Wander ) অ্যাপটি তৈরি করবেন, যা কাস্টম স্টাইলিং সহ একটি গুগল ম্যাপ প্রদর্শন করে। ওয়ান্ডার অ্যাপটি আপনাকে বিভিন্ন স্থানে মার্কার স্থাপন করতে, ওভারলে যোগ করতে এবং রিয়েল টাইমে আপনার অবস্থান দেখতে দেয়।

৩. কাজ: প্রজেক্টটি সেট আপ করুন এবং একটি এপিআই কী (API Key) সংগ্রহ করুন।
অ্যান্ড্রয়েডের জন্য ম্যাপস এসডিকে-এর জন্য একটি এপিআই কী প্রয়োজন। এপিআই কী পেতে, এপিআই ও সার্ভিসেস পেজে আপনার প্রজেক্টটি রেজিস্টার করুন। এপিআই কী-টি একটি ডিজিটাল সার্টিফিকেটের সাথে সংযুক্ত থাকে, যা অ্যাপটিকে এর লেখকের সাথে যুক্ত করে। ডিজিটাল সার্টিফিকেট ব্যবহার এবং আপনার অ্যাপে স্বাক্ষর করা সম্পর্কে আরও তথ্যের জন্য, আপনার অ্যাপে স্বাক্ষর করুন দেখুন।
এই কোডল্যাবে, আপনি ডিবাগ সার্টিফিকেটের জন্য এপিআই কী ব্যবহার করবেন। ডিবাগ সার্টিফিকেটটি নকশাগতভাবেই অসুরক্ষিত, যেমনটি 'আপনার ডিবাগ বিল্ড সাইন করুন' অংশে বর্ণনা করা হয়েছে। যে সমস্ত প্রকাশিত অ্যান্ড্রয়েড অ্যাপ ' ম্যাপস এসডিকে ফর অ্যান্ড্রয়েড' ব্যবহার করে, সেগুলোর জন্য একটি দ্বিতীয় এপিআই কী প্রয়োজন: সেটি হলো রিলিজ সার্টিফিকেটের জন্য ব্যবহৃত কী। রিলিজ সার্টিফিকেট কীভাবে পেতে হয় সে সম্পর্কে আরও তথ্যের জন্য, 'একটি এপিআই কী পান' দেখুন।
অ্যান্ড্রয়েড স্টুডিওতে একটি গুগল ম্যাপস অ্যাক্টিভিটি টেমপ্লেট অন্তর্ভুক্ত রয়েছে, যা সহায়ক টেমপ্লেট কোড তৈরি করে। এই টেমপ্লেট কোডে একটি google_maps_api.xml ফাইল থাকে, যাতে এমন একটি লিঙ্ক থাকে যা এপিআই কী (API key) পাওয়াকে সহজ করে তোলে।
ধাপ ১: ম্যাপ টেমপ্লেট ব্যবহার করে ওয়ান্ডার প্রজেক্টটি তৈরি করুন।
- একটি নতুন অ্যান্ড্রয়েড স্টুডিও প্রজেক্ট তৈরি করুন।
- গুগল ম্যাপস অ্যাক্টিভিটি টেমপ্লেটটি নির্বাচন করুন।

- প্রকল্পটির নাম
Wander। - সর্বনিম্ন এপিআই লেভেল এপিআই ১৯- এ সেট করুন। ভাষাটি যেন কোটলিন হয়, তা নিশ্চিত করুন।
- শেষ করুন- এ ক্লিক করুন।
- অ্যাপটি তৈরি হয়ে গেলে, আপনার প্রজেক্ট এবং অ্যান্ড্রয়েড স্টুডিও দ্বারা নির্মিত নিম্নলিখিত মানচিত্র-সম্পর্কিত ফাইলগুলি দেখুন:
google_maps_api.xml — আপনার এপিআই কী (API key) রাখার জন্য আপনি এই কনফিগারেশন ফাইলটি ব্যবহার করেন। টেমপ্লেটটি দুটি google_maps_api.xml ফাইল তৈরি করে: একটি ডিবাগ (debug) এবং অন্যটি রিলিজ (release) এর জন্য। ডিবাগ সার্টিফিকেটের এপিআই কী-এর ফাইলটি src/debug/res/values- এ অবস্থিত। রিলিজ সার্টিফিকেটের এপিআই কী-এর ফাইলটি src/release/res/values- এ অবস্থিত। এই কোডল্যাবে, আপনি শুধুমাত্র ডিবাগ সার্টিফিকেটটি ব্যবহার করবেন।
activity_maps.xml — এই লেআউট ফাইলটিতে একটিমাত্র ফ্র্যাগমেন্ট রয়েছে যা পুরো স্ক্রিন জুড়ে থাকে। SupportMapFragment ক্লাসটি Fragment ক্লাসের একটি সাবক্লাস। একটি অ্যাপে ম্যাপ রাখার সবচেয়ে সহজ উপায় হলো SupportMapFragment । এটি ম্যাপের একটি ভিউ-এর র্যাপার, যা প্রয়োজনীয় লাইফসাইকেল চাহিদাগুলো স্বয়ংক্রিয়ভাবে পরিচালনা করে।
আপনি যেকোনো ViewGroup এর মধ্যে একটি <fragment> ট্যাগ এবং একটি অতিরিক্ত name অ্যাট্রিবিউট ব্যবহার করে লেআউট ফাইলে SupportMapFragment অন্তর্ভুক্ত করতে পারেন।
android:name="com.google.android.gms.maps.SupportMapFragment"
MapsActivity.java — MapsActivity.kt ফাইলটি onCreate() মেথডে SupportMapFragment ইনস্ট্যানশিয়েট করে এবং ম্যাপস সিস্টেম ও ভিউ স্বয়ংক্রিয়ভাবে ইনিশিয়ালাইজ করার জন্য ক্লাসটির getMapAsync () ব্যবহার করে। যে অ্যাক্টিভিটিতে SupportMapFragment থাকে, তাকে অবশ্যই OnMapReadyCallback ইন্টারফেস এবং এর onMapReady() মেথডটি ইমপ্লিমেন্ট করতে হবে। ম্যাপ লোড হওয়ার সময় onMapReady() মেথডটি কল করা হয়।
ধাপ ২: এপিআই কী সংগ্রহ করুন।
- google_maps_api.xml ফাইলটির ডিবাগ সংস্করণটি খুলুন।
- ফাইলটিতে একটি দীর্ঘ URL সহ একটি কমেন্ট খুঁজুন। URL-টির প্যারামিটারগুলোতে আপনার অ্যাপ সম্পর্কে নির্দিষ্ট তথ্য রয়েছে।
- URL-টি কপি করে ব্রাউজারে পেস্ট করুন।
- APIs & Services পেজে একটি প্রজেক্ট তৈরি করতে নির্দেশাবলী অনুসরণ করুন। প্রদত্ত URL-এ থাকা প্যারামিটারগুলোর কারণে, পেজটি স্বয়ংক্রিয়ভাবে Android-এর জন্য Maps SDK সক্রিয় করে নেয়।
- API কী তৈরি করুন -এ ক্লিক করুন।
- পরবর্তী পৃষ্ঠায়, API Keys বিভাগে যান এবং আপনার এইমাত্র তৈরি করা কী-টিতে ক্লিক করুন।
- কী-টির ব্যবহার শুধু অ্যান্ড্রয়েড অ্যাপে সীমাবদ্ধ করতে, ‘Restrict Key’-তে ক্লিক করুন এবং ‘Maps SDK for Android’ নির্বাচন করুন।
- তৈরি হওয়া এপিআই কী-টি কপি করুন। এটি '
AIza"দিয়ে শুরু হয়। -
google_maps_api.xmlফাইলে, যেখানেYOUR_KEY_HEREলেখা আছে, সেইgoogle_maps_keyস্ট্রিং-এর মধ্যে কী-টি পেস্ট করুন। - আপনার অ্যাপটি চালান। আপনি আপনার অ্যাক্টিভিটিতে একটি এমবেডেড ম্যাপ দেখতে পাবেন, যেখানে অস্ট্রেলিয়ার সিডনিতে একটি মার্কার সেট করা থাকবে। (সিডনি মার্কারটি টেমপ্লেটের একটি অংশ এবং আপনি এটি পরে পরিবর্তন করতে পারবেন।)

ধাপ ৩: mMap-এর নাম পরিবর্তন করুন
MapsActivity mMap নামে একটি private lateinit var আছে, যার টাইপ হলো GoogleMap । Kotlin-এর নামকরণের নিয়ম অনুসরণ করতে, mMap এর নাম পরিবর্তন করে map ।
-
MapsActivityতে,mMapউপর রাইট-ক্লিক করুন এবং Refactor > Rename...- এ ক্লিক করুন।

- ভেরিয়েবলের নাম পরিবর্তন করে
map।
লক্ষ্য করুন, onMapReady() ফাংশনের মধ্যে mMap এর সমস্ত উল্লেখও map এ পরিবর্তিত হয়ে যায়।
৪. কাজ: মানচিত্রের প্রকারভেদ যোগ করুন
গুগল ম্যাপসে বিভিন্ন ধরনের মানচিত্র রয়েছে: সাধারণ, হাইব্রিড, স্যাটেলাইট, টেরেইন এবং 'নন' (অর্থাৎ কোনো মানচিত্রই নয়)।
|
|
|
|
সাধারণ মানচিত্র | স্যাটেলাইট মানচিত্র | হাইব্রিড মানচিত্র | ভূখণ্ডের মানচিত্র |
প্রতিটি ধরনের মানচিত্র বিভিন্ন ধরণের তথ্য প্রদান করে। উদাহরণস্বরূপ, গাড়িতে দিক নির্ণয়ের জন্য মানচিত্র ব্যবহার করার সময় রাস্তার নাম দেখা সহায়ক হয়, তাই আপনি সাধারণ বিকল্পটি ব্যবহার করতে পারেন। যখন আপনি হাইকিং করেন, তখন চূড়ায় পৌঁছানোর জন্য আপনাকে আর কতটা চড়তে হবে তা নির্ধারণ করতে ভূখণ্ডের মানচিত্রটি সহায়ক হতে পারে।
এই কাজে আপনাকে:
- একটি অপশন মেনুসহ একটি অ্যাপ বার যোগ করুন, যা ব্যবহারকারীকে মানচিত্রের ধরন পরিবর্তন করার সুযোগ দেবে।
- মানচিত্রের শুরুর অবস্থানটি আপনার নিজের বাড়ির অবস্থানে সরিয়ে নিন।
- মার্কারের জন্য সমর্থন যোগ করুন, যা মানচিত্রে একক অবস্থান নির্দেশ করে এবং এতে একটি লেবেলও অন্তর্ভুক্ত থাকতে পারে।
মানচিত্রের প্রকারের জন্য মেনু যোগ করুন
এই ধাপে, আপনি একটি অপশন মেনুসহ একটি অ্যাপ বার যোগ করবেন, যা ব্যবহারকারীকে মানচিত্রের ধরন পরিবর্তন করার সুযোগ দেবে।
- নতুন মেনু XML ফাইল তৈরি করতে, আপনার res ডিরেক্টরিতে রাইট-ক্লিক করুন এবং New > Android Resource File নির্বাচন করুন।
- ডায়ালগ বক্সে ফাইলটির নাম
map_optionsদিন। - রিসোর্স টাইপের জন্য মেনু নির্বাচন করুন।
- OK ক্লিক করুন।
- কোড ট্যাবে, ম্যাপ মেনু অপশনগুলো তৈরি করার জন্য নতুন ফাইলটির কোডটি নিচের কোড দিয়ে প্রতিস্থাপন করুন। 'none' ম্যাপ টাইপটি বাদ দেওয়া হয়েছে, কারণ 'none' ব্যবহার করলে কোনো ম্যাপই দেখা যায় না। এই ধাপে একটি এরর দেখা দেয়, কিন্তু আপনি পরবর্তী ধাপে এর সমাধান করে ফেলবেন।
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/normal_map"
android:title="@string/normal_map"
app:showAsAction="never" />
<item
android:id="@+id/hybrid_map"
android:title="@string/hybrid_map"
app:showAsAction="never" />
<item
android:id="@+id/satellite_map"
android:title="@string/satellite_map"
app:showAsAction="never" />
<item
android:id="@+id/terrain_map"
android:title="@string/terrain_map"
app:showAsAction="never" />
</menu>
- ত্রুটিগুলো সমাধান করার জন্য
strings.xmlফাইলেtitleঅ্যাট্রিবিউটের জন্য রিসোর্স যোগ করুন।
<resources>
...
<string name="normal_map">Normal Map</string>
<string name="hybrid_map">Hybrid Map</string>
<string name="satellite_map">Satellite Map</string>
<string name="terrain_map">Terrain Map</string>
<string name="lat_long_snippet">Lat: %1$.5f, Long: %2$.5f</string>
<string name="dropped_pin">Dropped Pin</string>
<string name="poi">poi</string>
</resources>
-
MapsActivityতে,onCreateOptionsMenu()মেথডটি ওভাররাইড করুন এবংmap_optionsরিসোর্স ফাইল থেকে মেনুটি ইনফ্লেট করুন।
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
val inflater = menuInflater
inflater.inflate(R.menu.map_options, menu)
return true
}
-
MapsActivity.ktফাইলেonOptionsItemSelected()মেথডটি ওভাররাইড করুন। ব্যবহারকারীর নির্বাচন অনুযায়ী ম্যাপ-টাইপ কনস্ট্যান্ট ব্যবহার করে ম্যাপের ধরন পরিবর্তন করুন।
override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
// Change the map type based on the user's selection.
R.id.normal_map -> {
map.mapType = GoogleMap.MAP_TYPE_NORMAL
true
}
R.id.hybrid_map -> {
map.mapType = GoogleMap.MAP_TYPE_HYBRID
true
}
R.id.satellite_map -> {
map.mapType = GoogleMap.MAP_TYPE_SATELLITE
true
}
R.id.terrain_map -> {
map.mapType = GoogleMap.MAP_TYPE_TERRAIN
true
}
else -> super.onOptionsItemSelected(item)
}
- অ্যাপটি চালান।
- ক্লিক করুন
ম্যাপের ধরন পরিবর্তন করতে। লক্ষ্য করুন, বিভিন্ন মোডের মধ্যে ম্যাপের চেহারা কীভাবে বদলে যায়।

৫. কাজ: চিহ্নিতকারী যোগ করুন।
ডিফল্টরূপে, onMapReady() কলব্যাকে এমন কোড অন্তর্ভুক্ত থাকে যা অস্ট্রেলিয়ার সিডনিতে একটি মার্কার স্থাপন করে, যেখানে গুগল ম্যাপস তৈরি করা হয়েছিল। এই ডিফল্ট কলব্যাকটি ম্যাপটিকে সিডনির দিকে প্যান করার জন্য অ্যানিমেটও করে।
এই টাস্কে, আপনাকে ম্যাপের ক্যামেরাটি আপনার বাড়িতে নিয়ে যেতে হবে, আপনার নির্দিষ্ট করা একটি লেভেলে জুম করতে হবে এবং সেখানে একটি মার্কার স্থাপন করতে হবে।
ধাপ ১: আপনার বাড়িতে জুম করুন এবং একটি মার্কার যোগ করুন।
-
MapsActivity.ktফাইলেonMapReady()মেথডটি খুঁজুন। এর ভেতর থেকে সিডনিতে মার্কার স্থাপন এবং ক্যামেরা সরানোর কোডটি মুছে ফেলুন। এখন আপনার মেথডটি দেখতে এইরকম হবে।
override fun onMapReady(googleMap: GoogleMap) {
map = googleMap
}
- এই নির্দেশাবলী অনুসরণ করে আপনার বাড়ির অক্ষাংশ ও দ্রাঘিমাংশ নির্ণয় করুন।
- অক্ষাংশ এবং দ্রাঘিমাংশের জন্য একটি করে মান তৈরি করুন এবং তাদের ফ্লোট মান ইনপুট করুন।
val latitude = 37.422160
val longitude = -122.084270
-
homeLatLngনামে একটি নতুনLatLngঅবজেক্ট তৈরি করুন।homeLatLngঅবজেক্টটিতে, আপনি এইমাত্র তৈরি করা মানগুলো পাস করুন।
val homeLatLng = LatLng(latitude, longitude)
- আপনি ম্যাপে কতটা জুম করতে চান তার জন্য একটি
valতৈরি করুন। জুম লেভেল 15f ব্যবহার করুন।
val zoomLevel = 15f
জুম লেভেল নিয়ন্ত্রণ করে আপনি ম্যাপে কতটা জুম ইন করবেন। নিচের তালিকাটি আপনাকে একটি ধারণা দেবে যে, জুমের প্রতিটি লেভেল কী পরিমাণ বিস্তারিত তথ্য দেখায়:
-
1: বিশ্ব -
5: ভূখণ্ড/মহাদেশ -
10: শহর -
15: রাস্তা -
20: ভবন
-
mapঅবজেক্টেরmoveCamera()ফাংশনটি কল করে ক্যামেরাটিকেhomeLatLngসরান এবংCameraUpdateFactory.newLatLngZoom()ব্যবহার করে একটিCameraUpdateঅবজেক্ট পাস করুন।homeLatLngঅবজেক্ট এবংzoomLevelপাস করুন।
map.moveCamera(CameraUpdateFactory.newLatLngZoom(homeLatLng, zoomLevel))
- মানচিত্রে
homeLatLngএ একটি মার্কার যোগ করুন।
map.addMarker(MarkerOptions().position(homeLatLng))
আপনার চূড়ান্ত পদ্ধতিটি দেখতে এইরকম হবে:
override fun onMapReady(googleMap: GoogleMap) {
map = googleMap
//These coordinates represent the latitude and longitude of the Googleplex.
val latitude = 37.422160
val longitude = -122.084270
val zoomLevel = 15f
val homeLatLng = LatLng(latitude, longitude)
map.moveCamera(CameraUpdateFactory.newLatLngZoom(homeLatLng, zoomLevel))
map.addMarker(MarkerOptions().position(homeLatLng))
}
- আপনার অ্যাপটি চালান। ম্যাপটি আপনার বাড়ির দিকে প্যান করবে, কাঙ্ক্ষিত লেভেলে জুম করবে এবং আপনার বাড়ির উপর একটি মার্কার স্থাপন করবে।

ধাপ ২: ব্যবহারকারীদের লং ক্লিক ব্যবহার করে মার্কার যোগ করার অনুমতি দিন।
এই ধাপে, ব্যবহারকারী যখন মানচিত্রের কোনো একটি স্থান স্পর্শ করে ধরে রাখবে, তখন একটি মার্কার যুক্ত হবে।
-
MapsActivityতেsetMapLongClick()নামে একটি মেথড স্টাব তৈরি করুন যা আর্গুমেন্ট হিসেবে একটিGoogleMapগ্রহণ করবে। - ম্যাপ অবজেক্টে একটি
setOnMapLongClickListenerলিসেনার সংযুক্ত করুন।
private fun setMapLongClick(map:GoogleMap) {
map.setOnMapLongClickListener { }
}
-
setOnMapLongClickListener()-এর মধ্যেaddMarker()মেথডটি কল করুন। একটি নতুনMarkerOptionsঅবজেক্ট পাস করুন, যার পজিশনটি পাস করাLatLngএ সেট করা থাকবে।
private fun setMapLongClick(map: GoogleMap) {
map.setOnMapLongClickListener { latLng ->
map.addMarker(
MarkerOptions()
.position(latLng)
)
}
}
-
onMapReady()মেথডের শেষে,mapসহsetMapLongClick()কল করুন।
override fun onMapReady(googleMap: GoogleMap) {
...
setMapLongClick(map)
}
- আপনার অ্যাপটি চালান।
- কোনো স্থানে মার্কার স্থাপন করতে মানচিত্রটি স্পর্শ করে ধরে রাখুন।
- মার্কারটিতে ট্যাপ করুন, যা এটিকে স্ক্রিনের কেন্দ্রে নিয়ে আসবে।

ধাপ ৩: মার্কারটির জন্য একটি তথ্য উইন্ডো যোগ করুন।
এই ধাপে, আপনি একটি InfoWindow যোগ করবেন যা মার্কারটিতে ট্যাপ করা হলে সেটির স্থানাঙ্ক প্রদর্শন করবে।
-
setMapLongClick()setOnMapLongClickListener()-এর মধ্যে,snippetএর জন্য একটিvalতৈরি করুন। snippet হলো শিরোনামের পরে প্রদর্শিত অতিরিক্ত লেখা। আপনার snippet একটি মার্কারের অক্ষাংশ এবং দ্রাঘিমাংশ প্রদর্শন করে।
private fun setMapLongClick(map: GoogleMap) {
map.setOnMapLongClickListener { latLng ->
// A snippet is additional text that's displayed after the title.
val snippet = String.format(
Locale.getDefault(),
"Lat: %1$.5f, Long: %2$.5f",
latLng.latitude,
latLng.longitude
)
map.addMarker(
MarkerOptions()
.position(latLng)
)
}
}
-
addMarker()ফাংশনে,R.string.স্ট্রিং রিসোর্স ব্যবহার করে মার্কারেরtitledropped_pinDropped Pin' হিসেবে সেট করুন। - মার্কারের
snippetsnippet-এ সেট করুন।
সম্পূর্ণ ফাংশনটি দেখতে এইরকম:
private fun setMapLongClick(map: GoogleMap) {
map.setOnMapLongClickListener { latLng ->
// A Snippet is Additional text that's displayed below the title.
val snippet = String.format(
Locale.getDefault(),
"Lat: %1$.5f, Long: %2$.5f",
latLng.latitude,
latLng.longitude
)
map.addMarker(
MarkerOptions()
.position(latLng)
.title(getString(R.string.dropped_pin))
.snippet(snippet)
)
}
}
- আপনার অ্যাপটি চালান।
- অবস্থান চিহ্নিতকারী স্থাপন করতে মানচিত্রটি স্পর্শ করে ধরে রাখুন।
- তথ্য উইন্ডোটি দেখানোর জন্য মার্কারটিতে ট্যাপ করুন।

ধাপ ৪: POI লিসেনার যোগ করুন
ডিফল্টরূপে, আগ্রহের স্থান (POI) তাদের সংশ্লিষ্ট আইকনসহ মানচিত্রে প্রদর্শিত হয়। POI-এর মধ্যে পার্ক, স্কুল, সরকারি ভবন এবং আরও অনেক কিছু অন্তর্ভুক্ত। যখন মানচিত্রের ধরন normal (normal) হিসেবে সেট করা থাকে, তখন ব্যবসায়িক POI-গুলোও মানচিত্রে প্রদর্শিত হয়। ব্যবসায়িক POI-গুলো দোকান, রেস্তোরাঁ এবং হোটেলের মতো ব্যবসা প্রতিষ্ঠানকে বোঝায়।
এই ধাপে, আপনি ম্যাপে একটি GoogleMap.OnPoiClickListener যোগ করবেন। ব্যবহারকারী কোনো POI-তে ক্লিক করার সাথে সাথেই এই ক্লিক লিসেনারটি ম্যাপে একটি মার্কার স্থাপন করে। ক্লিক লিসেনারটি একটি তথ্য উইন্ডোও প্রদর্শন করে, যাতে POI-এর নামটি থাকে।
-
MapsActivityতেsetPoiClick()নামে একটি মেথড স্টাব তৈরি করুন যা আর্গুমেন্ট হিসেবে একটিGoogleMapগ্রহণ করবে। -
setPoiClick()মেথডের মধ্যে, পাস-ইন করাGoogleMapটিতে একটিOnPoiClickListenerসেট করুন।
private fun setPoiClick(map: GoogleMap) {
map.setOnPoiClickListener { poi ->
}
}
-
setOnPoiClickListener()এর মধ্যে, মার্কারটির জন্য একটিval poiMarkerতৈরি করুন। -
map.addMarker()ব্যবহার করে এটিকে একটি মার্কার হিসেবে সেট করুন এবংMarkerOptionsঅধীনেtitleকে POI-এর নামে সেট করুন।
private fun setPoiClick(map: GoogleMap) {
map.setOnPoiClickListener { poi ->
val poiMarker = map.addMarker(
MarkerOptions()
.position(poi.latLng)
.title(poi.name)
)
}
}
-
setOnPoiClickListener()ফাংশনের মধ্যে, তথ্য উইন্ডোটি অবিলম্বে দেখানোর জন্যpoiMarkerউপরshowInfoWindow()কল করুন।
poiMarker.showInfoWindow()
setPoiClick() ফাংশনের জন্য আপনার চূড়ান্ত কোডটি দেখতে এইরকম হবে।
private fun setPoiClick(map: GoogleMap) {
map.setOnPoiClickListener { poi ->
val poiMarker = map.addMarker(
MarkerOptions()
.position(poi.latLng)
.title(poi.name)
)
poiMarker.showInfoWindow()
}
}
-
onMapReady()এর শেষে,setPoiClick()কল করুন এবংmapপাস করুন।
override fun onMapReady(googleMap: GoogleMap) {
...
setPoiClick(map)
}
- আপনার অ্যাপটি চালান এবং একটি আকর্ষণীয় স্থান (POI) খুঁজুন, যেমন একটি পার্ক বা কফি শপ।
- POI-টির উপর একটি মার্কার স্থাপন করতে এবং একটি তথ্য উইন্ডোতে POI-টির নাম প্রদর্শন করতে সেটিতে ট্যাপ করুন।

৬. কাজ: আপনার মানচিত্রটি শৈলীমণ্ডিত করুন।
আপনি গুগল ম্যাপসকে নানাভাবে কাস্টমাইজ করতে পারেন, যা আপনার ম্যাপকে একটি অনন্য রূপ ও অনুভূতি দেবে।
অন্যান্য ফ্র্যাগমেন্টের মতোই, আপনি উপলব্ধ XML অ্যাট্রিবিউটগুলো ব্যবহার করে একটি MapFragment অবজেক্ট কাস্টমাইজ করতে পারেন। তবে, এই ধাপে, আপনি GoogleMap অবজেক্টের মেথডগুলো ব্যবহার করে MapFragment এর কন্টেন্টের বাহ্যিক রূপ ও অনুভূতি কাস্টমাইজ করবেন।
আপনার ম্যাপের জন্য একটি কাস্টমাইজড স্টাইল তৈরি করতে, আপনাকে একটি JSON ফাইল জেনারেট করতে হয়, যা নির্দিষ্ট করে দেয় ম্যাপের ফিচারগুলো কীভাবে প্রদর্শিত হবে। এই JSON ফাইলটি আপনাকে নিজে হাতে তৈরি করতে হবে না। গুগল ‘ম্যাপস প্ল্যাটফর্ম স্টাইলিং উইজার্ড’ প্রদান করে, যা আপনার ম্যাপকে দৃশ্যত স্টাইল করার পর আপনার জন্য JSON ফাইলটি তৈরি করে দেয়। এই টাস্কে, আপনি ম্যাপটিকে একটি রেট্রো থিমে স্টাইল করবেন, যার অর্থ হলো ম্যাপটিতে ভিন্টেজ রঙ ব্যবহার করা হবে এবং আপনি রঙিন রাস্তা যুক্ত করবেন।
ধাপ ১: আপনার ম্যাপের জন্য একটি স্টাইল তৈরি করুন।
- আপনার ব্রাউজারে https://mapstyle.withgoogle.com/ -এ যান।
- স্টাইল তৈরি করুন নির্বাচন করুন।
- রেট্রো নির্বাচন করুন।

- আরও বিকল্পগুলিতে ক্লিক করুন।

- রাস্তা নির্বাচন করুন > পূরণ করুন ।
- রাস্তাগুলোর রঙ আপনার পছন্দমতো যেকোনো রঙে (যেমন গোলাপি) পরিবর্তন করুন।

- শেষ করুন- এ ক্লিক করুন।

- প্রদর্শিত ডায়ালগ বক্স থেকে JSON কোডটি কপি করুন এবং চাইলে, পরবর্তী ধাপে ব্যবহারের জন্য এটি একটি প্লেইন টেক্সট নোটে সংরক্ষণ করে রাখতে পারেন।

ধাপ ২: আপনার ম্যাপে স্টাইলটি যোগ করুন
- অ্যান্ড্রয়েড স্টুডিওতে,
resডিরেক্টরির ভিতরেrawনামে একটি `resource` ডিরেক্টরি তৈরি করুন। আপনিrawডিরেক্টরির রিসোর্সগুলো JSON কোডের মতো ব্যবহার করতে পারেন। -
res/rawফোল্ডারেmap_style.jsonনামে একটি ফাইল তৈরি করুন। - আপনার সংরক্ষিত JSON কোডটি নতুন রিসোর্স ফাইলে পেস্ট করুন।
-
MapsActivityতে,onCreate()মেথডের উপরে একটিTAGক্লাস ভেরিয়েবল তৈরি করুন। এটি লগিংয়ের উদ্দেশ্যে ব্যবহৃত হয়।
private val TAG = MapsActivity::class.java.simpleName
- এছাড়াও
MapsActivityতে একটিsetMapStyle()ফাংশন তৈরি করুন, যা একটিGoogleMapগ্রহণ করবে। -
setMapStyle()এর মধ্যে একটিtry{}ব্লক যোগ করুন। -
try{}ব্লকের ভেতরে, স্টাইলিং সফল হওয়ার জন্য একটিval successতৈরি করুন। (নিচের ক্যাচ ব্লকটি যোগ করুন।) -
try{}ব্লকের মধ্যে, ম্যাপের জন্য JSON স্টাইল সেট করতেGoogleMapঅবজেক্টের উপরsetMapStyle()কল করুন। একটিMapStyleOptionsঅবজেক্ট পাস করুন, যা JSON ফাইলটি লোড করে। - ফলাফলটি
successএ নির্ধারণ করুন।setMapStyle()মেথডটি একটি বুলিয়ান রিটার্ন করে, যা স্টাইলিং ফাইল পার্স করা এবং স্টাইল সেট করার সফলতার অবস্থা নির্দেশ করে।
private fun setMapStyle(map: GoogleMap) {
try {
// Customize the styling of the base map using a JSON object defined
// in a raw resource file.
val success = map.setMapStyle(
MapStyleOptions.loadRawResourceStyle(
this,
R.raw.map_style
)
)
}
}
successমিথ্যা হলে একটি if স্টেটমেন্ট যোগ করুন। স্টাইলিং অসফল হলে, পার্সিং ব্যর্থ হয়েছে জানিয়ে একটি লগ প্রিন্ট করুন।
private fun setMapStyle(map: GoogleMap) {
try {
...
if (!success) {
Log.e(TAG, "Style parsing failed.")
}
}
}
- স্টাইল ফাইল অনুপস্থিত থাকার পরিস্থিতি সামাল দিতে একটি
catch{}ব্লক যোগ করুন।catchব্লকের ভেতরে, যদি ফাইলটি লোড করা না যায়, তাহলে একটিResources.NotFoundExceptionথ্রো করুন।
private fun setMapStyle(map: GoogleMap) {
try {
...
} catch (e: Resources.NotFoundException) {
Log.e(TAG, "Can't find style. Error: ", e)
}
}
সম্পূর্ণ পদ্ধতিটি নিম্নলিখিত কোড স্নিপেটের মতো দেখতে হবে:
private fun setMapStyle(map: GoogleMap) {
try {
// Customize the styling of the base map using a JSON object defined
// in a raw resource file.
val success = map.setMapStyle(
MapStyleOptions.loadRawResourceStyle(
this,
R.raw.map_style
)
)
if (!success) {
Log.e(TAG, "Style parsing failed.")
}
} catch (e: Resources.NotFoundException) {
Log.e(TAG, "Can't find style. Error: ", e)
}
}
- অবশেষে,
onMapReady()মেথডের মধ্যে আপনারGoogleMapঅবজেক্টটি পাস করেsetMapStyle()মেথডটি কল করুন।
override fun onMapReady(googleMap: GoogleMap) {
...
setMapStyle(map)
}
- আপনার অ্যাপটি চালান।
- ম্যাপটিকে
normalমোডে সেট করুন এবং রেট্রো থিমিং ও আপনার পছন্দের রঙের রাস্তা সহ নতুন স্টাইলিংটি দৃশ্যমান হবে।

ধাপ ৩: আপনার মার্কারটি স্টাইল করুন।
আপনি ম্যাপ মার্কারগুলোকে স্টাইল করার মাধ্যমে আপনার ম্যাপকে আরও ব্যক্তিগত রূপ দিতে পারেন। এই ধাপে, আপনি ডিফল্ট লাল মার্কারগুলোকে আরও আকর্ষণীয় কিছুতে পরিবর্তন করবেন।
- ডিফল্ট মার্কার ব্যবহার করার পাশাপাশি এর রঙ নীল করে দিতে,
onMapLongClick()মেথডের কনস্ট্রাক্টরেরMarkerOptions()অংশে নিম্নলিখিত কোড লাইনটি যোগ করুন।
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))
এখন onMapLongClickListener() দেখতে এইরকম:
map.setOnMapLongClickListener { latLng ->
// A snippet is additional text that's displayed after the title.
val snippet = String.format(
Locale.getDefault(),
"Lat: %1$.5f, Long: %2$.5f",
latLng.latitude,
latLng.longitude
)
map.addMarker(
MarkerOptions()
.position(latLng)
.title(getString(R.string.dropped_pin))
.snippet(snippet)
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))
)
}
- অ্যাপটি চালান। লং ক্লিক করার পর যে মার্কারগুলো দেখা যায়, সেগুলো এখন নীল রঙে শেড করা। লক্ষ্য করুন যে POI মার্কারগুলো এখনও লাল, কারণ আপনি
onPoiClick()মেথডে কোনো স্টাইলিং যোগ করেননি।

৭. কাজ: একটি ওভারলে যোগ করুন
গুগল ম্যাপকে নিজের মতো করে সাজানোর একটি উপায় হলো এর উপরে আঁকাআঁকি করা। এই কৌশলটি তখন কাজে আসে যখন আপনি কোনো বিশেষ ধরনের স্থান, যেমন জনপ্রিয় মাছ ধরার জায়গা, তুলে ধরতে চান।
- আকৃতি: আপনি মানচিত্রে পলিলাইন , বহুভুজ এবং বৃত্ত যোগ করতে পারেন।
-
GroundOverlayঅবজেক্ট: গ্রাউন্ডওভারলে হলো একটি ছবি যা একটি মানচিত্রে স্থির থাকে। মার্কারের মতো নয়, গ্রাউন্ডওভারলে স্ক্রিনের পরিবর্তে পৃথিবীর পৃষ্ঠের দিকে অভিমুখী থাকে। মানচিত্র ঘোরানো, কাত করা বা জুম করার মাধ্যমে ছবিটির অভিমুখ পরিবর্তিত হয়। যখন আপনি মানচিত্রের কোনো একটি নির্দিষ্ট স্থানে একটিমাত্র ছবি স্থির রাখতে চান, তখন গ্রাউন্ডওভারলে বেশ কার্যকর।
ধাপ: একটি গ্রাউন্ড ওভারলে যোগ করুন
এই টাস্কে, আপনাকে আপনার হোম লোকেশনে একটি অ্যান্ড্রয়েডের আকৃতির গ্রাউন্ড ওভারলে যোগ করতে হবে।
- এই অ্যান্ড্রয়েড ছবিটি ডাউনলোড করে আপনার
res/drawableফোল্ডারে সংরক্ষণ করুন। (নিশ্চিত করুন যে ফাইলের নামandroid.pngহয়।)

-
onMapReady()ফাংশনে, ক্যামেরাটিকে আপনার বাড়ির অবস্থানে সরানোর কলের পরে, একটিGroundOverlayOptionsঅবজেক্ট তৈরি করুন। - অবজেক্টটিকে
androidOverlayনামক একটি ভেরিয়েবলে অ্যাসাইন করুন।
val androidOverlay = GroundOverlayOptions()
- ডাউনলোড করা ইমেজ রিসোর্স থেকে একটি
BitmapDescriptorঅবজেক্ট তৈরি করতেBitmapDescriptorFactory.fromResource()মেথডটি ব্যবহার করুন। - প্রাপ্ত
BitmapDescriptorঅবজেক্টটিGroundOverlayOptionsঅবজেক্টেরimage()মেথডে পাস করুন।
val androidOverlay = GroundOverlayOptions()
.image(BitmapDescriptorFactory.fromResource(R.drawable.android))
- কাঙ্ক্ষিত ওভারলেটির প্রস্থ মিটারে নির্ধারণ করার জন্য একটি
float overlaySizeতৈরি করুন। এই উদাহরণটির জন্য,100fপ্রস্থটি ভালোভাবে কাজ করে।
GroundOverlayOptions অবজেক্টের position() মেথডটি কল করে position প্রপার্টি সেট করুন এবং এর সাথে homeLatLng অবজেক্ট ও overlaySize পাস করুন।
val overlaySize = 100f
val androidOverlay = GroundOverlayOptions()
.image(BitmapDescriptorFactory.fromResource(R.drawable.android))
.position(homeLatLng, overlaySize)
-
GoogleMapঅবজেক্টেaddGroundOverlay()কল করুন এবং আপনারGroundOverlayOptionsঅবজেক্টটি পাস করুন।
map.addGroundOverlay(androidOverlay)
- অ্যাপটি চালান।
- অ্যান্ড্রয়েড ছবিটি ওভারলে হিসেবে দেখতে
zoomLevelএর মান 18f-এ পরিবর্তন করুন।

৮. কাজ: অবস্থান ট্র্যাকিং সক্রিয় করুন
ব্যবহারকারীরা প্রায়শই তাদের বর্তমান অবস্থান দেখতে গুগল ম্যাপস ব্যবহার করেন। আপনার ম্যাপে ডিভাইসের অবস্থান প্রদর্শন করতে, আপনি লোকেশন-ডেটা লেয়ার ব্যবহার করতে পারেন।
অবস্থান-তথ্য স্তরটি মানচিত্রে 'আমার অবস্থান' আইকন যোগ করে।

ব্যবহারকারী যখন বাটনটিতে ট্যাপ করেন, তখন ম্যাপটি ডিভাইসটির অবস্থানে কেন্দ্রীভূত হয়। ডিভাইসটি স্থির থাকলে অবস্থানটি একটি নীল বিন্দু হিসেবে এবং চলমান থাকলে একটি নীল শেভরন হিসেবে দেখানো হয়।
এই টাস্কে, আপনি লোকেশন-ডেটা লেয়ারটি সক্রিয় করবেন।
ধাপ: অবস্থানের অনুমতির জন্য অনুরোধ করুন
গুগল ম্যাপসে লোকেশন ট্র্যাকিং চালু করতে মাত্র এক লাইনের কোড প্রয়োজন। তবে, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে ব্যবহারকারী লোকেশনের অনুমতি দিয়েছেন (রানটাইম-পারমিশন মডেল ব্যবহার করে)।
এই ধাপে, আপনি অবস্থানের অনুমতি চেয়ে লোকেশন ট্র্যাকিং চালু করবেন।
-
AndroidManifest.xmlফাইলে, যাচাই করুন যেFINE_LOCATIONপারমিশনটি আগে থেকেই উপস্থিত আছে। আপনি যখন গুগল ম্যাপস টেমপ্লেটটি নির্বাচন করেছিলেন, তখন অ্যান্ড্রয়েড স্টুডিও এই পারমিশনটি যুক্ত করে দিয়েছে।
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
-
MapsActivityতেREQUEST_LOCATION_PERMISSIONনামে একটি ক্লাস ভেরিয়েবল তৈরি করুন।
private val REQUEST_LOCATION_PERMISSION = 1
- অনুমতি দেওয়া হয়েছে কিনা তা পরীক্ষা করার জন্য,
MapsActivityতেisPermissionGranted()নামে একটি মেথড তৈরি করুন। এই মেথডের মধ্যে, ব্যবহারকারী অনুমতি দিয়েছেন কিনা তা যাচাই করুন।
private fun isPermissionGranted() : Boolean {
return ContextCompat.checkSelfPermission(
this,
Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
}
- আপনার অ্যাপে লোকেশন ট্র্যাকিং চালু করতে,
MapsActivityতেenableMyLocation()নামে একটি মেথড তৈরি করুন যা কোনো আর্গুমেন্ট গ্রহণ করবে না এবং কিছু রিটার্ন করবে না। এর ভেতরে,ACCESS_FINE_LOCATIONপারমিশনটি আছে কিনা তা পরীক্ষা করুন। যদি পারমিশনটি দেওয়া থাকে, তাহলে লোকেশন লেয়ারটি চালু করুন। অন্যথায়, পারমিশনের জন্য অনুরোধ করুন।
private fun enableMyLocation() {
if (isPermissionGranted()) {
map.isMyLocationEnabled = true
}
else {
ActivityCompat.requestPermissions(
this,
arrayOf<String>(Manifest.permission.ACCESS_FINE_LOCATION),
REQUEST_LOCATION_PERMISSION
)
}
}
- লোকেশন লেয়ারটি সক্রিয় করতে
onMapReady()কলব্যাক থেকেenableMyLocation()কল করুন।
override fun onMapReady(googleMap: GoogleMap) {
...
enableMyLocation()
}
-
onRequestPermissionsResult()মেথডটি ওভাররাইড করুন।requestCodeটিREQUEST_LOCATION_PERMISSIONএর সমান কি না, তা পরীক্ষা করুন। যদি তা হয়, তার মানে হলো অনুমতিটি মঞ্জুর করা হয়েছে। অনুমতি মঞ্জুর করা হলে,grantResultsঅ্যারের প্রথম স্লটেPackageManager.PERMISSION_GRANTEDআছে কি না, তাও পরীক্ষা করুন। যদি সেটি সত্য হয়, তাহলেenableMyLocation()কল করুন।
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<String>,
grantResults: IntArray) {
if (requestCode == REQUEST_LOCATION_PERMISSION) {
if (grantResults.contains(PackageManager.PERMISSION_GRANTED)) {
enableMyLocation()
}
}
}
- আপনার অ্যাপটি চালান। ডিভাইসের লোকেশন অ্যাক্সেস করার জন্য একটি ডায়ালগ বক্স আসবে। অনুমতি দিন।

মানচিত্রটি এখন একটি নীল বিন্দু ব্যবহার করে ডিভাইসটির বর্তমান অবস্থান দেখাচ্ছে। লক্ষ্য করুন, এখানে একটি অবস্থান বাটন আছে। আপনি যদি মানচিত্রটি আপনার অবস্থান থেকে সরিয়ে এই বাটনটিতে ক্লিক করেন, তবে এটি মানচিত্রটিকে ডিভাইসটির অবস্থানে পুনরায় কেন্দ্রে নিয়ে আসবে।

৯. সমাধান কোড
সম্পূর্ণ কোডল্যাবটির কোড ডাউনলোড করুন।
$ git clone https://github.com/googlecodelabs/android-kotlin-geo-maps
বিকল্পভাবে, আপনি রিপোজিটরিটি একটি জিপ ফাইল হিসেবে ডাউনলোড করে, সেটিকে আনজিপ করে অ্যান্ড্রয়েড স্টুডিওতে খুলতে পারেন।
১০. সারসংক্ষেপ
অভিনন্দন! আপনি একটি অ্যান্ড্রয়েড কোটলিন অ্যাপে গুগল ম্যাপ যুক্ত করেছেন এবং সেটিকে স্টাইল করেছেন।
১১. আরও জানুন
অ্যান্ড্রয়েড ডেভেলপার ডকুমেন্টেশন:
- শুরু করুন
- মার্কার সহ একটি মানচিত্র যোগ করা
- মানচিত্রের বস্তু
- স্টাইল করা মানচিত্র যোগ করা
- রাস্তার দৃশ্য
- গ্রাউন্ড ওভারলে
রেফারেন্স ডকুমেন্টেশন:
১২. পরবর্তী কোডল্যাব
এই কোর্সের অন্যান্য কোডল্যাবের লিঙ্কের জন্য, “ Advanced Android in Kotlin codelabs” ল্যান্ডিং পৃষ্ঠাটি দেখুন।



