Vous pouvez ajouter des images au-dessus de votre carte sous la forme d'un calque de tuiles. Les calques de tuiles sont placés au-dessus d'une tuile de carte à un niveau de zoom spécifique. Avec suffisamment de tuiles, vous pouvez compléter les données de carte de Google pour l'ensemble de la carte, à différents niveaux de zoom.
Introduction
Les calques de tuiles (parfois appelés superpositions de tuiles) vous permettent de superposer des images sur les tuiles de la carte de base de Google. Il s'agit d'un excellent moyen d'ajouter des données, telles que des points d'intérêt ou des informations sur la circulation, ainsi que des images locales à votre application. Lorsqu'ils sont associés au type de carte kGMSTypeNone
, les calques de tuiles vous permettent de remplacer efficacement les données de la carte de base de Google par les vôtres.
Les calques de tuiles sont utiles lorsque vous souhaitez ajouter à la carte un grand nombre d'images, généralement couvrant de vastes zones géographiques. En revanche, les superpositions au sol sont utiles lorsque vous souhaitez corriger une seule image en un seul point de la carte.
Coordonnées de tuile
L'API Google Maps divise les images à chaque niveau de zoom en un ensemble de tuiles de carte carrées organisées dans une grille ordonnée. Lorsqu'une carte défile jusqu'à un nouveau point géographique ou change de niveau de zoom, l'API Google Maps détermine quelles tuiles sont nécessaires et les convertit en un ensemble de tuiles à récupérer.
Pour l'implémentation de la projection de Mercator par Google, la tuile avec les coordonnées (0,0) se trouve toujours dans l'angle nord-ouest de la carte, avec les valeurs x
augmentant d'ouest en est et les valeurs y
augmentant du nord au sud.
Les tuiles sont indexées au moyen des coordonnées x,y
à partir de cette origine. Par exemple, au niveau de zoom 2, lorsque la Terre est divisée en 16 tuiles, chaque tuile peut être référencée par une paire x,y
unique:
Chaque tuile de carte est un carré de 256x256 points. À un niveau de zoom 0, le monde entier est affiché sous la forme d'une seule tuile. Chaque niveau de zoom augmente le grossissement avec un facteur de deux. Ainsi, à un niveau de zoom 1, le rendu de la carte est effectué sous forme de grille de tuiles de 2x2, de grille 4x4 au niveau de zoom 2, de grille de 8x8 au niveau de zoom 3, etc. Si vous créez des images pour un calque de tuiles, vous devez créer une image de 256 x 256 points pour chaque tuile à chaque niveau de zoom que vous souhaitez prendre en charge.
Ajouter un calque de tuiles
- Instanciez un objet
GMSURLTileLayer
ou une sous-classe personnalisée deGMSTileLayer
/GMSSyncTileLayer
. - Si vous le souhaitez, modifiez la propriété
zIndex
pour ajuster sa position par rapport aux autres calques de tuiles. - Attribuez l'objet
GMSTileLayer
à la carte en définissant sa propriétémap
.
Le SDK Maps pour iOS fournit trois classes permettant d'implémenter un calque de tuiles. Pour chaque classe, vous devez définir comment extraire la tuile de carte appropriée pour un ensemble donné de coordonnées {x,y,zoom}
. Les options disponibles sont les suivantes :
- Sous-classe
GMSSyncTileLayer
, qui fournit l'implémentation detileForX:y:zoom
qui renvoie des instancesUIImage
. - Sous-classe
GMSTileLayer
, fournissant l'implémentation de la méthode asynchronerequestTileForX:y:zoom
qui appelle ultérieurement une image de tuile. - Utilisez la classe existante
GMSURLTileLayer
pour récupérer automatiquement les tuiles à partir des URL, en fournissant le blocGMSTileURLConstructor
.GMSURLTileLayer
est une classe concrète qui ne peut pas être sous-classée.
Dans le cas du sous-classement de GMSSyncTileLayer
ou de GMSTileLayer
, fournir un résultat de tuile nil
indique au SDK Maps pour iOS que les données sont actuellement indisponibles, mais qu'elles le seront peut-être à l'avenir. Vous pouvez également renvoyer kGMSTileLayerNoTile
pour indiquer qu'il n'y a pas de carte à cet emplacement.
Pour GMSURLTileLayer
, renvoyer nil
à partir de GMSTileURLConstructor
indique qu'il n'y a pas de carte à cet emplacement.
Utilisation de "GMSURLTileLayer" pour récupérer des tuiles à partir d'URL
Le GMSURLTileLayer
ne nécessite pas de sous-classement, mais vous devrez implémenter le bloc GMSTileURLConstructor
. Le code ci-dessous montre comment utiliser GMSURLTileLayer
pour afficher le plan d'étage d'un bâtiment à plusieurs étages.
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;
Sous-classe GMSSyncTileLayer
pour diffuser des tuiles en tant que UIImage
GMSSyncTileLayer
et GMSTileLayer
sont des classes abstraites conçues pour être sous-classées. Vous pouvez utiliser ces classes pour diffuser des cartes en tant que UIImage
. L'exemple ci-dessous montre comment afficher une image personnalisée sur certaines des tuiles de la carte en sous-classant 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
Pour ajouter le calque à votre carte, instanciez l'objet et définissez ses propriétés de carte.
Swift
let layer = TestTileLayer() layer.map = mapView
Objective-C
GMSTileLayer *layer = [[TestTileLayer alloc] init]; layer.map = mapView;
Tuiles haute résolution pour appareils Retina
Vous pouvez utiliser des images à PPP élevé avec GMSSyncTileLayer
ou GMSURLTileLayer
en définissant tileSize
sur 512.
La propriété tileSize
indique le nombre de pixels sous lequel les images de tuiles renvoyées préféreront s'afficher. La valeur par défaut est 256, soit la dimension d'une tuile Google Maps sur un appareil autre que Retina.
Si vous affichez des tuiles PPP normales sur un appareil à PPP élevé, vous pouvez augmenter la taille des images en définissant tileSize
sur 512. Notez que l'augmentation de la taille des images peut réduire leur qualité, en particulier pour les lignes fines ou le texte. Pour de meilleurs résultats, faites correspondre la valeur de tileSize
et la valeur PPP de l'image à l'écran. Les cartes affichées sur un appareil Retina bénéficient d'un rendu optimal en cas d'affichage d'images haute résolution avec un tileSize
de 512. En revanche, celles affichées sur un appareil autre que Retina s'affichent de manière optimale avec des images normales et la valeur tileSize
par défaut est de 256.
Effacer des tuiles obsolètes
Si les tuiles fournies par le calque deviennent "obsolètes", la méthode clearTileCache
doit être appelée sur le calque pour forcer l'actualisation. Cela permettra d'actualiser toutes les tuiles de ce calque.
Swift
layer.clearTileCache()
Objective-C
[layer clearTileCache];