Capas de mosaicos

Seleccionar plataforma: Android iOS JavaScript

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 mapa 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 locales, como puntos de interés o información sobre el tráfico, a tu app. Cuando se combinan con el tipo de mapa kGMSTypeNone, las capas de mosaicos te permiten reemplazar de manera eficaz los datos del mapa base de Google por los tuyos.

Las capas de mosaicos son útiles cuando deseas agregar muchas imágenes, por lo general, que abarcan grandes áreas geográficas al mapa. Por el contrario, 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 a cada nivel de zoom y las convierte en 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 API de Google Maps determina los mosaicos necesarios y los convierte en un conjunto de mosaicos que se deben recuperar.

Para la implementación de la proyección Mercator a través de Google, la tarjeta con coordenadas (0,0) siempre se encuentra en la esquina noroeste del mapa. Los valores de x aumentan de oeste a este y los valores de y aumentan de norte a sur. Los mosaicos se indexan usando las coordenadas x,y 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:

Mapa del mundo dividido en cuatro filas y cuatro columnas de mosaicos

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 ampliación. Por lo tanto, en el nivel de zoom 1, el mapa se renderizará como una cuadrícula de mosaicos de 2 × 2 o como una cuadrícula de 4 × 4 en el nivel de zoom 2, una cuadrícula de 8 × 8 en el nivel de zoom 3 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

  1. Crea una instancia de un objeto GMSURLTileLayer o una subclase personalizada de GMSTileLayer/GMSSyncTileLayer.
  2. De manera opcional, modifica la propiedad zIndex para ajustar su posición en relación con otras capas de mosaicos.
  3. Para asignar el objeto GMSTileLayer al mapa, configura su propiedad map.

El SDK de Maps para iOS proporciona tres clases que se pueden usar a fin de 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 y proporciona la implementación de tileForX:y:zoom que muestra instancias de UIImage.
  • Crea una subclase de GMSTileLayer, que proporcione la implementación del método asíncrono requestTileForX:y:zoom que más adelante llame con una imagen de mosaico.
  • Usa la clase GMSURLTileLayer existente para recuperar mosaicos automáticamente desde las URLs y proporciona el bloque GMSTileURLConstructor. GMSURLTileLayer es una clase concreta con la que no puede crearse una subclase.

En el caso de la creación de subclases de GMSSyncTileLayer o GMSTileLayer, proporcionar un resultado de la tarjeta nil indicará al SDK de Maps para iOS que los datos no están disponibles en el momento, pero que pueden estarlo en el futuro. También puedes mostrar kGMSTileLayerNoTile para indicar que no hay mosaicos en esta ubicación.

Para GMSURLTileLayer, si se muestra nil desde GMSTileURLConstructor, se indicará que no hay mosaicos en esta ubicación.

Cómo usar "GMSURLTileLayer" para recuperar mosaicos de URLs

GMSURLTileLayer no requiere subclase, 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 una subclase de GMSSyncTileLayer para que proporcione mosaicos como una UIImage.

GMSSyncTileLayer y GMSTileLayer son clases abstractas diseñadas para crear una subclase. Puedes usar estas clases para entregar tarjetas como las de UIImage. En el siguiente ejemplo, se muestra la subclase GMSSyncTileLayer para renderizar una imagen personalizada sobre algunos de los mosaicos del mapa.

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 DPI 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 se prefiere para mostrar las imágenes de mosaicos que se muestran. El valor predeterminado es 256, es decir, la dimensión de una tarjeta de Google Maps en un dispositivo que no cuenta con tecnología Retina.

Si muestras mosaicos de DPI normales en un dispositivo de valores altos de DPI, puedes aumentar la escala de las imágenes configurando tileSize en 512. Ten en cuenta que el escalamiento vertical de imágenes puede reducir la calidad de la imagen, en especial para líneas o textos finos. 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 se verán mejor cuando se muestren imágenes con valores altos de PPP con una tileSize de 512; mientras que los mapas que se muestran en un dispositivo que no sea Retina se verán bien con las imágenes normales y la tileSize predeterminada 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];