Isı haritası katmanı ekleme (Android SDK)

Not

Android SDK'sı kullanımdan kaldırılmasını Azure Haritalar

Android için Azure Haritalar Yerel SDK artık kullanım dışıdır ve 31/3/25 tarihinde kullanımdan kaldırılacaktır. Hizmet kesintilerini önlemek için 31.03.25'e kadar Azure Haritalar Web SDK'sına geçin. Daha fazla bilgi için bkz. Android SDK geçiş kılavuzu Azure Haritalar.

Nokta yoğunluğu haritaları olarak da bilinen ısı haritaları, bir veri görselleştirme türüdür. Bunlar, bir renk aralığı kullanılarak verilerin yoğunluğunun gösterilmesi ve verilerin haritada "sık erişimli noktalar" olarak gösterilmesi için kullanılır. Isı haritaları, çok sayıda noktaya sahip veri kümelerini işlemenin harika bir yoludur.

On binlerce noktanın sembol olarak işlenmesi harita alanının çoğunu kapsayabilir. Bu durum büyük olasılıkla birçok simgenin örtüşmesine neden olur. Verilerin daha iyi anlaşılmasını zorlaştırıyor. Ancak bu veri kümesini bir ısı haritasıyla görselleştirmek, her veri noktasının yoğunluğu ve göreli yoğunluğunun görülmesini kolaylaştırır.

Isı haritalarını aşağıdakiler dahil olmak üzere birçok farklı senaryoda kullanabilirsiniz:

  • Sıcaklık verileri: İki veri noktası arasındaki sıcaklığın ne olduğuna ilişkin tahminler sağlar.
  • Gürültü algılayıcıları için veriler: Yalnızca algılayıcının bulunduğu gürültü yoğunluğunu göstermekle kalmaz, aynı zamanda uzaktan dağılma hakkında da içgörü sağlayabilir. Herhangi bir sitedeki gürültü düzeyi yüksek olmayabilir. Birden çok algılayıcının gürültü kapsama alanı çakışıyorsa, bu örtüşen alan daha yüksek gürültü düzeyleriyle karşılaşabilir. Bu nedenle, çakışan alan ısı haritasında görülebilir.
  • GPS izlemesi: Hızı, her veri noktasının yoğunluğunun hıza bağlı olduğu ağırlıklı yükseklik haritası olarak içerir. Örneğin, bu işlev bir aracın hız yaptığı yeri görmenin bir yolunu sağlar.

İpucu

Isı haritası katmanları varsayılan olarak bir veri kaynağındaki tüm geometrilerin koordinatlarını işler. Katmanı yalnızca nokta geometrisi özelliklerini işleyebilecek şekilde sınırlandırmak için katmanın filter seçeneğini olarak eq(geometryType(), "Point")ayarlayın. MultiPoint özelliklerini de eklemek istiyorsanız, katmanın filter seçeneğini olarak any(eq(geometryType(), "Point"), eq(geometryType(), "MultiPoint"))ayarlayın.


Önkoşullar

Hızlı Başlangıç: Android uygulaması oluşturma belgesindeki adımları tamamladığınızdan emin olun. Bu makaledeki kod blokları haritalar onReady olay işleyicisine eklenebilir.

Isı haritası katmanı ekleme

Noktaların veri kaynağını ısı haritası olarak işlemek için veri kaynağınızı sınıfın HeatMapLayer bir örneğine geçirin ve haritaya ekleyin.

Aşağıdaki kod örneği, geçen haftaki depremlerin GeoJSON akışını yükler ve bunları bir ısı haritası olarak işler. Her veri noktası, tüm yakınlaştırma düzeylerinde 10 piksel yarıçapıyla işlenir. Daha iyi bir kullanıcı deneyimi sağlamak için ısı haritası etiket katmanının altındadır, böylece etiketler net bir şekilde görünür kalır. Bu örnekteki veriler USGS Deprem Tehlikeleri Programı'ndan alınmaktadır. Bu örnek, Veri kaynağı oluşturma belgesinde sağlanan veri içeri aktarma yardımcı programı kod bloğunu kullanarak Web'den GeoJSON verilerini yükler.

//Create a data source and add it to the map.
DataSource source = new DataSource();

//Import the geojson data and add it to the data source.
source.importDataFromUrl("https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_week.geojson");

//Add data source to the map.
map.sources.add(source);

//Create a heat map layer.
HeatMapLayer layer = new HeatMapLayer(source,
  heatmapRadius(10f),
  heatmapOpacity(0.8f)
);

