Kachelebenen

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.
Plattform auswählen: Android iOS JavaScript

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:

Weltkarte, unterteilt in vier Zeilen und vier Spalten mit Kacheln.

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

  1. Instanziieren Sie ein GMSURLTileLayer-Objekt oder eine benutzerdefinierte Unterklasse von GMSTileLayer/GMSSyncTileLayer.
  2. Ändern Sie optional das Attribut zIndex, um seine Position im Verhältnis zu anderen Kachelebenen anzupassen.
  3. Weisen Sie der Karte das Objekt GMSTileLayer zu. Legen Sie dazu das Attribut map 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 von tileForX:y:zoom bereitgestellt wird, die UIImage-Instanzen zurückgibt.
  • Erstellen Sie eine Unterklasse von GMSTileLayer, mit der die asynchrone Methode requestTileForX: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 den GMSTileURLConstructor-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];