برنامه کمکی نقشه حرارتی Google Maps Android

انتخاب پلاتفرم: Android iOS

نقشه‌های حرارتی برای نمایش توزیع و تراکم نقاط داده در نقشه مفید هستند.

مقدمه

کتابخانه کاروری‌های کیت توسعه نرم‌افزار Maps ویژه Android شامل یک کاروری نقشه حرارتی است که می‌توانید از آن برای افزودن یک یا چند نقشه حرارتی به Google Map در برنامه‌تان استفاده کنید.

این ویدیو درباره استفاده از نقشه‌های حرارتی به‌عنوان جایگزینی برای نشانگرها بحث می‌کند، زمانی که داده‌های شما به تعداد زیادی نقطه داده در نقشه نیاز دارد.

نقشه‌های حرارتی درک توزیع و شدت نسبی نقاط داده را در نقشه برای بینندگان آسان می‌کنند. به‌جای قرار دادن نشانگر در هر مکان، نقشه حرارتی از رنگ برای نشان دادن توزیع داده‌ها استفاده می‌کند.

در مثال زیر، رنگ قرمز نشان‌دهنده مناطقی با تراکم بالای ایستگاه‌های پلیس در ویکتوریا، استرالیا است.

نقشه‌ای با نقشه حرارتی که مکان ایستگاه‌های پلیس را نشان می‌دهد
نقشه حرارتی روی نقشه

اگر هنوز کتابخانه کاروری‌های کیت توسعه نرم‌افزار Maps ویژه Android را راه‌اندازی نکرده‌اید، قبل‌از خواندن بقیه این صفحه، راهنمای راه‌اندازی را دنبال کنید.

افزودن نقشه حرارتی ساده

برای افزودن نقشه حرارتی به نقشه‌تان، به مجموعه داده‌ای متشکل از مختصات هر مکان موردنظر نیاز دارید. ابتدا یک HeatmapTileProvider ایجاد کنید، و مجموعه اشیاء LatLng را به آن منتقل کنید. سپس TileOverlay جدیدی ایجاد کنید، ارائه‌دهنده کاشی نقشه حرارتی را به آن ارسال کنید، و رونهاد کاشی را به نقشه اضافه کنید.

این ابزار کلاس HeatmapTileProvider را ارائه می‌دهد که میانای TileProvider را برای ارائه تصاویر کاشی برای نقشه حرارتی پیاده‌سازی می‌کند. HeatmapTileProvider مجموعه‌ای از اشیای LatLng (یا اشیای WeightedLatLng، همان‌طور که در زیر شرح داده شده است) را می‌پذیرد. این کلاس تصاویر کاشی را برای سطوح بزرگ‌نمایی مختلف براساس گزینه‌های شعاع، گرادیان، و شفافیت ارائه‌شده ایجاد می‌کند. می‌توانید مقادیر پیش‌فرض این گزینه‌ها را تغییر دهید.

بررسی مراحل با جزئیات بیشتر:

  1. از HeatmapTileProvider.Builder() استفاده کنید و مجموعه‌ای از اشیای LatLng را به آن ارسال کنید تا HeatmapTileProvider جدیدی اضافه شود.
  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))

      

جاوا

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().weightedData() را به‌جای HeatmapTileProvider.Builder().data() فراخوانی کنید.

سفارشی‌سازی نقشه حرارتی

تعدادی از ویژگی‌های نقشه حرارتی قابل‌سفارشی‌سازی است. می‌توانید گزینه‌ها را در زمان ایجاد ازطریق توابع Builder تنظیم کنید. یا اینکه هروقت خواستید با فراخوانی تنظیم‌کننده مربوطه در HeatmapTileProvider، گزینه‌ای را تغییر دهید و سپس حافظه نهان کاشی هم‌پوشانی را پاک کنید تا همه کاشی‌ها را با گزینه‌های جدید دوباره ترسیم کند.

گزینه‌های زیر دردسترس است:

  1. شعاع: اندازه محو کردن گاوسی اعمال‌شده بر نقشه حرارتی، بیان‌شده برحسب پیکسل. پیش‌فرض ۲۰ است. باید بین ۱۰ تا ۵۰ باشد. از radius() Builder برای تنظیم مقدار هنگام ایجاد نقشه حرارتی استفاده کنید، یا مقدار را بعداً با setRadius() تغییر دهید.
  2. گرادیان: طیفی از رنگ‌ها که نقشه حرارتی برای تولید نقشه رنگ خود استفاده می‌کند، از کمترین تا بیشترین شدت. شیب رنگ بااستفاده از دو آرایه ایجاد می‌شود: یک آرایه عدد صحیح حاوی رنگ‌ها، و یک آرایه عدد اعشاری که نقطه شروع هر رنگ را نشان می‌دهد، که به‌صورت درصدی از حداکثر شدت ارائه می‌شود و به‌صورت کسری از ۰ تا ۱ بیان می‌شود. برای گرادیان تک‌رنگ، باید فقط یک رنگ مشخص کنید، یا برای گرادیان چندرنگ، حداقل دو رنگ مشخص کنید. نقشه رنگ بااستفاده از درون‌یابی بین آن رنگ‌ها تولید می‌شود. شیب پیش‌فرض دو رنگ دارد. هنگام ایجاد نقشه حرارتی، از gradient() «سازنده» برای تنظیم مقدار استفاده کنید یا بعداً مقدار را با setGradient() تغییر دهید.
  3. کدورت: این کدورت کل لایه نقشه حرارتی است و از ۰ تا ۱ متغیر است. پیش‌فرض ۰٫۷ است. از «سازنده» 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))

      

جاوا

// 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()

      

جاوا

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

      

تغییر مجموعه داده

برای تغییر مجموعه داده‌ای که نقشه حرارتی براساس آن ساخته شده است، از HeatmapTileProvider.setData()، یا HeatmapTileProvider.setWeightedData() برای WeightedLatLng نقطه استفاده کنید. توجه: اگر می‌خواهید نقطه‌ای به نقشه حرارتی اضافه کنید یا نقطه‌ای را از نقشه حرارتی بردارید، مجموعه داده‌هایتان را به‌روز کنید و سپس از setData() یا setWeightedData() استفاده کنید.

Kotlin

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

      

جاوا

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

      

برداشتن نقشه حرارتی

برای برداشتن نقشه حرارتی، باید رونهاد کاشی را بردارید:

Kotlin

it.remove()

      

جاوا

heatmapTileOverlay.remove();

      

دیدن برنامه نمایشی

برای نمونه دیگری از پیاده‌سازی نقشه حرارتی، به HeatmapsDemoActivity در برنامه نمایشی که همراه با کتابخانه ابزار ارائه می‌شود نگاهی بیندازید. راهنمای راه‌اندازی نحوه اجرای برنامه نمایشی را به شما نشان می‌دهد.