//Add the layer to the map, below the labels.
map.layers.add(layer, "labels");
//Create a data source and add it to the map.
val source = DataSource()

//Import the geojson data and add it to the data source.
source.importDataFromUrl("https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_week.geojson")

//Add data source to the map.
map.sources.add(source)

//Create a heat map layer.
val layer = HeatMapLayer(
    source,
    heatmapRadius(10f),
    heatmapOpacity(0.8f)
)

//Add the layer to the map, below the labels.
map.layers.add(layer, "labels")

Aşağıdaki ekran görüntüsünde yukarıdaki kodu kullanarak ısı haritası yükleyen bir harita gösterilmektedir.

Son depremlerin ısı haritası katmanıyla harita

Isı haritası katmanını özelleştirme

Önceki örnek, yarıçap ve opaklık seçeneklerini ayarlayarak ısı haritasını özelleştirdi. Isı haritası katmanı özelleştirme için aşağıdakiler dahil olmak üzere çeşitli seçenekler sağlar:

  • heatmapRadius: Her veri noktasının işlendiği bir piksel yarıçapı tanımlar. Yarıçapı sabit bir sayı veya ifade olarak ayarlayabilirsiniz. İfade kullanarak yarıçapı yakınlaştırma düzeyine göre ölçeklendirebilir ve haritada tutarlı bir uzamsal alanı (örneğin, 5 mil yarıçapı) temsil edebilirsiniz.

  • heatmapColor: Isı haritasının renklendirilme şeklini belirtir. Renk gradyanı, ısı haritalarının yaygın bir özelliğidir. Etkiyi bir interpolate ifadeyle elde edebilirsiniz. Ayrıca ısı haritasını renklendirerek yoğunluğu görsel olarak kontur veya radar stili haritaya benzeyen aralıklara ayırmak için bir ifade de kullanabilirsiniz step . Bu renk paletleri renkleri minimumdan maksimum yoğunluk değerine kadar tanımlar.

    Isı eşlemeleri için renk değerlerini değer üzerinde heatmapDensity bir ifade olarak belirtirsiniz. Veri bulunmayan alanın rengi, "İlişkilendirme" ifadesinin dizin 0'ında veya "Basamaklı" ifadesinin varsayılan renginde tanımlanır. Arka plan rengi tanımlamak için bu değeri kullanabilirsiniz. Bu değer genellikle saydam veya yarı saydam siyah olarak ayarlanır.

    Renk ifadelerine örnekler aşağıda verilmiştir:

    İlişkilendirme renk ifadesi Basamaklı renk ifadesi
    interpolate(
        doğrusal(),
        heatmapDensity(),
        stop(0, color(Color.TRANSPARENT)),
        stop(0,01, color(Color.MAGENTA)),
        stop(0,5, color(parseColor("#fb00fb"))),
        stop(1, color(parseColor("#00c3ff")))
    )'
    step(
        heatmapDensity(),
        color(Color.TRANSPARENT),
        stop(0,01, color(parseColor("#000080"))),
        stop(0,25, color(parseColor("#000080"))),
        stop(0,5, color(Color.GREEN)),
        stop(0,5, color(Color.YELLOW)),
        stop(1, color(Color.RED))
    )
  • heatmapOpacity: Isı haritası katmanının ne kadar opak veya saydam olduğunu belirtir.

  • heatmapIntensity: Isı haritasının genel yoğunluğunu artırmak için her veri noktasının ağırlığına bir çarpan uygular. Veri noktalarının kalınlığında farka neden olarak görselleştirmeyi kolaylaştırır.

  • heatmapWeight: Varsayılan olarak, tüm veri noktalarının ağırlığı 1'tir ve eşit olarak ağırlıklıdır. Ağırlık seçeneği çarpan görevi görür ve bunu sayı veya ifade olarak ayarlayabilirsiniz. Bir sayı ağırlık olarak ayarlanırsa, her veri noktasını haritaya iki kez yerleştirme eşdeğerliğidir. Örneğin, ağırlık ise 2, yoğunluk ikiye katlanır. Ağırlık seçeneğinin bir sayıya ayarlanması, ısı haritasını yoğunluk seçeneğini kullanmaya benzer bir şekilde işler.

    Ancak, bir ifade kullanırsanız, her veri noktasının ağırlığı her veri noktasının özelliklerine göre olabilir. Örneğin, her veri noktasının bir depremi temsil ettiği varsayalım. Büyüklük değeri her deprem veri noktası için önemli bir ölçüm olmuştur. Depremler her zaman olur, ancak çoğu düşük bir büyüklüğe sahiptir ve farkedilmez. Her veri noktasına ağırlık atamak için ifadedeki büyüklük değerini kullanın. Ağırlığı atamak için büyüklük değerini kullanarak, ısı haritasında depremlerin önemini daha iyi bir şekilde temsil edersiniz.

  • minZoom ve maxZoom: Katmanın görüntülenmesi gereken yakınlaştırma düzeyi aralığı.

  • filter: Kaynaktan alınan ve katmanda işleneni sınırlamak için kullanılan filtre ifadesi.

  • sourceLayer: Katmana bağlı veri kaynağı bir vektör kutucuğu kaynağıysa, vektör kutucukları içinde bir kaynak katmanı belirtilmelidir.

  • visible: Katmanı gizler veya gösterir.

