תוכנית השירות של מפות Google למפת חום ב-Android

בחירת פלטפורמה: Android iOS JavaScript

מפות חום שימושיות לייצוג ההתפלגות והצפיפות של נתונים נקודות במפה.

מבוא

SDK של מפות ל-Android ספריית הכלים כוללת כלי עזר של מפת חום, שבו אפשר להשתמש כדי להוסיף כלי או יותר מיפויי חום למפת Google באפליקציה שלך.

הסרטון הזה מתאר את השימוש במפות חום כחלופה לסמנים, נדרש מספר גדול של נקודות נתונים במפה על הנתונים.

קל להיעזר במפות חום כדי שהצופים יבינו את ההתפלגות והעוצמת היחסית של הנתונים נקודות במפה. במקום להציב סמן בכל מיקום, מפות חום משתמשות שמייצג את התפלגות הנתונים.

בדוגמה הבאה, הצבע האדום מייצג אזורים שבהם יש ריכוז גבוה של כוחות המשטרה בוויקטוריה, אוסטרליה.

מפה עם מפת חום שמראה את המיקום של תחנות משטרה
מפת חום במפה

אם עדיין לא הגדרת את ה-SDK של מפות Google לספרייה של Android Utility, פועלים לפי ההוראות במדריך ההגדרה. לפני שתקראו את שאר הדף.

הוספה של מפת חום פשוטה

כדי להוסיף מפת חום למפה, צריך מערך נתונים שכולל את הקואורדינטות של כל מיקום מעניין. קודם כל, יוצרים HeatmapTileProvider ומעבירים אליו את האוסף של LatLng אובייקטים. לאחר מכן יוצרים TileOverlay להעביר אותו דרך ספק המשבצות של מפת החום, ולהוסיף את שכבת-העל של המשבצת למפה.

חברת החשמל מספקת למחלקה HeatmapTileProvider, מטמיעים את TileProvider ממשק לאספקת תמונות המשבצת עבור מפת החום. HeatmapTileProvider מקבל אוסף של LatLng אובייקטים (או WeightedLatLng אובייקטים, כפי שמתואר בהמשך). היא יוצרת את הלחצן תמונות לרמות שונות של מרחק תצוגה, בהתאם לרדיוס, להדרגתיות ולשקיפות שסופקו. אפשר לשנות את ערכי ברירת המחדל של האפשרויות האלה.

בדיקה מפורטת יותר של השלבים:

  1. כדאי להשתמש HeatmapTileProvider.Builder() להעביר אליו אוסף של LatLng אובייקטים, כדי להוסיף HeatmapTileProvider
  2. חדש TileOverlayOptions עם האפשרויות הרלוונטיות, כולל HeatmapTileProvider.
  3. שיחת טלפון GoogleMap.addTileOverlay() כדי להוסיף את שכבת-העל למפה.

Kotlin



private fun addHeatMap() {
    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)
        .build()

    // Add a tile overlay to the map, using the heat map tile provider.
    val overlay = map.addTileOverlay(TileOverlayOptions().tileProvider(provider))
}

@Throws(JSONException::class)
private fun readItems(@RawRes resource: Int): List<LatLng?> {
    val result: MutableList<LatLng?> = ArrayList()
    val inputStream = context.resources.openRawResource(resource)
    val json = Scanner(inputStream).useDelimiter("\\A").next()
    val array = JSONArray(json)
    for (i in 0 until array.length()) {
        val `object` = array.getJSONObject(i)
        val lat = `object`.getDouble("lat")
        val lng = `object`.getDouble("lng")
        result.add(LatLng(lat, lng))
    }
    return result
}

      

Java


private void addHeatMap() {
    List<LatLng> latLngs = null;

    // 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));
}

private List<LatLng> readItems(@RawRes int resource) throws JSONException {
    List<LatLng> result = new ArrayList<>();
    InputStream inputStream = context.getResources().openRawResource(resource);
    String json = new Scanner(inputStream).useDelimiter("\\A").next();
    JSONArray array = new JSONArray(json);
    for (int i = 0; i < array.length(); i++) {
        JSONObject object = array.getJSONObject(i);
        double lat = object.getDouble("lat");
        double lng = object.getDouble("lng");
        result.add(new LatLng(lat, lng));
    }
    return result;
}

      

בדוגמה הזו, הנתונים מאוחסנים בקובץ 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. רדיוס: גודל הטשטוש הגאוסיאני שהוחל על מפת החום, מבוטאת בפיקסלים. ערך ברירת המחדל הוא 20. המספר צריך להיות בין 10 ל-50. משתמשים ב radius() של Builder כדי להגדיר את הערך כשיוצרים את מפת החום, או לשנות את הערך מאוחר יותר באמצעות setRadius().
  2. הדרגתיות: טווח צבעים שבהם מפת החום משתמשת כדי ליצור מפת צבעים, מהעוצמה הנמוכה ביותר לגבוהה ביותר. נוצר הדרגתי באמצעות שני מערכים: מערך מספרים שלמים שמכיל את הצבעים, ומערך צף שמציין את נקודת ההתחלה של כל צבע, נתון כאחוז עוצמה מקסימלית, ומבוטאת כשבר מ-0 עד 1. צריך: לציין צבע אחד בלבד להדרגתיות בצבע אחד, או לפחות שני צבעים כדי להציג את הצבעים בהדרגתיות של צבעים שונים. מפת הצבעים נוצרת באמצעות אינטרפולציה בין הצבעים האלה. להדרגתיות המוגדרת כברירת מחדל יש שני צבעים. כדאי להשתמש gradient() של ה-builder כדי להגדיר את הערך במהלך היצירה מפת חום, או שינוי הערך מאוחר יותר באמצעות setGradient().
  3. אטימוּת: זוהי האטימות של כל השכבה של מפת החום. נע בין 0 ל-1. ערך ברירת המחדל הוא 0.7. שימוש 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)
)

      

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));

      

כדי לשנות את האטימות של מפת חום קיימת:

Kotlin



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

      

Java


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

      

שינוי מערך הנתונים

כדי לשנות את מערך הנתונים שעליו מבוססת מפת החום, משתמשים HeatmapTileProvider.setData() או HeatmapTileProvider.setWeightedData() תמורת WeightedLatLng נקודות. הערה: אם רוצים להוסיף נקודות ל את מפת החום, או להסיר נקודות ממפת החום, לעדכן את איסוף הנתונים ואז להשתמש ב-setData() או ב-setWeightedData().

Kotlin



val data: List<WeightedLatLng> = ArrayList()
provider.setWeightedData(data)
tileOverlay?.clearTileCache()

      

Java


List<WeightedLatLng> data = new ArrayList<>();
provider.setWeightedData(data);
tileOverlay.clearTileCache();

      

הסרה של מפת חום

כדי להסיר את מפת החום, צריך להסיר את שכבת-העל של המשבצות:

Kotlin



tileOverlay?.remove()

      

Java


tileOverlay.remove();

      

צפייה באפליקציית ההדגמה

כדי לראות דוגמה נוספת להטמעת מפת חום, אפשר לעיין HeatmapsDemoActivity באפליקציית ההדגמה שנשלחת עם ספריית השירות. במדריך ההגדרה אפשר לראות איך להריץ את אפליקציית ההדגמה.