Lägg till ett värmekartlager (Android SDK)

Kommentar

Azure Kartor Android SDK-tillbakadragning

Azure Kartor Native SDK för Android är nu inaktuell och kommer att dras tillbaka den 3/31/25. För att undvika tjänststörningar migrerar du till Azure Kartor Web SDK senast 3/31/25. Mer information finns i migreringsguiden för Azure Kartor Android SDK.

Värmekartor, även kallade punktdensitetskartor, är en typ av datavisualisering. De används för att representera datadensiteten med hjälp av en rad färger och visa data "hot spots" på en karta. Värmekartor är ett bra sätt att återge datauppsättningar med ett stort antal punkter.

Att återge tiotusentals punkter som symboler kan täcka större delen av kartområdet. Det här fallet resulterar sannolikt i att många symboler överlappar varandra. Gör det svårt att få en bättre förståelse för data. Att visualisera samma datauppsättning som en värmekarta gör det dock enkelt att se densiteten och den relativa densiteten för varje datapunkt.

Du kan använda värmekartor i många olika scenarier, bland annat:

  • Temperaturdata: Ger approximationer för vad temperaturen är mellan två datapunkter.
  • Data för brussensorer: Visar inte bara intensiteten i bruset där sensorn är, utan kan också ge insikt i avledningen över ett avstånd. Brusnivån på en plats kanske inte är hög. Om brustäckningsområdet från flera sensorer överlappar varandra är det möjligt att det här överlappande området kan uppleva högre brusnivåer. Därför skulle det överlappande området vara synligt på värmekartan.
  • GPS-spårning: Innehåller hastigheten som en viktad höjdkarta, där intensiteten för varje datapunkt baseras på hastigheten. Den här funktionen ger till exempel ett sätt att se var ett fordon körde för fort.

Dricks

Som standard återges koordinaterna för alla geometrier i en datakälla. Om du vill begränsa lagret så att det bara renderar punktgeometrifunktioner anger du filter alternativet för lagret till eq(geometryType(), "Point"). Om du även vill inkludera MultiPoint-funktioner anger du filter alternativet för lagret till any(eq(geometryType(), "Point"), eq(geometryType(), "MultiPoint")).


Förutsättningar

Slutför stegen i snabbstarten : Skapa ett Android-appdokument . Kodblock i den här artikeln kan infogas i händelsehanteraren för kartor onReady .

Lägga till ett heatmapskikt

Om du vill återge en datakälla med punkter som en värmekarta skickar du datakällan till en instans av HeatMapLayer klassen och lägger till den på kartan.

Följande kodexempel läser in ett GeoJSON-flöde av jordbävningar från den senaste veckan och återger dem som en värmekarta. Varje datapunkt återges med en radie på 10 bildpunkter på alla zoomnivåer. För att säkerställa en bättre användarupplevelse ligger värmekartan under etikettskiktet så att etiketterna förblir tydligt synliga. Data i det här exemplet kommer från USGS Earthquake Hazards Program. Det här exemplet läser in GeoJSON-data från webben med hjälp av kodblocket för dataimportverktyget som finns i dokumentet Skapa en datakälla .

//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")

Följande skärmbild visar en karta som läser in en värmekarta med hjälp av koden ovan.

Mappa med värmekartans lager för de senaste jordbävningarna

Anpassa värmekartlagret

I föregående exempel anpassades värmekartan genom att ange radie- och opacitetsalternativ. Termisk kartskiktet innehåller flera alternativ för anpassning, bland annat:

  • heatmapRadius: Definierar en pixelradie där varje datapunkt ska återges. Du kan ange radien som ett fast tal eller som ett uttryck. Genom att använda ett uttryck kan du skala radien baserat på zoomningsnivån och representera ett konsekvent rumsligt område på kartan (till exempel en radie på 5 mil).

  • heatmapColor: Anger hur värmekartan färgas. En färgtoning är en vanlig funktion i värmekartor. Du kan uppnå effekten med ett interpolate uttryck. Du kan också använda ett step uttryck för att färglägga värmekartan och dela upp densiteten visuellt i områden som liknar en kontur- eller radarkarta. Dessa färgpaletter definierar färgerna från lägsta till högsta densitetsvärde.

    Du anger färgvärden för värmekartor som ett uttryck för värdet heatmapDensity . Färgen på området där det inte finns några data definieras vid index 0 för uttrycket "Interpolation" eller standardfärgen för ett "stegvis" uttryck. Du kan använda det här värdet för att definiera en bakgrundsfärg. Det här värdet är ofta inställt på transparent eller halvtransparent svart.

    Här är exempel på färguttryck:

    Färguttryck för interpolering Stegvis färguttryck
    interpolate(
        linear(),
        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: Anger hur ogenomskinligt eller transparent värmekartlagret är.

  • heatmapIntensity: Tillämpar en multiplikator på vikten för varje datapunkt för att öka den totala intensiteten i värmekartan. Det orsakar en skillnad i vikten av datapunkter, vilket gör det lättare att visualisera.

  • heatmapWeight: Som standard har alla datapunkter en vikt på 1 och viktas lika. Viktalternativet fungerar som en multiplikator och du kan ange det som ett tal eller ett uttryck. Om ett tal anges som vikt är det motsvarigheten till att placera varje datapunkt på kartan två gånger. Om vikten till exempel är 2, fördubblas densiteten. Om du anger viktalternativet till ett tal återges värmekartan på ett liknande sätt som med hjälp av intensitetsalternativet.

    Men om du använder ett uttryck kan vikten för varje datapunkt baseras på egenskaperna för varje datapunkt. Anta till exempel att varje datapunkt representerar en jordbävning. Storleksvärdet har varit ett viktigt mått för varje jordbävningsdatapunkt. Jordbävningar inträffar hela tiden, men de flesta har en låg magnitud och märks inte. Använd storleksvärdet i ett uttryck för att tilldela vikten till varje datapunkt. Genom att använda storleksvärdet för att tilldela vikten får du en bättre representation av betydelsen av jordbävningar i värmekartan.

  • minZoom och maxZoom: Zoomnivåintervallet där lagret ska visas.

  • filter: Ett filteruttryck som används för att begränsa hämtade från källan och återges i lagret.

  • sourceLayer: Om datakällan som är ansluten till lagret är en vektorpanelkälla måste ett källskikt i vektorpanelerna anges.

  • visible: Döljer eller visar lagret.

Följande kodfragment är ett exempel på en värmekarta där ett linerinterpolationsuttryck används för att skapa en jämn färgtoning. Egenskapen mag som definieras i data används med en exponentiell interpolation för att ange vikten eller relevansen för varje datapunkt.

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)
       )
    )
)