Aşağıdaki kod parçacığı, düz renk gradyanı oluşturmak için bir liner ilişkilendirme ifadesinin kullanıldığı bir ısı haritası örneğidir. mag Verilerde tanımlanan özellik, her veri noktasının ağırlığını veya ilgi düzeyini ayarlamak için üstel ilişkilendirme ile birlikte kullanılır.

HeatMapLayer layer = new HeatMapLayer(source,
    heatmapRadius(10f),

    //A linear interpolation is used to create a smooth color gradient based on the heat map density.
    heatmapColor(
        interpolate(
            linear(),
            heatmapDensity(),
            stop(0, color(Color.TRANSPARENT)),
            stop(0.01, color(Color.BLACK)),
            stop(0.25, color(Color.MAGENTA)),
            stop(0.5, color(Color.RED)),
            stop(0.75, color(Color.YELLOW)),
            stop(1, color(Color.WHITE))
        )
    ),

    //Using an exponential interpolation since earthquake magnitudes are on an exponential scale.
    heatmapWeight(
       interpolate(
            exponential(2),
            get("mag"),
            stop(0,0),

            //Any earthquake above a magnitude of 6 will have a weight of 1
            stop(6, 1)
       )
    )
);
val layer = HeatMapLayer(source,
    heatmapRadius(10f),

    //A linear interpolation is used to create a smooth color gradient based on the heat map density.
    heatmapColor(
        interpolate(
            linear(),
            heatmapDensity(),
            stop(0, color(Color.TRANSPARENT)),
            stop(0.01, color(Color.BLACK)),
            stop(0.25, color(Color.MAGENTA)),
            stop(0.5, color(Color.RED)),
            stop(0.75, color(Color.YELLOW)),
            stop(1, color(Color.WHITE))
        )
    ),

    //Using an exponential interpolation since earthquake magnitudes are on an exponential scale.
    heatmapWeight(
       interpolate(
            exponential(2),
            get("mag"),
            stop(0,0),

            //Any earthquake above a magnitude of 6 will have a weight of 1
            stop(6, 1)
       )
    )
)

Aşağıdaki ekran görüntüsünde yukarıdaki özel ısı haritası katmanı, önceki ısı haritası örneğindeki verileri kullanarak gösterilmektedir.

Son depremlerin özel ısı haritası katmanıyla harita

Tutarlı yakınlaştırılabilir ısı haritası

Varsayılan olarak, ısı haritası katmanında işlenen veri noktalarının yarıçapı tüm yakınlaştırma düzeyleri için sabit bir piksel yarıçapı vardır. Haritayı yakınlaştırdıkça veriler bir araya toplanır ve ısı haritası katmanı farklı görünür. Aşağıdaki videoda, haritayı yakınlaştırırken piksel yarıçapını koruduğu ısı haritasının varsayılan davranışı gösterilmektedir.

Tutarlı piksel boyutunu gösteren bir ısı haritası katmanı ile harita yakınlaştırmasını gösteren animasyon

Her bir veri noktasının haritanın aynı fiziksel alanını kaplaması için her yakınlaştırma düzeyinin yarıçapını ölçeklendirmek için bir zoom ifade kullanın. Bu ifade, ısı haritası katmanının daha statik ve tutarlı görünmesini sağlar. Haritanın her yakınlaştırma düzeyi, önceki yakınlaştırma düzeyinin iki katı kadar dikey ve yatay piksele sahiptir.

