Puedes agregar imágenes sobre tu mapa a modo de capas de mosaicos. Las capas de mosaicos se colocan encima de un mosaico de mapa, a un nivel de zoom específico. Si tienes suficientes mosaicos, puedes complementar los datos de mapas de Google para todo el mapa a varios niveles de zoom.
Introducción
Las capas de mosaicos (a veces denominadas "superposiciones de mosaicos") te permiten superponer imágenes sobre los mosaicos del Mapa base de Google. Esta es una excelente manera de agregar datos (como información sobre lugares de interés o tráfico) e imágenes locales a tu app. Cuando se combinan con el tipo de mapa kGMSTypeNone
, las capas de mosaicos te permiten reemplazar de forma eficaz los datos del mapa base de Google por los tuyos.
Las capas de mosaicos son útiles cuando deseas agregar muchas imágenes al mapa que, por lo general, abarcan áreas geográficas extensas. En cambio, las superposiciones de suelo resultan útiles cuando deseas fijar una sola imagen en un punto del mapa.
Coordenadas del mosaico
La API de Google Maps desglosa las imágenes de cada nivel de zoom y forma un conjunto de mosaicos de mapa cuadrados dispuestos en una cuadrícula ordenada. Cuando en un mapa se realiza un desplazamiento hacia una nueva ubicación, o un cambio en el nivel de zoom, la API de Google Maps determina los mosaicos necesarios y los convierte en un conjunto de mosaicos para recuperar.
Para la implementación de Google de la proyección Mercator, el mosaico con las coordenadas (0,0) siempre se encuentra en la esquina noroeste del mapa, con valores de x
que aumentan de oeste a este y valores de y
que lo hacen de norte a sur.
Los mosaicos se indexan utilizando las coordenadas x,y
a partir del origen mencionado. Por ejemplo, en el nivel de zoom 2, cuando la Tierra se divide en 16 mosaicos, se puede hacer referencia a cada uno de estos mosaicos mediante un par x,y
único:
Cada mosaico de mapa es un cuadrado de 256 x 256 puntos. En el nivel de zoom 0, se renderiza el mundo entero en un solo mosaico. Cada nivel de zoom duplica la ampliación. Por lo tanto, en el nivel de zoom 1, el mapa se renderizará como una cuadrícula de mosaicos de 2 x 2, una cuadrícula de 4 x 4 en el nivel de zoom 2, una cuadrícula de 8 x 8 en el nivel de zoom 3, etc. Si creas imágenes para una capa de mosaicos, deberás crear una nueva imagen de 256 x 256 para cada mosaico de cada nivel de zoom que desees admitir.
Cómo agregar una capa de mosaicos
- Crea una instancia de un objeto
GMSURLTileLayer
o una subclase personalizada deGMSTileLayer
oGMSSyncTileLayer
. - De manera opcional, puedes modificar la propiedad
zIndex
para ajustar su posición en relación con otras capas de mosaicos. - Para asignar el objeto
GMSTileLayer
al mapa, configura su propiedadmap
.
El SDK de Maps para iOS proporciona tres clases que se pueden usar para implementar una capa de mosaicos. Con cada clase, deberás definir cómo recuperar el mosaico de mapa correcto para un conjunto determinado de coordenadas {x,y,zoom}
. Las opciones disponibles son las siguientes:
- Crea la subclase
GMSSyncTileLayer
, proporciona la implementación detileForX:y:zoom
que muestra instancias deUIImage
. - Crea la subclase
GMSTileLayer
, proporciona la implementación del método asíncronorequestTileForX:y:zoom
que luego vuelve a llamar con una imagen de mosaico. - Usa la clase existente,
GMSURLTileLayer
, para recuperar mosaicos automáticamente a partir de las URLs, lo que proporciona el bloqueGMSTileURLConstructor
.GMSURLTileLayer
es una clase concreta con la cual no se puede crear una subclase.
En el caso de la creación de subclases GMSSyncTileLayer
o GMSTileLayer
, proporcionar un resultado de mosaico nil
le indicará al SDK de Maps para iOS que los datos no están disponibles actualmente, pero que podrían estarlo en el futuro. Como alternativa, muestra kGMSTileLayerNoTile
para indicar que no hay mosaicos en esta ubicación.
Para GMSURLTileLayer
, si se muestra nil
de GMSTileURLConstructor
, se indicará que no hay mosaicos en esta ubicación.
Cómo usar "GMSURLTileLayer" para obtener mosaicos a partir de URLs
GMSURLTileLayer
no requiere subclases, pero deberás implementar el bloque GMSTileURLConstructor
. En el siguiente código, se muestra cómo usar GMSURLTileLayer
para mostrar el plano del edificio de un edificio de varios pisos.
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;
Crea la subclase GMSSyncTileLayer
para que entregue tarjetas como UIImage
.
GMSSyncTileLayer
y GMSTileLayer
son clases abstractas diseñadas para crear subclases de ellas. Puedes usar estas clases para entregar tarjetas como UIImage
. En el siguiente ejemplo, se muestra cómo renderizar una imagen personalizada sobre algunos de los mosaicos del mapa subclasificando 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
Para agregar la capa a tu mapa, crea una instancia del objeto y configura su propiedad “mapa”.
Swift
let layer = TestTileLayer() layer.map = mapView
Objective‑C
GMSTileLayer *layer = [[TestTileLayer alloc] init]; layer.map = mapView;
Mosaicos de valores altos de PPP para dispositivos con tecnología Retina
Puedes usar imágenes con valores altos de DPI con GMSSyncTileLayer
o GMSURLTileLayer
si estableces tileSize
en 512.
La propiedad tileSize
indica la cantidad de píxeles que preferirán mostrar las imágenes de mosaico que se muestran. El valor predeterminado es 256, que es la dimensión de un mosaico de Google Maps en un dispositivo que no es Retina.
Si muestras mosaicos con un valor normal de DPI en un dispositivo con valores altos de DPI, puedes aumentar la escala de las imágenes si estableces tileSize
en 512. Ten en cuenta que aumentar el tamaño de las imágenes puede reducir la calidad de la imagen, especialmente en el caso de las líneas finas o el texto. Para obtener mejores resultados, haz coincidir el tileSize
y los DPI de la imagen con la pantalla. Los mapas que se muestran en un dispositivo Retina tendrán el mejor aspecto cuando se muestren imágenes con valores altos de DPI con un valor de tileSize
de 512; mientras que los mapas que se muestren en un dispositivo que no sea Retina se verán muy bien con imágenes normales y con el valor predeterminado tileSize
de 256.
Cómo borrar mosaicos inactivos
Si los mosaicos proporcionados por la capa se vuelven "inactivos", se debe llamar al método clearTileCache
en la capa para forzar una actualización. Esto hará que se vuelvan a cargar todos los mosaicos de esta capa.
Swift
layer.clearTileCache()
Objective‑C
[layer clearTileCache];