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

Platform seçin: Android iOS JavaScript

Isı haritaları, harita üzerinde veri noktalarının dağılımını ve yoğunluğunu göstermek için yararlıdır.

Giriş

Android Yardımcı Program Kitaplığı için Haritalar SDK'sı, 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 harita üzerinde çok sayıda veri noktası gerektirdiğinde, işaretçilere alternatif olarak ısı haritalarının kullanımı anlatılmaktadır.

Isı haritaları, izleyicilerin harita üzerindeki veri noktalarının dağılımını ve göreli yoğunluğunu anlamasını kolaylaştırır. Isı haritaları, verilerin dağılımını göstermek için her konuma işaretçi yerleştirmek yerine renklerden yararlanır.

Aşağıdaki örnekte kırmızı, Avustralya'nın Victoria eyaletinde polis karakollarının yoğun olduğu bölgeleri temsil etmektedir.

Polis karakollarının konumunu gösteren bir ısı haritası içeren harita
Harita üzerindeki bir ısı haritası

Android için Haritalar SDK'sı kitaplığını henüz ayarlamadıysanız bu sayfanın geri kalanını okumadan önce kurulum rehberindeki talimatları uygulayın.

Basit bir ısı haritası ekleyin

Haritanıza ısı haritası eklemek için, ilgilenilen her konumun koordinatlarını içeren bir veri kümesine ihtiyacınız vardır. Öncelikle bir HeatmapTileProvider oluşturun ve bunu LatLng nesne koleksiyonundan geçirin. Ardından, yeni bir TileOverlay oluşturup bunu ısı haritası kutusu sağlayıcısına iletin ve karo yer paylaşımını haritaya ekleyin.

Yardımcı program, HeatmapTileProvider sınıfını sağlar. Bu sınıf, ısı haritasına kutu resimlerini sağlamak için TileProvider arayüzünü uygular. HeatmapTileProvider, LatLng nesnelerinden (veya aşağıda açıklandığı gibi WeightedLatLng nesnelerinden) oluşan bir koleksiyonu kabul eder. Sağlanan yarıçap, gradyan ve opaklık seçeneklerine bağlı olarak, çeşitli yakınlaştırma seviyeleri için karo resimleri oluşturur. Bu seçeneklerin varsayılan değerlerini değiştirebilirsiniz.

Adımları daha ayrıntılı olarak inceleyelim:

  1. Yeni bir HeatmapTileProvider eklemek için HeatmapTileProvider.Builder() parametresini LatLng nesne koleksiyonunu ileterek ekleyin.
  2. HeatmapTileProvider dahil olmak üzere ilgili seçeneklerle yeni bir TileOverlayOptions nesnesi oluşturun.
  3. Yer paylaşımını haritaya eklemek için GoogleMap.addTileOverlay() çağrısı yapı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 bir JSON dosyasında (police_stations.json) depolanıyor. Dosyadan bir ayıklamayı burada bulabilirsiniz:

[
{"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 hedefe ağırlıklı enlem/boylam koordinatlarından oluşan bir koleksiyon aktarabilirsiniz. Bu, belirli bir konum grubunun önemini göstermek istediğinizde kullanışlıdır.

Belirli konumlara ağırlıklandırma uygulamak için:

  1. Ağırlıklandırma gerektiren her konum için yeni bir WeightedLatLng oluşturun. Gerekli yoğunluğu temsil eden LatLng ve double değerini iletin. Yoğunluk, bu konumun göreceli önemini veya değerini gösterir. Daha yüksek bir değer, ısı haritası gradyanında daha yüksek yoğunluklu bir renkle sonuçlanır. 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() yöntemini çağırın.

Isı haritasını özelleştirin

Isı haritasının birçok özelliği özelleştirilebilir. Seçenekleri, oluşturma sırasında Builder işlevleriyle ayarlayabilirsiniz. Alternatif olarak, HeatmapTileProvider üzerinde ilgili setter'ı çağırarak istediğiniz zaman bir seçeneği değiştirebilirsiniz. Daha sonra, tüm blokları yeni seçeneklerle yeniden çizmek için yer paylaşımının karo önbelleğini temizleyin.

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() özelliğini kullanın veya daha sonra setRadius() ile değeri 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ığı. Renk geçişi, iki dizi kullanılarak oluşturulur: renkleri içeren bir tam sayı dizisi ve her rengin başlangıç noktasını gösteren, maksimum yoğunluğun yüzdesi olarak verilen ve 0'dan 1'e kesirli olarak ifade edilen bir kayan dizi. Tek renkli renk geçişi için yalnızca bir renk veya çok renkli bir gradyan için en az iki renk belirtmeniz gerekir. Renk haritası, bu renkler arasındaki interpolasyon kullanılarak oluşturulur. Varsayılan renk geçişinin iki rengi vardır. Isı haritasını oluştururken değeri ayarlamak için Oluşturucu'nun gradient() özelliğini kullanın veya daha sonra setGradient() ile değeri değiştirin.
  3. Saydamlık: Tüm ısı haritası katmanı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() özelliğini kullanın veya daha sonra setOpacity() ile değeri değiştirin.

Örneğin, ısı haritasını eklemeden önce gradyanı ayarlamak için bir 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 HeatmapTileProvider.setData() ya da WeightedLatLng nokta için HeatmapTileProvider.setWeightedData() kullanın. Not: Isı haritasına nokta eklemek veya ısı haritasından noktaları kaldırmak isterseniz veri toplama işleminizi güncelleyin ve ardından setData() ya da setWeightedData() özelliğini 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 yer paylaşımlı karoyu kaldırmanız gerekir:

Kotlin



tileOverlay?.remove()

      

Java


tileOverlay.remove();

      

Demo uygulamaya göz atın

Başka bir ısı haritası uygulaması örneği için, yardımcı program kitaplığıyla birlikte gönderilen demo uygulamasında HeatmapsDemoActivity bölümüne göz atın. Kurulum kılavuzu, demo uygulamanın nasıl çalıştırılacağını gösterir.