Yarıçapın her yakınlaştırma düzeyiyle ikiye katlanması için ölçeklendirilmesi, tüm yakınlaştırma düzeylerinde tutarlı görünen bir ısı haritası oluşturur. Bu ölçeklendirmeyi uygulamak için, aşağıdaki örnekte gösterildiği gibi 2 * Math.pow(2, minZoom - maxZoom) en düşük yakınlaştırma düzeyi için piksel yarıçapı ayarlanmış ve maksimum yakınlaştırma düzeyi için ölçeklendirilmiş yarıçapı olan bir temel 2 exponential interpolation ifadesi kullanınzoom. Isı haritasının yakınlaştırma düzeyiyle nasıl ölçeklendirildiğini görmek için haritayı yakınlaştırın.

HeatMapLayer layer = new HeatMapLayer(source,
  heatmapRadius(
    interpolate(
      exponential(2),
      zoom(),

      //For zoom level 1 set the radius to 2 pixels.
      stop(1, 2f),

      //Between zoom level 1 and 19, exponentially scale the radius from 2 pixels to 2 * (maxZoom - minZoom)^2 pixels.
      stop(19, Math.pow(2, 19 - 1) * 2f)
    )
  ),
  heatmapOpacity(0.75f)
);
val layer = HeatMapLayer(source,
  heatmapRadius(
    interpolate(
      exponential(2),
      zoom(),

      //For zoom level 1 set the radius to 2 pixels.
      stop(1, 2f),

      //Between zoom level 1 and 19, exponentially scale the radius from 2 pixels to 2 * (maxZoom - minZoom)^2 pixels.
      stop(19, Math.pow(2.0, 19 - 1.0) * 2f)
    )
  ),
  heatmapOpacity(0.75f)
)

Aşağıdaki videoda yukarıdaki kodu çalıştıran ve yakınlaştırma düzeyleri arasında tutarlı bir ısı haritası oluşturma amacıyla harita yakınlaştırılırken yarıçapı ölçeklendiran bir harita gösterilmektedir.

Tutarlı bir jeo-uzamsal boyut gösteren ısı haritası katmanı ile harita yakınlaştırmayı gösteren animasyon

İfade zoom yalnızca ve interpolate ifadelerinde step kullanılabilir. Aşağıdaki ifade, bir yarıçapı metre olarak yaklaşık olarak ayarlamak için kullanılabilir. Bu ifade, yerine istediğiniz yarıçapı koyabileceğiniz bir yer tutucu radiusMeterskullanır. Bu ifade, 0 ve 24 yakınlaştırma düzeyleri için ekvatordaki bir yakınlaştırma düzeyinin yaklaşık piksel yarıçapını hesaplar ve haritadaki döşeme sisteminin çalıştığı gibi bu değerler arasında ölçeklendirmek için bir exponential interpolation ifade kullanır.

interpolate(
    exponential(2),
    zoom(),
    stop(1, product(radiusMeters, 0.000012776039596366526)),
    stop(24, product(radiusMeters, 214.34637593279402))
)

İpucu

Veri kaynağında kümelemeye olanak sağladığınızda birbirine yakın olan noktalar kümelenmiş nokta olarak birlikte gruplandırılır. Isı haritası için ağırlık ifadesi olarak her kümenin nokta sayısını kullanabilirsiniz. Bu, işlenecek nokta sayısını önemli ölçüde azaltabilir. Kümenin nokta sayısı, nokta özelliğinin bir point_count özelliğinde depolanır:

HeatMapLayer layer = new HeatMapLayer(dataSource,
   heatmapWeight(get("point_count"))
);

Kümeleme yarıçapı yalnızca birkaç pikselse, işlemede küçük bir görsel fark olabilir. Daha büyük bir yarıçap, her kümede daha fazla nokta gruplandırarak ısı haritasının performansını artırır.

interpolate(
    exponential(2),
    zoom(),
    stop(1, product(radiusMeters, 0.000012776039596366526)),
    stop(24, product(radiusMeters, 214.34637593279402))
)

İpucu

Veri kaynağında kümelemeye olanak sağladığınızda birbirine yakın olan noktalar kümelenmiş nokta olarak birlikte gruplandırılır. Isı haritası için ağırlık ifadesi olarak her kümenin nokta sayısını kullanabilirsiniz. Bu, işlenecek nokta sayısını önemli ölçüde azaltabilir. Kümenin nokta sayısı, nokta özelliğinin bir point_count özelliğinde depolanır:

var layer = new HeatMapLayer(dataSource,
   heatmapWeight(get("point_count"))
)

Kümeleme yarıçapı yalnızca birkaç pikselse, işlemede küçük bir görsel fark olabilir. Daha büyük bir yarıçap, her kümede daha fazla nokta gruplandırarak ısı haritasının performansını artırır.

Sonraki adımlar

Haritalarınıza eklenecek diğer kod örnekleri için aşağıdaki makalelere bakın: