Puoi aggiungere immagini sopra la mappa come livello di riquadri. I livelli di riquadri vengono posizionati sopra un riquadro della mappa a un livello di zoom specifico. Con un numero sufficiente di riquadri, puoi integrare i dati della mappa di Google per l'intera mappa, a più livelli di zoom.

Introduzione
I livelli di riquadri, a volte chiamati overlay di riquadri, consentono di sovrapporre immagini ai riquadri della mappa base di Google. Utilizza questa funzionalità per aggiungere dati, come punti di interesse o informazioni sul traffico, e immagini locali alla tua app. Se combinati con il tipo di mappa kGMSTypeNone, i livelli di riquadri ti consentono di sostituire i dati della mappa di base di Google con i tuoi.
I livelli di riquadri sono utili quando vuoi aggiungere immagini estese, in genere che coprono grandi aree geografiche, alla mappa. Al contrario, gli overlay a terra sono utili quando vuoi fissare una singola immagine in un punto della mappa.
Coordinate dei riquadri
L'API di Google Maps suddivide le immagini a ogni livello di zoom in un insieme di riquadri della mappa quadrati, disposti in una griglia ordinata. Quando una mappa scorre verso una nuova località o un nuovo livello di zoom, l'API di Google Maps determina quali riquadri sono necessari e li traduce in un insieme di riquadri da recuperare.
Nell'implementazione di Google della proiezione di Mercatore, il riquadro con coordinate (0,0) si trova sempre nell'angolo nord-ovest della mappa, con valori x che aumentano da ovest a est e valori y che aumentano da nord a sud.
I riquadri vengono indicizzati utilizzando le coordinate x,y dall'origine. Ad esempio, al livello di zoom 2, quando la Terra è suddivisa in 16 riquadri, ogni riquadro può essere referenziato da una coppia x,y univoca:

