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
:
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
- Utwórz instancję
GMSURLTileLayer
lub niestandardową podklasęGMSTileLayer
/GMSSyncTileLayer
. - Opcjonalnie zmodyfikuj właściwość
zIndex
, aby dostosować jej położenie względem innych warstw kafelków. - 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 zwracaUIImage
instancje. - Podklasa
GMSTileLayer
, która zapewnia implementację metody asynchronicznegorequestTileForX: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 blokuGMSTileURLConstructor
.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];