Condividi tramite


Aggiungere un livello simbolo a una mappa (Android SDK)

Questo articolo descrive come eseguire il rendering di un punto dati da un'origine dati come livello simbolo in una mappa tramite Android SKD di Mappe di Azure. I livelli simbolo eseguono il rendering dei punti come immagine e testo sulla mappa.

Nota

Ritiro di Android SDK di Mappe di Azure

Azure Maps Native SDK per Android è ora deprecato e verrà ritirato il 3/31/25. Per evitare interruzioni del servizio, eseguire la migrazione al Web SDK di Mappe di Azure entro il 31/3/25. Per altre informazioni, vedere La guida alla migrazione di Android SDK di Mappe di Azure.

Suggerimento

Per impostazione predefinita, i livelli simbolo eseguiranno il rendering delle coordinate di tutte le geometrie in un'origine dati. Per limitare il livello in modo che esegua solo il rendering delle funzionalità geometriche dei punti, impostare l’opzione filter del livello su eq(geometryType(), "Point"). Per includere anche le funzionalità MultiPoint, impostare l’opzione filter del livello su any(eq(geometryType(), "Point"), eq(geometryType(), "MultiPoint")).

Prerequisiti

Assicurarsi di completare la procedura descritta nel documento Guida introduttiva: creare un’app Android. È possibile inserire i blocchi di codice indicati in questo articolo nel gestore eventi onReady delle mappe.

Aggiungere un livello per i simboli

Prima di aggiungere un livello simbolo alla mappa, è necessario eseguire un paio di passaggi. Creare prima di tutto un'origine dati e aggiungerla alla mappa. Creare un livello simbolo. Passare quindi l'origine dati al livello simbolo per recuperare i dati dall'origine dati. Aggiungere infine i dati all'origine dati, in modo che sia disponibile un elemento su cui eseguire il rendering.

Il codice seguente mostra cosa aggiungere alla mappa dopo il caricamento. Questo esempio esegue il rendering di un singolo punto sulla mappa usando un livello simbolo.

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

//Create a point and add it to the data source.
source.add(Point.fromLngLat(0, 0));

//Create a symbol layer to render icons and/or text at points on the map.
SymbolLayer layer = new SymbolLayer(source);

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

//Create a point and add it to the data source.
source.add(Point.fromLngLat(0, 0))

//Create a symbol layer to render icons and/or text at points on the map.
val layer = SymbolLayer(source)

//Add the layer to the map.
map.layers.add(layer)

È possibile aggiungere tre tipi diversi di dati dei punti alla mappa:

  • Geometria Point GeoJSON: questo oggetto contiene solo una coordinata di un punto e nient'altro. È possibile usare il metodo statico Point.fromLngLat per creare facilmente questi oggetti.
  • Geometria MultiPoint GeoJSON: questo oggetto contiene le coordinate di più punti e nient'altro. Per creare questi oggetti, è sufficiente passare una matrice di punti nella classe MultiPoint.
  • Funzionalità GeoJSON: questo oggetto è costituito da qualsiasi geometria GeoJSON e da un set di proprietà che contengono metadati associati alla geometria.

Per altre informazioni, vedere il documento Creare un'origine dati relativo alla creazione e all'aggiunta di dati alla mappa.

L'esempio di codice seguente crea una geometria Point GeoJSON, la passa alla funzionalità GeoJSON e ha un valore title aggiunto alle relative proprietà. La proprietà title viene visualizzata come testo sopra l'icona del simbolo sulla mappa.

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

//Create a point feature.
Feature feature = Feature.fromGeometry(Point.fromLngLat(0, 0));

//Add a property to the feature.
feature.addStringProperty("title", "Hello World!");

//Add the feature to the data source.
source.add(feature);

//Create a symbol layer to render icons and/or text at points on the map.
SymbolLayer layer = new SymbolLayer(source, 
    //Get the title property of the feature and display it on the map.
    textField(get("title"))
);

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

//Create a point feature.
val feature = Feature.fromGeometry(Point.fromLngLat(0, 0))

//Add a property to the feature.
feature.addStringProperty("title", "Hello World!")

//Add the feature to the data source.
source.add(feature)

//Create a symbol layer to render icons and/or text at points on the map.
val layer = SymbolLayer(
    source,  //Get the title property of the feature and display it on the map.
    textField(get("title"))
)

//Add the layer to the map.
map.layers.add(layer)

Lo screenshot seguente mostra come il codice precedente consenta di eseguire il rendering di una funzionalità punto a livello bolla e di un’etichetta di testo per il punto con un livello simbolo.

Mappa con il rendering dei punti eseguito usando un livello simbolo che visualizza un'icona e un'etichetta di testo per una funzionalità punto

Suggerimento

Per impostazione predefinita, i livelli simbolo ottimizzano il rendering dei simboli nascondendo i simboli che si sovrappongono. Durante l’ingrandimento i simboli nascosti diventano visibili. Per disabilitare questa funzionalità ed eseguire sempre il rendering di tutti i simboli, impostare le opzioni di iconAllowOverlap e textAllowOverlap su true.

Aggiungere un'icona personalizzata a un livello simbolo

