Warstwy płytek

Wybierz platformę: Android iOS JavaScript

Możesz dodawać obrazy do mapy jako warstwę. Warstwy z fragmentami mapy są umieszczane nad kafelkiem mapy przy określonym poziomie powiększenia. Wystarczająca liczba kafelków, możesz uzupełnić dane mapy Google o całą przestrzeń przy kilku poziomach powiększenia.

Wprowadzenie

Warstwy z fragmentami mapy (czasami nazywane nakładkami z płytek) umożliwiają nakładanie obrazów na podstawowe kafelki mapy Google. To doskonały sposób na dodanie do aplikacji danych, takich jak ciekawe miejsca lub informacje o ruchu drogowym, oraz lokalnych zdjęć. W połączeniu z typem mapy kGMSTypeNone warstwy kafelkowe umożliwiają zamianę podstawowych danych mapy Google na własne.

Warstwy z fragmentami mapy są przydatne, gdy chcesz dodać do mapy rozbudowane obrazy, zwykle obejmujące duże obszary geograficzne. Natomiast nakładki naziemne są przydatne, gdy chcesz poprawić jeden obraz w jednym miejscu na mapie.

Współrzędne fragmentu

Interfejs API Map Google dzieli zdjęcia przy każdym powiększeniu na zestaw kwadratowych kafelków mapy ułożonych w siatkę. Gdy mapa przewija się do nowej lokalizacji lub do nowego poziomu powiększenia, interfejs API Map Google określa, które kafelki są potrzebne, i przekształca je w zestaw kafelków do pobrania.

W Google implementuje odwzorowanie Merkatora. Kafelek ze współrzędną (0,0) jest zawsze w północno-zachodnim rogu mapy. Wartości x rosną z zachodu na wschód, a y z północy na południe. Karty są indeksowane przy użyciu współrzędnych x,y z tego źródła. Na przykład na poziomie poziomu 2, gdy Ziemia jest podzielona na 16 kafelków, do każdego kafelka może się odwoływać unikalna para x,y:

Mapa świata podzielona na 4 wiersze i 4 kolumny z kafelkami.

Każdy kafelek mapy jest kwadratem o rozmiarze 256 x 256 punktów. Na poziomie powiększenia 0 cały świat jest renderowany w jednym kafelku. Każdy poziom powiększenia zwiększa powiększenie o dwa współczynniki. Tak więc przy poziomie powiększenia 1 mapa jest renderowana jako siatka 2 x 2, siatka 4 x 4, poziom powiększenia 2, siatka 8 × 8 na poziomie powiększenia 3 itd. Jeśli tworzysz obrazy dla warstwy płytki, musisz utworzyć nowy obraz o wymiarach 256 x 256 dla każdego kafelka na każdym poziomie powiększenia, który chcesz obsługiwać.

Dodawanie warstwy kafelka

  1. Utwórz instancję obiektu GMSURLTileLayer lub niestandardową klasę podrzędną GMSTileLayer/GMSSyncTileLayer.
  2. Opcjonalnie zmień właściwość zIndex, by dostosować jej położenie względem innych warstw kafelków.
  3. Przypisz obiekt GMSTileLayer do mapy, ustawiając jego właściwość map.

Pakiet SDK Map na iOS udostępnia 3 klasy, których można użyć do wdrożenia warstwy kafelka. W przypadku każdej klasy trzeba określić, jak pobrać prawidłowy kafelek mapy dla danego zbioru współrzędnych {x,y,zoom}. Dostępne opcje:

  • Podklasa GMSSyncTileLayer, która zapewnia implementację tileForX:y:zoom, która zwraca instancje UIImage.
  • Podklasa GMSTileLayer, która zapewnia implementację metody asynchronicznego requestTileForX:y:zoom, która później zwraca kod kafelka.
  • Użyj istniejącej klasy GMSURLTileLayer, aby automatycznie pobierać kafelki z adresów URL i udostępnić blok GMSTileURLConstructor. GMSURLTileLayer to konkretna klasa, której nie można przypisać do klasy podrzędnej.

W przypadku podklasy GMSSyncTileLayer lub GMSTileLayer podanie wyniku kafelka nil informuje pakiet SDK Map na iOS, że dane są obecnie niedostępne, ale mogą być dostępne w przyszłości. Możesz też zwrócić wartość kGMSTileLayerNoTile, aby wskazać, że w tej lokalizacji nie ma kafelka.

W przypadku GMSURLTileLayer zwracanie wartości nil z GMSTileURLConstructor wskazuje, że w tej lokalizacji nie ma kafelka.

Używanie polecenia „GMSURLTileLayer” do pobierania kafelków z adresów URL

GMSURLTileLayer nie wymaga podklasy, ale musisz zaimplementować blok GMSTileURLConstructor. Poniższy kod pokazuje, jak za pomocą GMSURLTileLayer wyświetlić plan piętra budynku wielopiętrowego.

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;
      

Podklasa GMSSyncTileLayer służąca do wyświetlania kafelków jako: UIImage

GMSSyncTileLayer i GMSTileLayer to abstrakcyjne klasy, które zostały utworzone do podkategorii. Tych zajęć możesz używać do wyświetlania kafelków jako: UIImage. Poniższy przykład pokazuje, jak utworzyć niestandardowy obraz nad niektórymi kafelkami na mapie, stosując podklasyfikację 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
      

Aby dodać warstwę do mapy, utwórz obiekt i ustaw jego właściwość mapy.

Swift

let layer = TestTileLayer()
layer.map = mapView
      

Objective-C

GMSTileLayer *layer = [[TestTileLayer alloc] init];
layer.map = mapView;
      

Płytki o wysokiej rozdzielczości dla urządzeń z wyświetlaczem Retina

Możesz używać obrazów o wysokiej rozdzielczości z wartością GMSSyncTileLayer lub GMSURLTileLayer, ustawiając tileSize na 512. Właściwość tileSize wskazuje liczbę pikseli, które mają się wyświetlać jako zwrócone kafelki. W przypadku urządzenia z urządzeniem innym niż Retina wartość domyślna to 256 kafelków.

Jeśli na urządzeniu o wysokiej rozdzielczości DPI widzisz zwykłe kafelki DPI, możesz skalować obrazy w górę, ustawiając tileSize na 512. Zwiększanie rozmiaru obrazów może obniżać jakość obrazu, zwłaszcza w przypadku linii tekstu i linii. Aby uzyskać najlepsze wyniki, dopasuj tileSize i DPI obrazu do wyświetlacza. Mapy wyświetlane na urządzeniu z ekranem Retina będą wyglądały najlepiej w przypadku obrazów o wysokiej rozdzielczości, które mają wartość tileSize wynoszącą 512, podczas gdy mapy wyświetlane na urządzeniach innych niż Retina będą wyglądały równie dobrze w przypadku zwykłych zdjęć, a domyślnie w tileSize – 256.

Usuwanie starych kafelków

Jeśli kafelki udostępnione przez warstwę staną się „stale”, wywołaj metodę clearTileCache na warstwie, aby wymusić odświeżenie. Spowoduje to ponowne załadowanie wszystkich kafelków tej warstwy.

Swift

layer.clearTileCache()
      

Objective-C

[layer clearTileCache];