Ogni riquadro della mappa è un quadrato di 256x256 punti. Al livello di zoom 0, il mondo intero viene visualizzato in un singolo riquadro. Ogni livello di zoom aumenta l'ingrandimento di un fattore due. Ad esempio, al livello di zoom 1 la mappa viene visualizzata come una griglia di riquadri 2x2, al livello di zoom 2 come una griglia 4x4 e al livello di zoom 3 come una griglia 8x8. Per creare immagini per un livello di riquadri, crea un'immagine di 256x256 punti per ogni riquadro a ogni livello di zoom che vuoi supportare.
Aggiungere un livello di riquadri
- Crea un'istanza di un
GMSURLTileLayeroggetto o di una sottoclasse personalizzata diGMSTileLayeroGMSSyncTileLayer. - (Facoltativo) Modifica la proprietà
zIndexper regolare la sua posizione rispetto ad altri livelli di riquadri. - Assegna l'oggetto
GMSTileLayeralla mappa impostando la relativa proprietàmap.
Maps SDK for iOS fornisce tre classi che possono essere utilizzate per implementare un livello di riquadri. Con ogni classe, dovrai definire come recuperare il riquadro della mappa corretto per un determinato insieme di coordinate {x,y,zoom}. Le opzioni disponibili sono:
- Sottoclasse
GMSSyncTileLayer, fornendo l'implementazione ditileForX:y:zoomche restituisce istanzeUIImage. - Sottoclasse
GMSTileLayer, fornendo l'implementazione del metodo asincronorequestTileForX:y:zoomche in seguito richiama un'immagine del riquadro. - Utilizza la classe esistente,
GMSURLTileLayer, per recuperare automaticamente i riquadri dagli URL, fornendo il bloccoGMSTileURLConstructor.GMSURLTileLayerè una classe concreta che non può essere sottoclassificata.
Nel caso di sottoclassificazione di GMSSyncTileLayer o GMSTileLayer, fornire un risultato del riquadro nil indicherà a Maps SDK for iOS che i dati non sono disponibili, ma potrebbero esserlo in futuro. In alternativa, restituisci kGMSTileLayerNoTile per indicare che non è presente alcun riquadro in questa località.
Per GMSURLTileLayer, la restituzione di nil da GMSTileURLConstructor indicherà che non è presente alcun riquadro in questa località.
Utilizzare GMSURLTileLayer per recuperare i riquadri dagli URL
GMSURLTileLayer non richiede la sottoclassificazione, ma dovrai implementare il blocco GMSTileURLConstructor. Il codice riportato di seguito mostra come utilizzare GMSURLTileLayer per visualizzare la planimetria di un edificio a più piani.
Swift
let floor = 1 // Implement GMSTileURLConstructor // Returns a Tile based on the x,y,zoom coordinates, and the requested floor let urls: GMSTileURLConstructor = { (x, y, zoom) in let url = "https://www.example.com/floorplans/L\(floor)_\(zoom)_\(x)_\(y).png" return URL(string: url) } // Create the GMSTileLayer let layer = GMSURLTileLayer(urlConstructor: urls) // Display on the map at a specific zIndex layer.zIndex = 100 layer.map = mapView
Objective-C
NSInteger floor = 1; // Create the GMSTileLayer GMSURLTileLayer *layer = [GMSURLTileLayer tileLayerWithURLConstructor:^NSURL * _Nullable(NSUInteger x, NSUInteger y, NSUInteger zoom) { NSString *url = [NSString stringWithFormat:@"https://www.example.com/floorplans/L%ld_%lu_%lu_%lu.png", (long)floor, (unsigned long)zoom, (unsigned long)x, (unsigned long)y]; return [NSURL URLWithString:url]; }]; // Display on the map at a specific zIndex layer.zIndex = 100; layer.map = mapView;
Sottoclassificare GMSSyncTileLayer per pubblicare i riquadri come UIImage
GMSSyncTileLayer e GMSTileLayer sono classi astratte progettate per essere sottoclassificate. Puoi utilizzare queste classi per pubblicare i riquadri come UIImage. L'esempio riportato di seguito mostra come eseguire il rendering di un'immagine personalizzata su alcuni riquadri della mappa sottoclassificando GMSSyncTileLayer.
Swift
class TestTileLayer: GMSSyncTileLayer { override func tileFor(x: UInt, y: UInt, zoom: UInt) -> UIImage? { // On every odd tile, render an image. if (x % 2 == 1) { return UIImage(named: "australia") } else { return kGMSTileLayerNoTile } } }
Objective-C
@interface TestTileLayer : GMSSyncTileLayer @end @implementation TestTileLayer - (UIImage *)tileForX:(NSUInteger)x y:(NSUInteger)y zoom:(NSUInteger)zoom { // On every odd tile, render an image. if (x % 2 == 1) { return [UIImage imageNamed:@"australia"]; } else { return kGMSTileLayerNoTile; } } @end
Per aggiungere il livello alla mappa, crea un'istanza dell'oggetto e imposta la relativa proprietà map.
Swift
let layer = TestTileLayer() layer.map = mapView
Objective-C
GMSTileLayer *layer = [[TestTileLayer alloc] init]; layer.map = mapView;
Riquadri ad alta risoluzione per dispositivi Retina
Puoi utilizzare immagini ad alta risoluzione con GMSSyncTileLayer
o GMSURLTileLayer impostando tileSize su 512.
La proprietà tileSize indica il numero di pixel che le immagini dei riquadri restituite preferiranno visualizzare; il valore predefinito è 256, ovvero la dimensione di un riquadro di Google Maps su un dispositivo non Retina.
Se visualizzi riquadri a risoluzione normale su un dispositivo ad alta risoluzione, puoi aumentare le immagini impostando tileSize su 512. Tieni presente che l'aumento della risoluzione delle immagini potrebbe ridurre la qualità dell'immagine, soprattutto per linee sottili o testo. Per risultati ottimali, abbina tileSize e DPI dell'immagine al display. Le mappe visualizzate su un dispositivo Retina avranno un aspetto ottimale quando vengono visualizzate immagini ad alta risoluzione con un tileSize di 512, mentre le mappe visualizzate su un dispositivo non Retina avranno un aspetto ottimale con immagini normali e il valore predefinito tileSize di 256.
Cancellare i riquadri obsoleti
Se i riquadri forniti dal livello diventano "obsoleti", è necessario chiamare il metodo clearTileCache sul livello per forzare un aggiornamento. In questo modo, tutti i riquadri di questo livello verranno ricaricati.
Swift
layer.clearTileCache()
Objective-C
[layer clearTileCache];