Il rendering dei livelli simbolo viene eseguito tramite WebGL. Di conseguenza tutte le risorse, ad esempio le immagini icona, devono essere caricate nel contesto di WebGL. Questo esempio mostra come aggiungere un'icona personalizzata alle risorse della mappa. Questa icona viene quindi usata per eseguire il rendering dei dati dei punti con un simbolo personalizzato sulla mappa. La proprietà textField del livello simbolo richiede che venga specificata un'espressione. In questo caso, si vuole eseguire il rendering della proprietà ‘temperature’. Poiché la temperatura è un numero, è necessario convertirla in una stringa. Inoltre, si vuole aggiungere "°F" a tale stringa. È possibile usare un'espressione per eseguire questa concatenazione; concat(Expression.toString(get("temperature")), literal("°F")).

//Load a custom icon image into the image sprite of the map.
map.images.add("my-custom-icon", R.drawable.showers);

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

//Create a point feature.
Feature feature = Feature.fromGeometry(Point.fromLngLat(-73.985708, 40.75773));

//Add a property to the feature.
feature.addNumberProperty("temperature", 64);

//Add the feature to the data source.
source.add(feature);

//Create a symbol layer to render icons and/or text at points on the map.
SymbolLayer layer = new SymbolLayer(source,
    iconImage("my-custom-icon"),
    iconSize(0.5f),

    //Get the title property of the feature and display it on the map.
    textField(concat(Expression.toString(get("temperature")), literal("°F"))),
    textOffset(new Float[]{0f, -1.5f})
);
//Load a custom icon image into the image sprite of the map.
map.images.add("my-custom-icon", R.drawable.showers)

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

//Create a point feature.
val feature = Feature.fromGeometry(Point.fromLngLat(-73.985708, 40.75773))

//Add a property to the feature.
feature.addNumberProperty("temperature", 64)

//Add the feature to the data source.
source.add(feature)

//Create a symbol layer to render icons and/or text at points on the map.
val layer = SymbolLayer(
    source,
    iconImage("my-custom-icon"),
    iconSize(0.5f),  //Get the title property of the feature and display it on the map.
    textField(concat(Expression.toString(get("temperature")), literal("°F"))),
    textOffset(arrayOf(0f, -1.5f))
)

In questo esempio, l’immagine seguente è stata caricata nella cartella drawable dell’app.

Immagine dell'icona meteo che rappresenta gli acquazzoni
showers.png

Lo screenshot seguente mostra come il codice precedente consenta di eseguire il rendering di una funzionalità punto a livello bolla e di un’etichetta di testo per il punto a un livello simbolo.

Mappa con il rendering dei punti eseguito usando un livello simbolo che visualizza un'icona personalizzata e un'etichetta di testo formattata per una funzionalità punto

Suggerimento

Per eseguire il rendering solo del testo con un livello simbolo, è possibile nascondere l'icona impostando la proprietà iconImage delle opzioni dell'icona su "none".

Modificare i colori dei simboli

Android SDK di Mappe di Azure include un set di varianti di colore predefinite per l’icona dell’indicatore predefinito. Ad esempio, è possibile passare marker-red all'opzione iconImage di un livello simbolo per eseguire il rendering di una versione rossa dell'icona dell’indicatore in tale livello.

SymbolLayer layer = new SymbolLayer(source,
    iconImage("marker-red")
);
val layer = SymbolLayer(source,
    iconImage("marker-red")
)

La tabella seguente elenca tutti i nomi predefiniti delle immagini delle icone disponibili. Questi indicatori estraggono i colori dalle risorse colore che possono essere sostituite. Tuttavia, la sostituzione del colore di uno di questi indicatori si applica a tutti i livelli che usano l'immagine dell'icona.

Nome dell'immagine dell’icona Nome della risorsa colore
marker-default azure_maps_marker_default
marker-black azure_maps_marker_black
marker-blue azure_maps_marker_blue
marker-darkblue azure_maps_marker_darkblue
marker-red azure_maps_marker_red
marker-yellow azure_maps_marker_yellow

È anche possibile sostituire il colore del bordo di tutti gli indicatori usando il nome della risorsa colore azure_maps_marker_border. I colori di questi indicatori possono essere sostituiti aggiungendo un colore con lo stesso nome nel file colors.xml dell'app. Ad esempio, il file colors.xml seguente imposta il verde brillante come colore dell’indicatore predefinito.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="azure_maps_marker_default">#00FF00</color>
</resources>

Il codice seguente è una versione modificata del codice XML del vettore dell’indicatore predefinito che è possibile modificare per creare versioni personalizzate dell’indicatore predefinito. È possibile aggiungere la versione modificata alla cartella drawable dell'app, aggiungerla allo sprite dell'immagine delle mappe usando map.images.add e quindi usarla con un livello simbolo.

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24.5dp"
    android:height="36.5dp"
    android:viewportWidth="24.5"
    android:viewportHeight="36.5">
    <path
        android:pathData="M12.25,0.25a12.2543,12.2543 0,0 0,-12 12.4937c0,6.4436 6.4879,12.1093 11.059,22.5641 0.5493,1.2563 1.3327,1.2563 1.882,0C17.7621,24.8529 24.25,19.1857 24.25,12.7437A12.2543,12.2543 0,0 0,12.25 0.25Z"
        android:strokeWidth="0.5"
        android:fillColor="@color/azure_maps_marker_default"
        android:strokeColor="@color/azure_maps_marker_border"/>
</vector>

Passaggi successivi

Per altri esempi di codice da aggiungere alle mappe, vedere gli articoli seguenti: