Google Maps Android Heatmap Utility

প্ল্যাটফর্ম বেছে নিন: Android iOS

ম্যাপে ডেটা পয়েন্টের ডিস্ট্রিবিউশন ও ঘনত্ব দেখানোর জন্য হিটম্যাপ উপযোগী।

ভূমিকা

Maps SDK for Android Utility Library-তে হিটম্যাপ ইউটিলিটি অন্তর্ভুক্ত থাকে, যা আপনি নিজের অ্যাপ্লিকেশনে Google ম্যাপে এক বা একাধিক হিটম্যাপ যোগ করতে ব্যবহার করতে পারেন।

এই ভিডিওতে মার্কারের বিকল্প হিসেবে হিটম্যাপের ব্যবহার নিয়ে আলোচনা করা হয়েছে, যখন আপনার ডেটার জন্য ম্যাপে অনেক ডেটা পয়েন্টের প্রয়োজন হয়।

হিটম্যাপের সাহায্যে দর্শকরা ম্যাপে ডেটা পয়েন্টের ডিস্ট্রিবিউশন ও আপেক্ষিক তীব্রতা সহজেই বুঝতে পারেন। প্রতিটি লোকেশনে মার্কার দেখানোর পরিবর্তে, হিটম্যাপ ডেটার ডিস্ট্রিবিউশন দেখানোর জন্য রঙ ব্যবহার করে।

নিচের উদাহরণে, লাল রঙ দিয়ে অস্ট্রেলিয়ার ভিক্টোরিয়াতে পুলিশ স্টেশনের ঘনত্ব বেশি এমন এলাকা দেখানো হয়েছে।

থানাগুলির লোকেশন দেখানো হিটম্যাপ সহ ম্যাপ
ম্যাপে হিটম্যাপ

আপনি এখনও Android-এর জন্য Maps SDK-এর ইউটিলিটি লাইব্রেরি সেট-আপ না করে থাকলে, এই পৃষ্ঠার বাকি অংশ পড়ার আগে সেট-আপ গাইড ফলো করুন।

একটি সাধারণ হিটম্যাপ যোগ করুন

আপনার ম্যাপে হিটম্যাপ যোগ করতে, আপনাকে এমন একটি ডেটাসেট লাগবে যাতে আগ্রহের প্রতিটি লোকেশনের কোঅর্ডিনেট থাকে। প্রথমে একটি HeatmapTileProvider তৈরি করুন, LatLng অবজেক্টের সংগ্রহ এতে পাস করুন। তারপর একটি নতুন TileOverlay তৈরি করুন, এটিকে হিটম্যাপ টাইল প্রোভাইডারে পাস করুন এবং ম্যাপে টাইল ওভারলে যোগ করুন।

ইউটিলিটি HeatmapTileProvider ক্লাস সরবরাহ করে, যা হিটম্যাপের জন্য টাইল ইমেজ সরবরাহ করতে TileProvider ইন্টারফেস প্রয়োগ করে। HeatmapTileProvider LatLng অবজেক্টের (বা WeightedLatLng অবজেক্টের, নিচে বর্ণিত) সংগ্রহ গ্রহণ করে। এটি ব্যাসার্ধ, গ্রেডিয়েন্ট এবং অস্বচ্ছতা বিকল্পের উপর ভিত্তি করে বিভিন্ন জুম লেভেলের জন্য টাইল ছবি তৈরি করে। আপনি এইসব বিকল্পের জন্য ডিফল্ট ভ্যালু পরিবর্তন করতে পারবেন।

ধাপগুলি আরও বিস্তারিতভাবে দেখা যাক:

  1. নতুন HeatmapTileProvider যোগ করতে, LatLng অবজেক্টের সংগ্রহ পাস করে, HeatmapTileProvider.Builder() ব্যবহার করুন।
  2. প্রাসঙ্গিক বিকল্প সহ একটি নতুন TileOverlayOptions অবজেক্ট তৈরি করুন, যার মধ্যে HeatmapTileProvider অন্তর্ভুক্ত।
  3. ম্যাপে ওভারলে যোগ করতে GoogleMap.addTileOverlay() কল করুন।

Kotlin

var latLngs: List<LatLng?>? = null

// Get the data: latitude/longitude positions of police stations.
try {
    latLngs = readItems(R.raw.police_stations)
} catch (e: JSONException) {
    Toast.makeText(context, "Problem reading list of locations.", Toast.LENGTH_LONG).show()
}

// Create a heat map tile provider, passing it the latlngs of the police stations.
val provider = HeatmapTileProvider.Builder()
    .data(latLngs?.filterNotNull() ?: emptyList())
    .build()

// Add a tile overlay to the map, using the heat map tile provider.
val overlay = map.addTileOverlay(TileOverlayOptions().tileProvider(provider))
map.moveCamera(com.google.android.gms.maps.CameraUpdateFactory.newLatLngZoom(com.google.android.gms.maps.model.LatLng(-37.8136, 144.9631), 10f))

      

