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

Platform seçin: Android iOS

Isı haritaları, haritadaki veri noktalarının dağılımını ve yoğunluğunu göstermek için kullanışlıdır.

Giriş

Android için Haritalar SDK'sı Yardımcı Program Kitaplığı, uygulamanızdaki bir Google Haritası'na bir veya daha fazla ısı haritası eklemek için kullanabileceğiniz bir ısı haritası yardımcı programı içerir.

Bu videoda, verileriniz haritada çok sayıda veri noktası gerektirdiğinde işaretçilere alternatif olarak ısı haritalarının kullanımı ele alınmaktadır.

Isı haritaları, izleyicilerin bir haritadaki veri noktalarının dağılımını ve göreceli yoğunluğunu anlamasını kolaylaştırır. Isı haritaları, her konuma işaretçi yerleştirmek yerine verilerin dağılımını göstermek için renk kullanır.

Aşağıdaki örnekte, kırmızı renk Avustralya'nın Victoria eyaletindeki karakolların yoğun olduğu bölgeleri gösteriyor.

Polis merkezlerinin konumunu gösteren ısı haritalı bir harita
Harita üzerinde ısı haritası

Android için Haritalar SDK'sı Yardımcı Kitaplığı'nı henüz ayarlamadıysanız bu sayfanın geri kalanını okumadan önce kurulum kılavuzunu inceleyin.

Basit bir ısı haritası ekleme

Haritanıza ısı haritası eklemek için ilgi alanınızdaki her konumun koordinatlarından oluşan bir veri kümesine ihtiyacınız vardır. Öncelikle LatLng nesnelerinin koleksiyonunu ileterek bir HeatmapTileProvider oluşturun. Ardından, ısı haritası döşeme sağlayıcısını ileterek yeni bir TileOverlay oluşturun ve döşeme yer paylaşımını haritaya ekleyin.

Bu yardımcı program, ısı haritası için karo resimlerini sağlamak üzere TileProvider arayüzünü uygulayan HeatmapTileProvider sınıfını sağlar. HeatmapTileProvider, LatLng nesneler (veya WeightedLatLng nesneler, aşağıda açıklandığı gibi) koleksiyonunu kabul eder. Sağlanan yarıçap, gradyan ve opaklık seçeneklerine göre çeşitli yakınlaştırma düzeyleri için döşeme resimleri oluşturur. Bu seçeneklerin varsayılan değerlerini değiştirebilirsiniz.

Adımları daha ayrıntılı bir şekilde inceleyelim:

  1. Yeni bir HeatmapTileProvider eklemek için HeatmapTileProvider.Builder() işlevini kullanın ve LatLng nesnelerden oluşan bir koleksiyon iletin.
  2. HeatmapTileProvider dahil olmak üzere ilgili seçeneklerle yeni bir TileOverlayOptions nesnesi oluşturun.
  3. Haritaya katmanı eklemek için GoogleMap.addTileOverlay() seçeneğini tıklayın.

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, police_stations.json adlı bir JSON dosyasında depolanır. Dosyadan bir alıntı:

[
{"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ını kullanma

HeatmapTileProvider oluştururken ağırlıklı enlem/boylam koordinatları koleksiyonu iletebilirsiniz. Bu özellik, belirli bir konum grubunun önemini göstermek istediğinizde kullanışlıdır.

Belirli konumlara ağırlık uygulamak için:

  1. Ağırlıklandırma gerektiren her konum için yeni bir WeightedLatLng oluşturun. LatLng ve gerekli yoğunluğu temsil eden bir double iletin. Yoğunluk, bu konumun göreceli önemini veya değerini gösterir. Daha yüksek bir değer, ısı haritası gradyanında daha yoğun bir renge neden olur. Varsayılan olarak en yüksek yoğunluklu renk kırmızıdır.
  2. Isı haritasını oluşturmak için HeatmapTileProvider.Builder().data() yerine HeatmapTileProvider.Builder().weightedData(), Telefon et'i kullanın.

Isı haritasını özelleştirme

Isı haritasının bazı özellikleri özelleştirilebilir. Seçenekleri oluşturma sırasında Builder işlevleri aracılığıyla ayarlayabilirsiniz. Alternatif olarak, HeatmapTileProvider üzerinde ilgili ayarlayıcıyı çağırarak istediğiniz zaman bir seçeneği değiştirebilir ve ardından tüm kutuları yeni seçeneklerle yeniden çizebilmek için yer paylaşımının kutu önbelleğini temizleyebilirsiniz.

Aşağıdaki seçenekler kullanılabilir:

  1. Yarıçap: Isı haritasına uygulanan Gauss bulanıklığının piksel cinsinden boyutu. Varsayılan değer 20'dir. 10 ile 50 arasında olmalıdır. Isı haritasını oluştururken değeri ayarlamak için Oluşturucu'nun radius() simgesini kullanın veya değeri daha sonra setRadius() simgesiyle değiştirin.
  2. Gradyan: Isı haritasının renk haritasını oluşturmak için kullandığı, en düşük yoğunluktan en yüksek yoğunluğa kadar değişen bir renk aralığıdır. Gradyan, iki dizi kullanılarak oluşturulur: renkleri içeren bir tam sayı dizisi ve her rengin başlangıç noktasını gösteren bir kayan nokta dizisi. Bu dizi, maksimum yoğunluğun yüzdesi olarak verilir ve 0 ile 1 arasında bir kesir olarak ifade edilir. Tek renkli bir renk geçişi için yalnızca bir renk, çok renkli bir renk geçişi için ise en az iki renk belirtmeniz gerekir. Renk haritası, bu renkler arasındaki interpolasyon kullanılarak oluşturulur. Varsayılan renk geçişinde iki renk bulunur. Isı haritasını oluştururken değeri ayarlamak için Oluşturucu'nun gradient() simgesini kullanın veya değeri daha sonra setGradient() ile değiştirin.
  3. Opaklık: Bu, ısı haritası katmanının tamamının opaklığıdır ve 0 ile 1 arasında değişir. Varsayılan değer 0,7'dir. Isı haritasını oluştururken değeri ayarlamak için Oluşturucu'nun opacity() simgesini kullanın veya değeri daha sonra setOpacity() ile değiştirin.

Örneğin, ısı haritasını eklemeden önce renk geçişini ayarlamak için Gradient oluşturun:

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 WeightedLatLng noktaları için HeatmapTileProvider.setData() veya HeatmapTileProvider.setWeightedData() simgesini kullanın. Not: Isı haritasına nokta eklemek veya ısı haritasından nokta kaldırmak istiyorsanız veri toplama işleminizi güncelleyin ve ardından setData() veya setWeightedData() simgesini 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 döşeme yer paylaşımını kaldırmanız gerekir:

Kotlin

tileOverlay?.remove()

      

Java

tileOverlay.remove();

      

Demo uygulamasını inceleyin

Isı haritası uygulamasıyla ilgili başka bir örnek için yardımcı program kitaplığıyla birlikte gelen demo uygulamasındaki HeatmapsDemoActivity bölümüne göz atın. Kurulum kılavuzunda, demo uygulamasının nasıl çalıştırılacağı gösterilmektedir.