Följande skärmbild visar ovanstående anpassade värmekartaskikt med samma data från föregående exempel på värmekarta.

Mappa med anpassat värmekartalager för de senaste jordbävningarna

Konsekvent zoombar värmekarta

Som standard har radien av datapunkter som återges i värmekartans lager en fast pixelradie för alla zoomnivåer. När du zoomar kartan aggregeras data och värmekartlagret ser annorlunda ut. Följande video visar standardbeteendet för värmekartan där den behåller en pixelradie när kartan zoomas.

Animering som visar en karta som zoomar med ett värmekartlager som visar en konsekvent bildpunktsstorlek

Använd ett zoom uttryck för att skala radien för varje zoomnivå, så att varje datapunkt täcker samma fysiska område på kartan. Det här uttrycket gör att värmekartlagret ser mer statiskt och konsekvent ut. Varje zoomningsnivå på kartan har dubbelt så många bildpunkter lodrätt och vågrätt som föregående zoomnivå.

Om du skalar radien så att den dubblas med varje zoomnivå skapas en värmekarta som ser konsekvent ut på alla zoomnivåer. Om du vill använda den här skalningen använder zoom du med ett base 2-uttryck exponential interpolation , med pixelradien inställd för den minsta zoomnivån och en skalad radie för den maximala zoomnivå som beräknas enligt 2 * Math.pow(2, minZoom - maxZoom) följande exempel. Zooma kartan för att se hur värmekartan skalar med zoomnivå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)
)

Följande video visar en karta som kör koden ovan, som skalar radien medan kartan zoomas för att skapa en konsekvent återgivning av värmekarta över zoomnivåer.

Animering som visar en karta som zoomar med ett värmekartlager som visar en konsekvent geospatial storlek

Uttrycket zoom kan bara användas i step och interpolate uttryck. Följande uttryck kan användas för att approximeras en radie i meter. Det här uttrycket använder en platshållare radiusMeterssom du bör ersätta med önskad radie. Det här uttrycket beräknar den ungefärliga pixelradien för en zoomnivå vid ekvatorn för zoomningsnivåer 0 och 24 och använder ett exponential interpolation uttryck för att skala mellan dessa värden på samma sätt som plattsättningssystemet på kartan.

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

Dricks

När du aktiverar klustring på datakällan grupperas punkter som ligger nära varandra som en klustrad punkt. Du kan använda punktantalet för varje kluster som viktuttryck för värmekartan. Detta kan avsevärt minska antalet punkter som ska renderas. Punktantalet för ett kluster lagras i en point_count egenskap för punktfunktionen:

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

Om klustringsradien bara är några få bildpunkter skulle det finnas en liten visuell skillnad i återgivningen. En större radie grupperar fler punkter i varje kluster och förbättrar prestanda för värmekartan.

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

Dricks

När du aktiverar klustring på datakällan grupperas punkter som ligger nära varandra som en klustrad punkt. Du kan använda punktantalet för varje kluster som viktuttryck för värmekartan. Detta kan avsevärt minska antalet punkter som ska renderas. Punktantalet för ett kluster lagras i en point_count egenskap för punktfunktionen:

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

Om klustringsradien bara är några få bildpunkter skulle det finnas en liten visuell skillnad i återgivningen. En större radie grupperar fler punkter i varje kluster och förbättrar prestanda för värmekartan.

Nästa steg

Fler kodexempel att lägga till i dina kartor finns i följande artiklar: