Google Haritalar Android Isı Haritası Yardımcı Programı

Platform seçin: Android iOS JavaScript

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.

Polis karakollarının konumunu gösteren ısı haritasının bulunduğu harita
Harita üzerinde bir ısı haritası

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:

  1. Tekliflerinizi otomatikleştirmek ve optimize etmek için HeatmapTileProvider.Builder() yeni bir öğe eklemek için LatLng nesneden oluşan bir koleksiyon ileterek HeatmapTileProvider.
  2. Yeni oluştur alakalı seçeneklere sahip TileOverlayOptions nesnesini, HeatmapTileProvider dahil.
  3. 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:

  1. Yeni oluştur WeightedLatLng ağırlıklandırma gerektiren her bir konum için LatLng oynayın ve gereken yoğunluğu temsil eden bir double. 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.
  2. Telefonla arama HeatmapTileProvider.Builder().weightedData() yerine HeatmapTileProvider.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:

  1. 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 sonra setRadius() ile değiştirin.
  2. 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 sonra setGradient() ile değiştirebilirsiniz.
  3. 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 sonra setOpacity() 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.