Puoi aggiungere immagini nella parte superiore della mappa come livello riquadro. I livelli dei riquadri sono posizionati sopra il riquadro di una mappa a un livello di zoom specifico. Con un numero sufficiente di riquadri, possono integrare i dati delle mappe di Google per l'intera mappa, a più livelli di zoom.
Introduzione
I livelli dei riquadri (a volte indicati come overlay riquadro) consentono di sovrapporre
immagini sopra i riquadri di mappe base di Google. Questo è un modo eccellente per aggiungere dati
Punti d'interesse o informazioni sul traffico e immagini locali per
la tua app. Se combinato con il tipo di mappa kGMSTypeNone
,
i livelli dei riquadri ti consentono di sostituire i dati delle mappe base di Google con i tuoi.
I livelli dei riquadri sono utili quando vuoi aggiungere immagini di grandi dimensioni, in genere coprendo grandi aree geografiche, fino alla mappa. Per contrasto, suolo overlay sono utili quando vuoi correggere una singola immagine punto sulla mappa.
Coordinate dei riquadri
L'API di Google Maps suddivide le immagini a ogni livello di zoom in un insieme di mappe quadrate riquadri, disposti in una griglia ordinata. Quando una mappa scorre fino a in una nuova posizione o a un nuovo livello di zoom, l'API di Google Maps determina quali riquadri sono necessari, e li converte in un insieme di riquadri da recuperare.
Per l'implementazione da parte di Google della proiezione di Mercatore, il riquadro con
la coordinata (0,0) è sempre nell'angolo nord-ovest della mappa, con valori x
in aumento da ovest a est e valori di y
in aumento da nord a sud.
I riquadri vengono indicizzati utilizzando le coordinate di x,y
da quell'origine. Ad esempio, in
livello di zoom 2, se la terra è divisa in 16 riquadri, ogni riquadro può essere
a cui viene fatto riferimento da una coppia x,y
univoca:
Ogni riquadro della mappa è un quadrato di 256 x 256 punti. A livello di zoom pari a 0, il mondo intero visualizzato in un riquadro unico. Ogni livello di zoom aumenta l'ingrandimento di un fattore 2. Quindi, a livello di zoom 1, la mappa viene visualizzata come una griglia 2x2 riquadri o una griglia 4x4 con livello di zoom 2, una griglia 8x8 con livello di zoom 3 e così via. Se stai creando immagini per un livello riquadro, dovrai creare un nuovo immagine 256 x 256 punti per ogni riquadro a ogni livello di zoom che vuoi supportare.
Aggiunta di un livello riquadro
- Crea un'istanza per un oggetto
GMSURLTileLayer
o una sottoclasse personalizzata diGMSTileLayer
/GMSSyncTileLayer
. - (Facoltativo) Modifica la proprietà
zIndex
per cambiarne la posizione in relazione con gli altri livelli dei riquadri. - Assegna l'oggetto
GMSTileLayer
alla mappa impostandonemap
proprietà.
Maps SDK for iOS offre tre classi che consentono di
implementare uno strato riquadro. Per ogni corso devi definire le modalità di recupero
il riquadro della mappa corretto per un determinato insieme di coordinate {x,y,zoom}
. La
le opzioni disponibili sono:
- Sottoclasse
GMSSyncTileLayer
, che fornisce l'implementazione dellatileForX:y:zoom
che restituisceUIImage
istanze. - Sottoclasse
GMSTileLayer
, che fornisce l'implementazione della metodorequestTileForX:y:zoom
che in seguito richiama con un'immagine riquadro. - Usa il corso esistente,
GMSURLTileLayer
, per recuperare automaticamente i riquadri dagli URL, fornendo il bloccoGMSTileURLConstructor
.GMSURLTileLayer
è una classe concreta che non può essere creata con sottoclassi.
Nel caso della creazione di sottoclassi GMSSyncTileLayer
o GMSTileLayer
, fornire un
Il risultato del riquadro nil
comunicherà a Maps SDK for iOS che i dati sono attualmente
non è disponibile, ma che potrebbe essere disponibile in futuro. In alternativa,
restituisce kGMSTileLayerNoTile
per indicare che non è presente alcun riquadro
in ogni località.
Per GMSURLTileLayer
, la restituzione di nil
da GMSTileURLConstructor
comporterà
indicare che non è presente alcun riquadro in questa posizione.
Utilizzo di "GMSURLTilelayer" per recuperare i riquadri dagli URL
GMSURLTileLayer
non richiede la creazione di sottoclassi, ma dovrai
implementare il blocco GMSTileURLConstructor
. Il codice riportato di seguito mostra come
utilizza GMSURLTileLayer
per visualizzare la pianta 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;
Sottoclasse GMSSyncTileLayer
per pubblicare riquadri come UIImage
GMSSyncTileLayer
e GMSTileLayer
sono classi astratte progettate per
sottoclassi del modello. Puoi usare questi corsi per pubblicare riquadri come quelli di UIImage
. Quanto riportato di seguito
l'esempio mostra come eseguire il rendering di un'immagine personalizzata su alcuni riquadri della mappa
creando sottoclassi 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 le relative proprietà di mappa.
Swift
let layer = TestTileLayer() layer.map = mapView
Objective-C
GMSTileLayer *layer = [[TestTileLayer alloc] init]; layer.map = mapView;
Riquadri con DPI elevato per dispositivi Retina
Puoi utilizzare immagini ad alta DPI con GMSSyncTileLayer
oppure GMSURLTileLayer
impostando tileSize
su 512.
La proprietà tileSize
indica il numero di pixel che il riquadro restituito
le immagini preferiranno essere visualizzate come: il valore predefinito è 256, la dimensione
di un riquadro Google Maps su un dispositivo non Retina.
Se visualizzi riquadri DPI normali su un dispositivo ad alto DPI, puoi scalare
immagini impostando tileSize
su 512. Tieni presente che il miglioramento delle dimensioni delle immagini può ridurre
la qualità dell'immagine, soprattutto per le linee sottili o il testo. Per ottenere risultati ottimali, utilizza
tileSize
e DPI immagine al display. Le mappe mostrate su un dispositivo Retina
Hanno un aspetto migliore quando si visualizzano immagini con DPI elevato con un valore di tileSize
pari a 512.
mentre le mappe mostrate su dispositivi non Retina saranno perfette con immagini normali
e il valore predefinito tileSize
di 256.
Rimozione riquadri inattivi
Se i riquadri forniti dal livello diventano "inattivi", il metodo
clearTileCache
deve essere chiamato sul livello per forzare l'aggiornamento. In questo modo
tutti i riquadri di questo livello vengono ricaricati.
Swift
layer.clearTileCache()
Objective-C
[layer clearTileCache];