Isı haritaları, verilerin dağılımını ve yoğunluğunu göstermek için kullanışlıdır gösterir.
Giriş
Android için Haritalar SDK'sı Yardımcı Program Kitaplığı, eklemek için kullanabileceğiniz bir ısı haritası yardımcı programı içerir Google haritasına veya daha fazla ısı haritasına ekleyebilirsiniz.
Bu videoda, aşağıdaki durumlarda işaretçilere alternatif olarak ısı haritalarının kullanımı harita üzerinde çok sayıda veri noktası bulunması gerektiğini unutmayın.
Isı haritaları izleyicilerin verilerin dağılımını ve göreli yoğunluğunu anlamasını sağlar gösterir. Isı haritaları, her konuma bir işaretçi yerleştirmek yerine, renk verilerini kullanmanızı öneririz.
Aşağıdaki örnekte kırmızı, polisin en yoğun olduğu bölgeleri temsil eder Victoria, Avustralya’daki istasyonlar.
Android için Haritalar SDK'sı kitaplığını henüz ayarlamadıysanız kurulum kılavuzundaki talimatları uygulayın okuyun.
Basit bir ısı haritası ekleme
Haritanıza ısı haritası eklemek için aşağıdakileri içeren bir veri kümesi gerekir:
koordinatlarıyla birlikte çalışır. Önce bir
HeatmapTileProvider
LatLng
nesne koleksiyonunu iletiyor. Ardından, yeni bir
TileOverlay
karo yer paylaşımını haritaya ekleyebilir.
Bu yardımcı program, HeatmapTileProvider
sınıfını sağlar.
,
TileProvider
karo görüntülerini sağlamak için kullanılan arayüze dönüşür.
HeatmapTileProvider
, LatLng
koleksiyonunu kabul ediyor
nesneler (veya
WeightedLatLng
nesneleri aşağıda açıklandığı şekilde). Karoyu oluşturur
yarıçap, gradyan ve opaklığa dayalı olarak çeşitli yakınlaştırma seviyeleri için resimler
seçeneğini belirleyin. Şunları yapabilirsiniz:
bu seçeneklerin varsayılan değerlerini değiştirin.
Adımları daha ayrıntılı olarak inceleyelim:
- Tekliflerinizi otomatikleştirmek ve optimize etmek için
HeatmapTileProvider.Builder()
yeni bir öğe eklemek içinLatLng
nesneden oluşan bir koleksiyon ileterekHeatmapTileProvider
. - Yeni oluştur
alakalı seçeneklere sahip
TileOverlayOptions
nesnesini,HeatmapTileProvider
dahil. - Telefonla arama
Yer paylaşımını haritaya eklemek için
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; }
Bu örnekte, veriler bir JSON dosyasında depolanır
police_stations.json
Dosyadan bir alıntı aşağıdadır:
[ {"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 } ]
Ağırlıklı enlem/boylam noktaları kullanma
HeatmapTileProvider
oluştururken bu öğeyi
ağırlıklı enlem/boylam koordinatlarının toplamıdır. Bu, aşağıdaki koşullarda faydalıdır:
belirli bir konum kümesinin önemini göstermek istiyorsunuz.
Belirli konumlara ağırlık uygulamak için:
- Yeni oluştur
WeightedLatLng
ağırlıklandırma gerektiren her bir konum içinLatLng
oynayın ve gereken yoğunluğu temsil eden birdouble
. Yoğunluk bu konumun göreceli önemini veya değerini gösterir. Daha yüksek değeri, ısı haritası gradyanında daha yüksek yoğunluklu bir rengin ortaya çıkmasına neden olur. Ölçüt en yüksek yoğunluklu renk kırmızıdır. Telefonla arama
HeatmapTileProvider.Builder().weightedData()
yerineHeatmapTileProvider.Builder().data()
yerine ısı haritasıdır.
Isı haritasını özelleştirme
Isı haritasının bazı özellikleri özelleştirilebilir. Bu ayarı,
seçenekler arasından Builder
işlevlerini kullanabilirsiniz.
Alternatif olarak, ilgili setter'ı çağırarak bir seçeneği istediğiniz zaman değiştirebilirsiniz
ve ardından yer paylaşımını temizleyinHeatmapTileProvider
yeni seçeneklerle yeniden çizmesi için döşeme önbelleğine bakın.
Aşağıdaki seçenekler kullanılabilir:
- Yarıçap: Isı haritasına uygulanan Gauss bulanıklığının boyutudur.
piksel cinsinden ifade edilir. Varsayılan değer 20'dir. 10 ile 50 arasında olmalıdır. Şunu kullanın:
Isı haritasını oluştururken değeri ayarlamak için oluşturucunun
radius()
veya değeri daha sonrasetRadius()
ile değiştirin. - Gradyan: Isı haritasının renk oluşturmak için kullandığı bir renk aralığı
en düşük yoğunluktan en yüksek yoğunlukta değişiklik yapabilir. Gradyan oluşturuldu
iki dizi kullanılarak: renkleri içeren bir tam sayı dizisi ve bir kayan dizi
her rengin başlangıç noktasını (renklerin yüzdesi olarak verilir)
içerir ve 0 ile 1 arasında bir kesir olarak ifade edilir. Şunları yapmanız gerekir:
tek renkli gradyan için yalnızca bir renk belirtebilir veya en az iki renk belirleyebilirsiniz
farklı renkler kullanabilirsiniz. Renk haritası,
birbirine çok benzer. Varsayılan renk geçişi iki renk içerir. Tekliflerinizi otomatikleştirmek ve optimize etmek için
değeri ayarlamak için oluşturucunun
gradient()
ısı haritasını değiştirebilir veya değeri daha sonrasetGradient()
ile değiştirebilirsiniz. - Opaklık: Bu, ısı haritası katmanının tamamının opaklığıdır.
0 ile 1 arasında değişir. Varsayılan değer 0,7'dir. İnşaatçının
Isı haritasını oluştururken değeri ayarlamak için
opacity()
veya değeri daha sonrasetOpacity()
ile değiştirin.
Örneğin, bir
Gradient
değerini ayarlamak için aşağıdaki adımları uygulayın:
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));
Mevcut bir ısı haritasının opaklığını değiştirmek için:
Kotlin
provider.setOpacity(0.7) tileOverlay?.clearTileCache()
Java
provider.setOpacity(0.7); tileOverlay.clearTileCache();
Veri kümesini değiştirme
Isı haritasının oluşturulduğu veri kümesini değiştirmek için
HeatmapTileProvider.setData()
veya
HeatmapTileProvider.setWeightedData()
WeightedLatLng
puan. Not: İsterseniz
veya ısı haritasındaki noktaları kaldırın, veri toplama sürecinizi güncelleyin
ve ardından setData()
veya setWeightedData()
kullanın.
Kotlin
val data: List<WeightedLatLng> = ArrayList() provider.setWeightedData(data) tileOverlay?.clearTileCache()
Java
List<WeightedLatLng> data = new ArrayList<>(); provider.setWeightedData(data); tileOverlay.clearTileCache();
Isı haritasını kaldırma
Isı haritasını kaldırmak için karo yer paylaşımını kaldırmanız gerekir:
Kotlin
tileOverlay?.remove()
Java
tileOverlay.remove();
Demo uygulamayı göster
Isı haritası uygulamasına ilişkin başka bir örnek için
Kargolanan demo uygulamada HeatmapsDemoActivity
yardımcı olur. İlgili içeriği oluşturmak için kullanılan
kurulum kılavuzu,
nasıl çalıştıracağınızı öğreneceksiniz.