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
:
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
- Utwórz instancję obiektu
GMSURLTileLayer
lub niestandardową klasę podrzędnąGMSTileLayer
/GMSSyncTileLayer
. - Opcjonalnie zmień właściwość
zIndex
, by dostosować jej położenie względem innych warstw kafelków. - 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 instancjeUIImage
. - Podklasa
GMSTileLayer
, która zapewnia implementację metody asynchronicznegorequestTileForX: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ć blokGMSTileURLConstructor
.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];