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 encima de los mosaicos de mapas básicos de Google. Esta es una excelente manera de agregar datos, como información sobre puntos de interés o tráfico, y también imágenes locales a tu app. Cuando se combinan con el tipo de mapa kGMSTypeNone
, las capas de mosaicos te permiten reemplazar de manera eficaz los datos de mapas básicos de Google por datos propios.
Las capas de mosaicos son útiles cuando deseas agregar muchas imágenes al mapa, que, por lo general, cubren áreas geográficas extensas. Por el contrario, las superposiciones de suelo resultan útiles cuando deseas fijar una sola imagen en un punto del mapa.
Coordenadas del mosaico
La Google Maps API desglosa las imágenes a cada nivel de zoom y forma un conjunto de mosaicos de mapa cuadrados dispuestos en una cuadrícula ordenada. Cuando en un mapa se aplica desplazamiento hacia una nueva ubicación, o un cambio en el nivel de zoom, la Google Maps API determina los mosaicos necesarios y convierte esa información en un conjunto de mosaicos que se recuperarán.
En la implementación de la proyección Mercator en Google, el mosaico con coordenadas (0,0) siempre se encuentra en la esquina noroeste del mapa. Los valores de x
aumentan de oeste a este y los de y
aumentan de norte a sur.
Los mosaicos se indexan utilizando las coordenadas x,y
a partir de ese origen. 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 todo el mundo en un solo mosaico. Cada nivel de zoom duplica la magnificación. Por lo tanto, en el nivel de zoom 1, el mapa se representará como una cuadrícula de mosaicos de 2 × 2, en el 2 como una cuadrícula de 4 × 4, en el 3 como una cuadrícula de 8 × 8 y así sucesivamente. Si creas imágenes para una capa de mosaicos, deberás crear una nueva imagen de 256 x 256 para cada mosaico a 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
. - Como alternativa, puedes modificar la propiedad
zIndex
para ajustar su posición en relación con otras capas de mosaicos. - Asigna el objeto
GMSTileLayer
al mapa configurando 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 la manera de obtener
el mosaico de mapa correcto para un conjunto determinado de coordenadas {x,y,zoom}
. Las opciones disponibles son las siguientes:
- Crea una subclase de
GMSSyncTileLayer
que proporcione la implementación detileForX:y:zoom
que devuelva instancias deUIImage
. - Crea una subclase de
GMSTileLayer
, que proporciona la implementación del método asíncronorequestTileForX:y:zoom
que, más adelante, vuelve a realizar una llamada con una imagen de mosaico. - Usa la clase existente,
GMSURLTileLayer
, para recuperar mosaicos automáticamente a partir de URLs. Esto 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 de GMSSyncTileLayer
o GMSTileLayer
, si el resultado de mosaicos es nil
, se le indicará al SDK de Maps para iOS que los datos no están disponibles en este momento, pero que pueden estar disponibles en el futuro. Como alternativa, muestra kGMSTileLayerNoTile
para indicar que no hay mosaicos en esta ubicación.
En el caso de GMSURLTileLayer
, mostrar nil
desde GMSTileURLConstructor
indicará que no hay mosaicos en esta ubicación.
Usa 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 de un edificio de varias plantas.
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 una subclase de GMSSyncTileLayer para entregar mosaicos como UIImage
GMSSyncTileLayer
y GMSTileLayer
son clases abstractas diseñadas para subclasificarse. Puedes usar estas clases para proporcionar mosaicos como UIImage
. En el siguiente ejemplo, se muestra cómo renderizar una imagen personalizada sobre algunos de los mosaicos del mapa creando una subclase de 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 de alta resolución con GMSSyncTileLayer
o GMSURLTileLayer
configurando tileSize
en 512.
La propiedad tileSize
indica la cantidad de píxeles que se preferirá para las imágenes de mosaico que se devuelven. El valor predeterminado es 256, la dimensión de un mosaico de Google Maps en un dispositivo que no tiene tecnología Retina.
Si muestras mosaicos con un volumen de PPP normal en un dispositivo de valores altos de PPP, puedes aumentar la resolución de las imágenes configurando tileSize
en 512. Ten en cuenta que el aumento de la resolución de las imágenes puede reducir la calidad de estas, en especial en el caso de las líneas delgadas o el texto. Para obtener los mejores resultados, adecuatileSize
y los PPP de la imagen a la pantalla. La mejor visualización de los mapas que aparezcan en un dispositivo con tecnología Retina{}podrá obtenerse al mostrar imágenes de valores altos de PPP con un valor de tileSize
de “512”. Por otra parte,{}el aspecto de los mapas que se muestren en dispositivos que no tengan tecnología Retina será muy bueno con imágenes normales{}y el valor predeterminado de “256” en el caso de tileSize
.
Cómo borrar mosaicos inactivos
Si los mosaicos proporcionados por la capa “caducan”, debes llamar al método clearTileCache
en la capa para forzar una actualización. Esto hará que vuelvan a cargarse todos los mosaicos de esta capa.
Swift
layer.clearTileCache()
Objective-C
[layer clearTileCache];