Java

List<LatLng> latLngs = new ArrayList<>();

// Get the data: latitude/longitude positions of police stations.
try {
    latLngs = readItems(R.raw.police_stations);
} catch (JSONException e) {
    Toast.makeText(context, "Problem reading list of locations.", Toast.LENGTH_LONG).show();
}

// Create a heat map tile provider, passing it the latlngs of the police stations.
HeatmapTileProvider provider = new HeatmapTileProvider.Builder()
    .data(latLngs)
    .build();

// Add a tile overlay to the map, using the heat map tile provider.
TileOverlay overlay = map.addTileOverlay(new TileOverlayOptions().tileProvider(provider));
map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(-37.8136, 144.9631), 10f));

      

এই উদাহরণের জন্য, ডেটা JSON ফাইলে স্টোর করা হয়, police_stations.json। ফাইল থেকে নেওয়া অংশ এখানে দেওয়া হল:

[
{"lat" : -37.1886, "lng" : 145.708 } ,
{"lat" : -37.8361, "lng" : 144.845 } ,
{"lat" : -38.4034, "lng" : 144.192 } ,
{"lat" : -38.7597, "lng" : 143.67 } ,
{"lat" : -36.9672, "lng" : 141.083 }
]

ওয়েটেড অক্ষাংশ/দ্রাঘিমাংশ পয়েন্ট ব্যবহার করা

HeatmapTileProvider তৈরি করার সময়, আপনি এতে ওয়েটেড অক্ষাংশ/দ্রাঘিমাংশ স্থানাঙ্কের একটি সংগ্রহ পাস করতে পারেন। আপনি যদি নির্দিষ্ট কিছু লোকেশনের গুরুত্ব তুলে ধরতে চান, তাহলে এটি সহায়ক হবে।

নির্দিষ্ট লোকেশনে ওয়েটিং প্রয়োগ করতে:

  1. ওয়েটেজ প্রয়োজন এমন প্রতিটি লোকেশনের জন্য WeightedLatLng নতুন তৈরি করুন। LatLng এবং প্রয়োজনীয় তীব্রতা বোঝানোর জন্য একটি double পাস করুন। ইনটেনসিটি এই লোকেশনের আপেক্ষিক গুরুত্ব বা ভ্যালু নির্দেশ করে। আরও বেশি ভ্যালু থাকলে হিটম্যাপ গ্রেডিয়েন্টে আরও বেশি ইনটেনসিটি কালার দেখা যাবে। সাধারণত, সবচেয়ে বেশি ইনটেনসিটিযুক্ত রঙ হল লাল।
  2. হিটম্যাপ তৈরি করতে HeatmapTileProvider.Builder().data()-এর পরিবর্তে HeatmapTileProvider.Builder().weightedData()-এ কল করুন।

হিটম্যাপ কাস্টমাইজ করুন

হিটম্যাপের বেশ কিছু প্রপার্টি কাস্টমাইজ করা যায়। আপনি Builder ফাংশনের মাধ্যমে তৈরি করার সময় বিকল্প সেট করতে পারবেন। অথবা, HeatmapTileProvider-এ প্রাসঙ্গিক সেটারকে কল করে যেকোনও সময় একটি বিকল্প পরিবর্তন করুন এবং তারপরে ওভারলেয়ের টাইল ক্যাশে মুছে দিন যাতে এটি নতুন বিকল্প সহ সমস্ত টাইল আবার আঁকতে পারে।

নিম্নলিখিত বিকল্পগুলি উপলভ্য:

  1. ব্যাসার্ধ: হিটম্যাপে প্রয়োগ করা গাউসিয়ান ব্লারের সাইজ, পিক্সেলে প্রকাশ করা হয়। ডিফল্ট হল ২০টি। ১০ থেকে ৫০-এর মধ্যে হতে হবে। হিটম্যাপ তৈরি করার সময় ভ্যালু সেট করতে Builder-এর radius() ব্যবহার করুন, অথবা পরে setRadius()-এর মাধ্যমে ভ্যালু পরিবর্তন করুন।
  2. গ্রেডিয়েন্ট: কালার ম্যাপ তৈরি করতে হিটম্যাপ যে কালার রেঞ্জ ব্যবহার করে, তা সবচেয়ে কম থেকে সবচেয়ে বেশি ইনটেনসিটি পর্যন্ত বিস্তৃত। দুটি অ্যারে ব্যবহার করে গ্রেডিয়েন্ট তৈরি করা হয়: একটি হল রঙের মান থাকা পূর্ণসংখ্যা অ্যারে এবং অন্যটি হল ফ্লোট অ্যারে। এই ফ্লোট অ্যারেতে প্রতিটি রঙের শুরুর পয়েন্ট দেখানো হয়। এটি সর্বোচ্চ ইনটেনসিটির শতাংশ হিসেবে দেওয়া হয় এবং ০ থেকে ১ পর্যন্ত ফ্র্যাকশন হিসেবে প্রকাশ করা হয়। আপনাকে এক রঙের গ্রেডিয়েন্টের জন্য শুধুমাত্র একটি রঙ অথবা একাধিক রঙের গ্রেডিয়েন্টের জন্য ন্যূনতম দুটি রঙ উল্লেখ করতে হবে। এইসব রঙের মধ্যে ইন্টারপোলেশন ব্যবহার করে কালার ম্যাপ তৈরি করা হয়। ডিফল্ট গ্রেডিয়েন্টে দুটি রঙ আছে। হিটম্যাপ তৈরি করার সময় ভ্যালু সেট করতে বিল্ডারের gradient() ব্যবহার করুন অথবা পরে setGradient()-এর মাধ্যমে ভ্যালু পরিবর্তন করুন।
  3. স্বচ্ছতা: এটি হল সম্পূর্ণ হিটম্যাপ লেয়ারের স্বচ্ছতা এবং এর রেঞ্জ হল ০ থেকে ১। ডিফল্ট মান হল ০.৭। হিটম্যাপ তৈরি করার সময় ভ্যালু সেট করতে Builder-এর opacity() ব্যবহার করুন অথবা setOpacity() ব্যবহার করে পরে ভ্যালু পরিবর্তন করুন।

