Możesz dodawać obrazy na mapie jako warstwę kafelków. Warstwy kafelków są umieszczane na kafelku mapy przy określonym poziomie powiększenia. Mając wystarczającą liczbę fragmentów, możesz uzupełnić dane Google całej mapy w różnych poziomach powiększenia.
Wstęp
Warstwy kafelków (nazywane też warstwami kafelków) umożliwiają nakładanie obrazów na podstawowe fragmenty mapy Google. To świetny sposób na dodawanie do aplikacji danych, np. ciekawych miejsc lub informacji o natężeniu ruchu, oraz zdjęć lokalnych. W połączeniu z mapą typu kGMSTypeNone
warstwy kafelków pozwalają skutecznie zastąpić dane mapy podstawowej Google własnymi.
Warstwy kafelków przydają się, gdy chcesz dodać do mapy obszerne zdjęcia, zwykle obejmujące duże obszary geograficzne. Z kolei nakładki na powierzchni są przydatne, gdy chcesz poprawić pojedynczy obraz w jednym punkcie mapy.
Współrzędne kafelka
Interfejs API Map Google dzieli zdjęcia na każdym poziomie powiększenia na zestaw kwadratowych kafelków mapy, które są rozmieszczone w uporządkowany sposób. Gdy mapa przewija się do nowej lokalizacji lub do nowego poziomu powiększenia, interfejs Maps API określa, które kafelki są potrzebne, i przekłada je na zestaw kafelków do pobrania.
W przypadku implementacji odwzorowania Merkatora przez Google kafelek ze współrzędną (0, 0) znajduje się zawsze w północno-zachodnim rogu mapy,przy czym wartości x
zwiększają się 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 na poziomie powiększenia 2, gdy Ziemia jest podzielona na 16 kafelków, do każdego kafelka może się odnieść unikalna para x,y
:
Każdy kafelek mapy to kwadrat o wymiarach 256 x 256 punktów. Przy powiększeniu 0 cały świat jest wyświetlany na jednym kafelku. Każdy poziom powiększenia 2-krotnie zwiększa powiększenie. W przypadku powiększenia 1 mapa będzie więc wyświetlana jako siatka 2 x 2 kafelków, siatka 4 x 4 przy powiększeniu 2, siatka 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 z każdym obsługiwanym poziomem powiększenia.
Dodawanie warstwy kafelka
- Utwórz instancję obiektu
GMSURLTileLayer
lub niestandardową podklasęGMSTileLayer
/GMSSyncTileLayer
. - Opcjonalnie zmień właściwość
zIndex
, aby dostosować jej pozycję względem innych warstw kart. - Przypisz obiekt
GMSTileLayer
do mapy, ustawiając jego właściwośćmap
.
Maps SDK na iOS udostępnia 3 klasy, których można użyć do wdrożenia warstwy kafelków. W przypadku poszczególnych zajęć musisz określić, jak pobierać prawidłowy kafelek mapy dla danego zestawu współrzędnych {x,y,zoom}
. Dostępne opcje:
- Podklasa
GMSSyncTileLayer
udostępniająca implementację klasytileForX:y:zoom
, która zwracaUIImage
instancje. - Podklasa
GMSTileLayer
zapewniająca implementację metody asynchronicznejrequestTileForX: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 blokGMSTileURLConstructor
.GMSURLTileLayer
to konkretna klasa, której nie można podklasyfikować.
W przypadku podklasyfikacji GMSSyncTileLayer
lub GMSTileLayer
podanie wyniku kafelka nil
będzie informować pakiet SDK Maps na iOS, że dane są obecnie niedostępne, ale mogą być dostępne w przyszłości. Możesz też zwrócić wartość kGMSTileLayerNoTile
, by wskazać, że w tej lokalizacji nie ma kafelka.
W przypadku GMSURLTileLayer
zwrot nil
z GMSTileURLConstructor
będzie oznaczać, że w tej lokalizacji nie ma kafelka.
Używanie „GMSURLTileLayer” do pobierania kafelków z adresów URL
GMSURLTileLayer
nie wymaga podziału na podklasy, ale musisz wdrożyć blok GMSTileURLConstructor
. Poniższy kod pokazuje, jak za pomocą pola GMSURLTileLayer
wyświetlić plan piętra w budynku wielopiętrowym.
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ą być podklasyfikowane. Możesz użyć tych klas do wyświetlania kafelków jako elementów UIImage
. Poniższy przykład pokazuje, jak wyrenderować obraz niestandardowy na niektórych kafelkach na mapie przy użyciu podklasy 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
Możesz używać obrazów o wysokiej rozdzielczości DPI z parametrami GMSSyncTileLayer
i GMSURLTileLayer
, ustawiając parametr tileSize
na 512.
Właściwość tileSize
wskazuje liczbę pikseli, w jakiej będą wyświetlane zwrócone obrazy kafelków. Domyślnie to 256, czyli wymiar kafelka Map Google na urządzeniu innym niż Retina.
Jeśli wyświetlasz normalne 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żyć ich jakość, zwłaszcza w przypadku drobnych linii lub tekstu. Aby uzyskać najlepsze wyniki, dopasuj do wyświetlacza wartości tileSize
i DPI obrazu. Mapy wyświetlane na urządzeniach Retina prezentują się najlepiej przy wyświetlaniu obrazów w 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 ze zwykłymi obrazami i z domyślnym ustawieniem tileSize
o wartości 256.
Czyszczenie nieaktualnych kafelków
Jeśli kafelki udostępnione przez warstwę staną się „nieaktualne”, należy wywołać z nich metodę clearTileCache
, by wymusić odświeżenie. Spowoduje to ponowne załadowanie wszystkich kafelków w tej warstwie.
Swift
layer.clearTileCache()
Objective-C
[layer clearTileCache];