Warstwy kafelków

Wybierz platformę: Android iOS JavaScript

Możesz dodawać obrazy na mapie jako warstwę kafelków. Warstwy kafelków są umieszczone nad kafelkiem mapy na określonym poziomie powiększenia. Gdy masz wystarczającą liczbę kafelków, może uzupełniać dane Google dotyczące całej mapy w różnych poziomach powiększenia.

Wprowadzenie

Warstwy kafelków (nazywane też warstwami kafelków) umożliwiają nakładanie na podstawowych kafelkach mapy Google. To świetny sposób na dodawanie danych - takich jak ciekawe miejsca lub informacje o natężeniu ruchu, oraz zdjęcia lokalne w do aplikacji. W połączeniu z mapą kGMSTypeNone warstwy kafelków pozwalają skutecznie zastąpić dane mapy podstawowej Google własnymi.

Warstwy kart są przydatne, jeśli chcesz dodać obszerne zdjęcia. Zwykle na dużych obszarach geograficznych. W przeciwieństwie do tego metoda ziemi nakładki są przydatne, gdy chcesz poprawić pojedynczy obraz punkt na mapie.

Współrzędne kafelka

Interfejs API Map Google dzieli zdjęcia przy każdym powiększeniu na zestaw map kwadratowych kafelki; są one rozmieszczone w ułożonej siatce. Gdy mapa przewinie się do nową lokalizację lub nowy poziom powiększenia, interfejs API Map Google określa, które kafelki i przekształca je w zestaw kafelków do pobrania.

W przypadku implementacji przez Google odwzorowania Merkatora kafelek z współrzędna (0,0) jest zawsze w północno-zachodnim rogu mapy, z wartościami x rosną z zachodu na wschód, a wartości y rosną z północy na południe. Kafelki są indeksowane za pomocą współrzędnych x,y z tego punktu początkowego. Na przykład przy poziom powiększenia 2. Kiedy Ziemia jest podzielona na 16 kafelków, każdy kafelek można , do której odwołuje się unikalna para x,y:

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

Każdy kafelek mapy to kwadrat o wymiarach 256 x 256 punktów. Przy powiększeniu 0 cały świat widzi na jednym kafelku. Każdy poziom powiększenia zwiększa powiększenie dwa. Przy powiększeniu 1 mapa będzie renderowana jako siatka 2 x 2 lub siatkę 4 x 4 przy powiększeniu 2, siatkę 8 x 8 przy powiększeniu 3 itd. Jeśli tworzysz obrazy na warstwę kafelków, musisz utworzyć nowy Obraz 256 x 256 punktów dla każdego kafelka przy każdym obsługiwanym poziomie powiększenia.

Dodawanie warstwy kafelka

  1. Utwórz instancję obiektu GMSURLTileLayer lub niestandardową podklasę GMSTileLayer/GMSSyncTileLayer.
  2. Opcjonalnie zmodyfikuj właściwość zIndex, by dostosować jej pozycję w odniesieniu do innych warstw płytek.
  3. Przypisz obiekt GMSTileLayer do mapy, ustawiając jego map usłudze.

Maps SDK na iOS udostępnia 3 klasy, których można użyć do: zaimplementuj warstwę kafelków. Przy każdej klasie musisz określić sposób pobierania prawidłowy kafelek mapy dla danego zestawu współrzędnych {x,y,zoom}. dostępne opcje to:

  • Podklasa GMSSyncTileLayer, zapewniająca implementację tileForX:y:zoom, która zwraca UIImage instancji.
  • Podklasa GMSTileLayer udostępniająca implementację asynchronicznego metoda requestTileForX:y:zoom, która później wywołuje metodę z obrazem kafelka.
  • Użyj istniejącej klasy, GMSURLTileLayer, aby automatycznie pobierać kafelki z adresów URL, udostępniając blok GMSTileURLConstructor. GMSURLTileLayer jest konkretną klasą, której nie można podklasyfikować.

W przypadku podklasyfikacji GMSSyncTileLayer lub GMSTileLayer zostanie podany parametr Wynik kafelka nil będzie informować pakiet SDK Maps na iOS, że dane są obecnie dostępne niedostępny, ale może być dostępny w przyszłości. Ewentualnie zwrócij kGMSTileLayerNoTile, aby wskazać, że w tym miejscu nie ma żadnego kafelka lokalizacji.

W przypadku GMSURLTileLayer zwrot nil z GMSTileURLConstructor będzie wskazują, że w tym miejscu nie ma żadnego kafelka.

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

GMSURLTileLayer nie wymaga podklasy, ale musisz i zaimplementować blok GMSTileURLConstructor. Poniższy kod pokazuje, jak Użyj pola GMSURLTileLayer, by wyświetlić plan piętra wielopoziomowego budynku.

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 wyświetla kafelki jako UIImage

GMSSyncTileLayer i GMSTileLayer to klasy abstrakcyjne, które mają na celu podklasy. Możesz użyć tych klas do wyświetlania kafelków jako elementów UIImage. Poniższe informacje przykład pokazuje, jak wyświetlić 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 instancję 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 High DPI na urządzenia Retina

W GMSSyncTileLayer możesz używać obrazów o wysokiej rozdzielczości DPI lub GMSURLTileLayer, ustawiając tileSize na 512. Właściwość tileSize wskazuje liczbę pikseli, które zwrócił zwrócony kafelek. jako, domyślna wartość to 256, czyli wymiar kafelka Map Google na urządzeniu innym niż Retina.

Jeśli są wyświetlane normalne kafelki DPI na urządzeniu o wysokiej rozdzielczości DPI, można obrazy można zwiększyć przez ustawienie parametru tileSize na 512. Pamiętaj, że skalowanie obrazów może zmniejszyć jakości obrazu, szczególnie w przypadku drobnych linii i tekstu. Aby uzyskać najlepsze wyniki, użyj parametru tileSize i DPI obrazu na wyświetlaczu. Mapy wyświetlane na urządzeniu Retina wyglądają najlepiej przy wyświetlaniu obrazów o wysokiej rozdzielczości DPI przy współczynniku tileSize o wartości 512 pikseli; natomiast mapy wyświetlane na urządzeniach innych niż Retina będą wyglądać lepiej na zwykłych obrazach. i domyślna wartość tileSize wynosząca 256.

Czyszczenie nieaktualnych kafelków

Jeśli kafelki udostępnione przez warstwę staną się „nieaktualne”, Aby wymusić odświeżenie, należy wywołać metodę clearTileCache w warstwie. Dzięki temu wszystkie kafelki w tej warstwie zostaną ponownie załadowane.

Swift

layer.clearTileCache()
      

Objective-C

[layer clearTileCache];