যেমন, হিটম্যাপ যোগ করার আগে গ্রেডিয়েন্ট সেট করতে Gradient তৈরি করুন:

Kotlin

// Create the gradient.
val colors = intArrayOf(
    Color.rgb(102, 225, 0), // green
    Color.rgb(255, 0, 0) // red
)
val startPoints = floatArrayOf(0.2f, 1f)
val gradient = Gradient(colors, startPoints)

// Create the tile provider.
val provider = HeatmapTileProvider.Builder()
    .data(latLngs)
    .gradient(gradient)
    .build()

// Add the tile overlay to the map.
val tileOverlay = map.addTileOverlay(
    TileOverlayOptions()
        .tileProvider(provider)
)
map.moveCamera(com.google.android.gms.maps.CameraUpdateFactory.newLatLngZoom(com.google.android.gms.maps.model.LatLng(-37.8136, 144.9631), 10f))

      

Java

// Create the gradient.
int[] colors = {
    Color.rgb(102, 225, 0), // green
    Color.rgb(255, 0, 0)    // red
};

float[] startPoints = {
    0.2f, 1f
};

Gradient gradient = new Gradient(colors, startPoints);

// Create the tile provider.
HeatmapTileProvider provider = new HeatmapTileProvider.Builder()
    .data(latLngs)
    .gradient(gradient)
    .build();

// Add the tile overlay to the map.
TileOverlay tileOverlay = map.addTileOverlay(new TileOverlayOptions().tileProvider(provider));
map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(-37.8136, 144.9631), 10f));

      

আগে থেকে থাকা হিটম্যাপের অস্বচ্ছতা পরিবর্তন করতে:

Kotlin

provider.setOpacity(0.7)
tileOverlay?.clearTileCache()

      

Java

provider.setOpacity(0.7);
tileOverlay.clearTileCache();

      

ডেটাসেট পরিবর্তন করুন

যে ডেটাসেটের উপর ভিত্তি করে হিটম্যাপ তৈরি করা হয়েছে সেটি পরিবর্তন করতে, HeatmapTileProvider.setData(), অথবা WeightedLatLng পয়েন্টের জন্য HeatmapTileProvider.setWeightedData() ব্যবহার করুন। মনে রাখবেন: আপনি যদি হিটম্যাপে পয়েন্ট যোগ করতে বা হিটম্যাপ থেকে পয়েন্ট সরাতে চান, তাহলে আপনার ডেটা সংগ্রহ আপডেট করুন এবং তারপর setData() বা setWeightedData() ব্যবহার করুন।

Kotlin

val data = latLngs.map { WeightedLatLng(it) }
provider.setWeightedData(data)
tileOverlay?.clearTileCache()

      

Java

List<WeightedLatLng> data = new ArrayList<>();
for (LatLng latLng : latLngs) {
    data.add(new WeightedLatLng(latLng));
}
provider.updateData(data);
tileOverlay.clearTileCache();

      

হিটম্যাপ সরানো

হিটম্যাপ সরাতে, আপনাকে টাইল ওভারলে সরাতে হবে:

Kotlin

it.remove()

      

Java

heatmapTileOverlay.remove();

      

ডেমো অ্যাপ দেখুন

হিটম্যাপ প্রয়োগের আরেকটি উদাহরণের জন্য, ইউটিলিটি লাইব্রেরির সাথে শিপ করা ডেমো অ্যাপে HeatmapsDemoActivity দেখুন। সেট-আপ গাইড থেকে আপনি জানতে পারবেন যে কীভাবে ডেমো অ্যাপ রান করতে হয়।