Livelli di piastrelle

Seleziona la piattaforma: Android iOS JavaScript

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:

Mappa del mondo divisa in quattro righe e quattro colonne di riquadri.

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

  1. Crea un'istanza per un oggetto GMSURLTileLayer o una sottoclasse personalizzata di GMSTileLayer/GMSSyncTileLayer.
  2. (Facoltativo) Modifica la proprietà zIndex per cambiarne la posizione in relazione con gli altri livelli dei riquadri.
  3. Assegna l'oggetto GMSTileLayer alla mappa impostandone map 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 della tileForX:y:zoom che restituisce UIImage istanze.
  • Sottoclasse GMSTileLayer, che fornisce l'implementazione della metodo requestTileForX:y:zoom che in seguito richiama con un'immagine riquadro.
  • Usa il corso esistente, GMSURLTileLayer, per recuperare automaticamente i riquadri dagli URL, fornendo il blocco GMSTileURLConstructor. 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];