מפות חום שימושיות לייצוג ההתפלגות והצפיפות של נתונים נקודות במפה.
מבוא
SDK של מפות ל-Android ספריית הכלים כוללת כלי עזר של מפת חום, שבו אפשר להשתמש כדי להוסיף כלי או יותר מיפויי חום למפת Google באפליקציה שלך.
הסרטון הזה מתאר את השימוש במפות חום כחלופה לסמנים, נדרש מספר גדול של נקודות נתונים במפה על הנתונים.
קל להיעזר במפות חום כדי שהצופים יבינו את ההתפלגות והעוצמת היחסית של הנתונים נקודות במפה. במקום להציב סמן בכל מיקום, מפות חום משתמשות שמייצג את התפלגות הנתונים.
בדוגמה הבאה, הצבע האדום מייצג אזורים שבהם יש ריכוז גבוה של כוחות המשטרה בוויקטוריה, אוסטרליה.
אם עדיין לא הגדרת את ה-SDK של מפות Google לספרייה של Android Utility, פועלים לפי ההוראות במדריך ההגדרה. לפני שתקראו את שאר הדף.
הוספה של מפת חום פשוטה
כדי להוסיף מפת חום למפה, צריך מערך נתונים שכולל
את הקואורדינטות של כל מיקום מעניין. קודם כל, יוצרים
HeatmapTileProvider
ומעבירים אליו את האוסף של LatLng
אובייקטים. לאחר מכן יוצרים
TileOverlay
להעביר אותו דרך ספק המשבצות של מפת החום, ולהוסיף את שכבת-העל של המשבצת למפה.
חברת החשמל מספקת למחלקה HeatmapTileProvider
,
מטמיעים את
TileProvider
ממשק לאספקת תמונות המשבצת עבור מפת החום.
HeatmapTileProvider
מקבל אוסף של LatLng
אובייקטים (או
WeightedLatLng
אובייקטים, כפי שמתואר בהמשך). היא יוצרת את הלחצן
תמונות לרמות שונות של מרחק תצוגה, בהתאם לרדיוס, להדרגתיות ולשקיפות
שסופקו. אפשר
לשנות את ערכי ברירת המחדל של האפשרויות האלה.
בדיקה מפורטת יותר של השלבים:
- כדאי להשתמש
HeatmapTileProvider.Builder()
להעביר אליו אוסף שלLatLng
אובייקטים, כדי להוסיףHeatmapTileProvider
- חדש
TileOverlayOptions
עם האפשרויות הרלוונטיות, כוללHeatmapTileProvider
. - שיחת טלפון
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
, אפשר להעביר אותו
אוסף של קואורדינטות משוקללות של קו אורך/רוחב. זה שימושי אם
שרוצים להמחיש את החשיבות של קבוצה מסוימת של מיקומים.
כדי להחיל שקלול על מיקומים ספציפיים:
- חדש
WeightedLatLng
עבור כל מיקום שדורש שקלול. מעבר בLatLng
ו-double
שמייצג את העוצמה הנדרשת. העוצמה מציין את החשיבות היחסית של המיקום הזה. גבוהה יותר התוצאה תהיה צבע בעוצמה גבוהה יותר בהדרגתיות של מפת החום. על ידי ברירת המחדל, הצבע בעוצמה הגבוהה ביותר הוא אדום. שיחת טלפון
HeatmapTileProvider.Builder().weightedData()
במקוםHeatmapTileProvider.Builder().data()
, כדי ליצור מפת חום.
התאמה אישית של מפת החום
יש כמה מאפיינים של מפת החום שניתנים להתאמה אישית. אפשר להגדיר
בזמן היצירה, באמצעות פונקציות Builder
.
אפשר גם לשנות אפשרות בכל שלב באמצעות קריאה למשתמש הרלוונטי
ב-HeatmapTileProvider
, ואז מנקים את שכבת-העל
לשמור את כל המשבצות עם האפשרויות החדשות.
אלה האפשרויות הזמינות:
- רדיוס: גודל הטשטוש הגאוסיאני שהוחל על מפת החום,
מבוטאת בפיקסלים. ערך ברירת המחדל הוא 20. המספר צריך להיות בין 10 ל-50. משתמשים ב
radius()
של Builder כדי להגדיר את הערך כשיוצרים את מפת החום, או לשנות את הערך מאוחר יותר באמצעותsetRadius()
. - הדרגתיות: טווח צבעים שבהם מפת החום משתמשת כדי ליצור
מפת צבעים, מהעוצמה הנמוכה ביותר לגבוהה ביותר. נוצר הדרגתי
באמצעות שני מערכים: מערך מספרים שלמים שמכיל את הצבעים, ומערך צף
שמציין את נקודת ההתחלה של כל צבע, נתון כאחוז
עוצמה מקסימלית, ומבוטאת כשבר מ-0 עד 1. צריך:
לציין צבע אחד בלבד להדרגתיות בצבע אחד, או לפחות שני צבעים
כדי להציג את הצבעים בהדרגתיות של צבעים שונים. מפת הצבעים נוצרת באמצעות
אינטרפולציה בין הצבעים האלה. להדרגתיות המוגדרת כברירת מחדל יש שני צבעים. כדאי להשתמש
gradient()
של ה-builder כדי להגדיר את הערך במהלך היצירה מפת חום, או שינוי הערך מאוחר יותר באמצעותsetGradient()
. - אטימוּת: זוהי האטימות של כל השכבה של מפת החום.
נע בין 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
באפליקציית ההדגמה שנשלחת
עם ספריית השירות.
במדריך ההגדרה אפשר לראות
איך להריץ את אפליקציית ההדגמה.