Sie können Bilder als Kachelebenen auf Ihre Karte legen. Kachelebenen werden mit einer bestimmten Zoomstufe über einer Kartenkachel platziert. Mit genügend Kacheln können Sie die Kartendaten von Google für die gesamte Karte in mehreren Zoomstufen ergänzen.
Einführung
Kachelebenen (auch Kachel-Overlays genannt) ermöglichen das Einblenden von Bildern über Basiskacheln von Google. Das ist eine hervorragende Möglichkeit, um Ihrer App Daten wie POIs oder Verkehrsinformationen sowie lokale Bilder hinzuzufügen. Wenn Sie sie mit dem Kartentyp kGMSTypeNone
kombinieren, können Sie die Basiskartendaten von Google effektiv mit Ihren eigenen Kartendaten ersetzen.
Kachelebenen sind nützlich, wenn Sie der Karte umfassendes Bildmaterial hinzufügen möchten, das normalerweise große geografische Bereiche abdeckt. Im Gegensatz dazu sind Boden-Overlays hilfreich, wenn Sie ein einzelnes Bild an einem Punkt der Karte fixieren möchten.
Kachelkoordinaten
Die Google Maps API unterteilt Bilder bei jeder Zoomstufe in eine Reihe quadratischer Kartenkacheln, die in einem Raster angeordnet sind. Wenn eine Karte zu einem neuen Standort oder zu einer neuen Zoomstufe gescrollt wird, bestimmt die Maps API, welche Kacheln erforderlich sind, und übersetzt diese in einen abzurufenden Kachelsatz.
Bei der Implementierung der Mercator-Projektion in Google befindet sich die Kachel mit den Koordinaten (0,0) immer in der nordwestlichen Ecke der Karte. Die x
-Werte nehmen von Westen nach Osten und die y
-Werte von Norden nach Süden zu.
Kacheln werden mithilfe von x,y
-Koordinaten aus diesem Ursprung indexiert. Zum Beispiel kann bei Zoomstufe 2, wenn die Erde in 16 Kacheln aufgeteilt ist, jede einzelne Kachel durch ein eindeutiges x,y
-Paar bezeichnet werden:
Jede Kachel ist ein Quadrat mit 256x256 Punkten. Bei Zoomstufe 0 wird die ganze Welt in einer einzigen Kachel gerendert. Jede Zoomstufe erhöht die Vergrößerung um den Faktor zwei. Bei Zoomstufe 1 wird die Karte also als 2-x-2-Raster, bei Zoomstufe 2 als 4-x-4-Raster, bei Zoomstufe 3 als 8-x-8-Raster gerendert. Wenn Sie Bilder für eine Kachelebene erstellen, müssen Sie für jede Kachel, die Sie unterstützen möchten, ein neues Bild im Format 256 x 256 erstellen.
Hinzufügen einer Kachelebene
- Instanziieren Sie ein
GMSURLTileLayer
-Objekt oder eine benutzerdefinierte Unterklasse vonGMSTileLayer
/GMSSyncTileLayer
. - Ändern Sie optional das Attribut
zIndex
, um seine Position im Verhältnis zu anderen Kachelebenen anzupassen. - Weisen Sie der Karte das Objekt
GMSTileLayer
zu. Legen Sie dazu das Attributmap
fest.
Das Maps SDK for iOS bietet drei Klassen, mit denen eine Kachelebene implementiert werden kann. Für jede Klasse müssen Sie festlegen, wie die richtige Kartenkachel für einen bestimmten Satz von {x,y,zoom}
-Koordinaten abgerufen werden soll. Folgende Optionen sind verfügbar:
- Unterklasse
GMSSyncTileLayer
, mit der die Implementierung vontileForX:y:zoom
bereitgestellt wird, dieUIImage
-Instanzen zurückgibt. - Erstellen Sie eine Unterklasse von
GMSTileLayer
, mit der die asynchrone MethoderequestTileForX:y:zoom
bereitgestellt wird, die später mit einem Kachelbild zurückruft. - Verwenden Sie die vorhandene Klasse
GMSURLTileLayer
, um Kacheln automatisch aus URLs abzurufen und denGMSTileURLConstructor
-Block anzugeben.GMSURLTileLayer
ist eine konkrete Klasse, für die keine Unterklassen erstellt werden können.
Beim Erstellen von Unterklassen von GMSSyncTileLayer
oder GMSTileLayer
wird durch das Bereitstellen eines nil
-Kachelergebnisses mitgeteilt, dass das Maps SDK for iOS derzeit nicht verfügbar ist. Diese Daten werden aber möglicherweise in Zukunft verfügbar sein. Alternativ können Sie kGMSTileLayerNoTile
zurückgeben, um anzugeben, dass an dieser Position keine Kachel vorhanden ist.
Bei GMSURLTileLayer
gibt die Rückgabe von nil
aus GMSTileURLConstructor
an, dass an diesem Ort keine Kachel vorhanden ist.
Kacheln mithilfe von „GMSURLTileLayer“ von URLs abrufen
Für GMSURLTileLayer
ist keine Unterklasse erforderlich. Sie müssen aber den GMSTileURLConstructor
-Block implementieren. Der folgende Code zeigt, wie Sie den Gebäudeplan eines mehrstöckigen Gebäudes mit GMSURLTileLayer
aufrufen.
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;
Abgeleitete GMSSyncTileLayer
-Klasse, um Kacheln als UIImage
bereitzustellen
GMSSyncTileLayer
und GMSTileLayer
sind abstrakte Klassen, die für die Unterklasse bestimmt sind. Sie können diese Klassen verwenden, um Kacheln als Klassen von UIImage
bereitzustellen. Das folgende Beispiel zeigt, wie ein benutzerdefiniertes Bild über einige der Kacheln auf der Karte gerendert wird. Dazu erstellen Sie eine Unterklasse von 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
Um die Kachelebene zur Karte hinzuzufügen, instanziieren Sie das Objekt und legen Sie seine Karteneigenschaft fest.
Swift
let layer = TestTileLayer() layer.map = mapView
Objective-C
GMSTileLayer *layer = [[TestTileLayer alloc] init]; layer.map = mapView;
Kacheln mit hohem DPI-Wert für Retina-Geräte
Sie können Bilder mit hohem DPI-Wert entweder mit GMSSyncTileLayer
oder GMSURLTileLayer
verwenden, indem Sie tileSize
auf 512 festlegen.
Die Eigenschaft tileSize
gibt die Anzahl der Pixel an, die für die zurückgegebenen Kachelbilder bevorzugt angezeigt werden. Der Standardwert ist 256, also die Dimension einer Google Maps-Kachel auf einem Nicht-Retina-Gerät.
Wenn Sie normale DPI-Kacheln auf einem Gerät mit hohem DPI-Wert anzeigen, können Sie die Bilder hochskalieren, indem Sie tileSize
auf 512 setzen. Das Hochskalieren von Bildern kann die Bildqualität verringern, insbesondere bei feinen Linien oder Text. Für optimale Ergebnisse sollten tileSize
und Bild-DPI dem Display entsprechen. Karten, die auf einem Retina-Gerät dargestellt werden, sehen am besten aus, wenn Bilder mit hohem DPI-Wert mit einem tileSize
von 512 angezeigt werden. Karten, die auf einem Nicht-Retina-Gerät angezeigt werden, sehen in Bezug auf normale Bilder und den Standard-tileSize
256 toll aus.
Veraltete Kacheln werden gelöscht
Wenn die von der Ebene bereitgestellten Kacheln veraltet sind, sollte für die Ebene die Methode clearTileCache
aufgerufen werden, um eine Aktualisierung zu erzwingen. Dadurch werden alle Kacheln auf dieser Ebene neu geladen.
Swift
layer.clearTileCache()
Objective-C
[layer clearTileCache];