Warstwy płytek

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.
Wybierz platformę: Android iOS JavaScript

Na mapie możesz umieszczać obrazy jako warstwę. Warstwy z kafelkami są umieszczane nad kafelkiem mapy na określonym poziomie powiększenia. Mając wystarczającą liczbę kafelków, możesz uzupełnić dane Google o całą mapę, korzystając z wielu stopni powiększenia.

Wprowadzenie

Warstwy map (czasami nazywane nakładkami z fragmentami mapy) pozwalają nakładać obrazy na podstawowe kafelki mapy Google. To świetny sposób na dodawanie do aplikacji danych, takich jak ciekawe miejsca czy informacje o ruchu drogowym, oraz zdjęć miejscowych. W połączeniu z typem mapy kGMSTypeNone warstwy z kafelkami umożliwiają zastępowanie podstawowych danych mapy Google własnymi.

Warstwy z fragmentami mapy są przydatne, gdy chcesz dodać do mapy rozbudowane zdjęcia, które zwykle obejmują duże obszary geograficzne. Natomiast nakładki na powierzchni są przydatne, gdy chcesz poprawić pojedynczy obraz na mapie.

Współrzędne fragmentu

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

W celu wdrożenia odwzorowania Merkatora na mapie wyświetlany jest zawsze obszar w północno-zachodnim rogu mapy, w którym wartości x rosną z zachodu na wschód, a y z północy na południe. Kafelki są indeksowane przy użyciu współrzędnych x,y z tego źródła. Na przykład na poziomie powiększenia 2, gdy Ziemia jest podzielona na 16 kafelków, każdy kafelek może odwoływać się do unikalnej pary x,y:

Mapa świata podzielona na 4 wiersze i 4 kolumny.

Każdy kafelek mapy jest kwadratem o rozmiarze 256 x 256. Na poziomie 0 cały świat jest renderowany w jednym kafelku. Każdy poziom powiększenia zwiększa powiększenie o dwa poziomy. W przypadku powiększenia na poziomie 1 mapa będzie renderowana jako siatka 2 x 2, siatka 4 x 4 przy powiększeniu na 2, siatka 8 x 8 przy powiększeniu na poziomie 3 itd. Jeśli tworzysz obrazy na warstwę kafelków, musisz utworzyć nowy obraz punktowy o rozmiarze 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ę GMSURLTileLayer lub niestandardową podklasę GMSTileLayer/GMSSyncTileLayer.
  2. Opcjonalnie zmodyfikuj właściwość zIndex, aby dostosować jej położenie względem innych warstw kafelków.
  3. Przypisz obiekt GMSTileLayer do mapy, ustawiając jego właściwość map.

Maps SDK na iOS udostępnia 3 klasy do wdrożenia warstwy kafelków. W przypadku każdej klasy musisz określić, jak pobrać właściwy 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 UIImage instancje.
  • Podklasa GMSTileLayer, która zapewnia implementację metody asynchronicznego requestTileForX:y:zoom, która później wywołuje odpowiedź z obrazem kafelka.
  • Użyj istniejącej klasy GMSURLTileLayer, aby automatycznie pobierać kafelki z adresów URL przy użyciu bloku GMSTileURLConstructor. GMSURLTileLayer to konkretna klasa, której nie można klasyfikować.

W przypadku podklasy GMSSyncTileLayer lub GMSTileLayer podanie kafelka wyniku 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ć 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 elementu „GMSURLTileLayer” do pobierania kafelków z adresów URL

GMSURLTileLayer nie wymaga podklasy, ale musisz zaimplementować blok GMSTileURLConstructor. Poniższy kod pokazuje, jak użyć GMSURLTileLayer, aby 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, aby wyświetlać kafelki jako element UIImage

GMSSyncTileLayer i GMSTileLayer to abstrakcyjne klasy, które zostały przeznaczone do podkategorii. Za ich pomocą możesz wyświetlać kafelki jako UIImage. Poniższy przykład pokazuje, jak renderować niestandardowy obraz na niektórych kafelkach na mapie przez 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 wystąpienie obiektu i ustaw jego właściwość mapy.

Swift

let layer = TestTileLayer()
layer.map = mapView
      

Objective-C

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

Kafelki o wysokiej rozdzielczości DPI na urządzeniach z wyświetlaczem Retina

Obrazów o wysokiej rozdzielczości DPI możesz używać z GMSSyncTileLayer lub GMSURLTileLayer przez ustawienie tileSize na 512. Właściwość tileSize wskazuje liczbę pikseli, które będą wyświetlane jako zwrócone obrazki. Wartość domyślna to 256 – wymiar kafelka Map Google na urządzeniu nie typu Retina.

Jeśli wyświetlasz zwykłe kafelki DPI na urządzeniu o wysokiej rozdzielczości DPI, możesz skalować obrazy w górę, ustawiając tileSize na 512. Pamiętaj, że skalowanie obrazów może obniżać jakość obrazu, szczególnie w przypadku wąskich linii lub tekstu. Aby uzyskać najlepsze wyniki, dopasuj DPI tileSize i obraz do wyświetlacza. Mapy wyświetlane na urządzeniu z wyświetlaczem Retina będą wyglądały jak najlepiej na zdjęciach o wysokiej rozdzielczości DPI przy wartości tileSize 512, a na urządzeniach bez tej funkcji będą wyglądały dobrze również w przypadku zwykłych zdjęć oraz wartości domyślnej tileSize (256).

Czyszczenie nieaktualnych kafelków

Jeśli kafelki podane w warstwie staną się „stale”, należy wywołać w nich metodę clearTileCache, by wymusić odświeżenie. Spowoduje to ponowne załadowanie wszystkich kafelków tej warstwy.

Swift

layer.clearTileCache()
      

Objective-C

[layer clearTileCache];