Вы можете добавлять изображения поверх карты в виде слоя листов. Слои листов размещаются поверх фрагмента карты при определенном уровне масштабирования. Имея достаточное количество фрагментов, вы можете дополнить картографические данные Google для всей карты с несколькими уровнями масштабирования.
Введение
Слои плиток (иногда называемые наложениями плиток) позволяют накладывать изображения поверх плиток базовой карты Google. Это отличный способ добавить в приложение данные, например достопримечательности или информацию о дорожном движении, а также местные изображения. В сочетании с типом карты kGMSTypeNone
слои листов эффективно позволяют заменять данные базовой карты Google своими собственными.
Слои листов полезны, когда вы хотите добавить на карту обширные изображения, обычно охватывающие большие географические области. Напротив, наземные наложения полезны, когда вы хотите зафиксировать одно изображение в одной точке карты.
Координаты плитки
API Карт разбивает изображения на каждом уровне масштабирования на набор квадратных фрагментов карты, которые расположены в упорядоченной сетке. Когда карта прокручивается до нового местоположения или до нового уровня масштабирования, API Карт определяет, какие фрагменты необходимы, и преобразует их в набор фрагментов для извлечения.
В реализации проекции Меркатора от Google плитка с координатой (0,0) всегда находится в северо-западном углу карты, причем значения x
увеличиваются с запада на восток, а значения y
увеличиваются с севера на юг. Плитки индексируются с использованием координат x,y
от этого источника. Например, при уровне масштабирования 2, когда земля разделена на 16 плиток, на каждую плитку можно ссылаться по уникальной паре x,y
:
Каждый тайл карты представляет собой квадрат размером 256x256 точек. При уровне масштабирования 0 весь мир отображается в виде одной плитки. Каждый уровень масштабирования увеличивает увеличение в два раза. Таким образом, при уровне масштабирования 1 карта будет отображаться в виде сетки плиток 2x2 или сетки 4x4 при уровне масштабирования 2, сетки 8x8 при уровне масштабирования 3 и т. д. Если вы создаете изображения для слоя листов, вам потребуется создать новое точечное изображение размером 256x256 для каждого фрагмента на каждом уровне масштабирования, который вы хотите поддерживать.
Добавить слой плитки
- Создайте экземпляр объекта
GMSURLTileLayer
или пользовательского подклассаGMSTileLayer
илиGMSSyncTileLayer
. - При желании измените свойство
zIndex
, чтобы настроить его положение относительно других слоев листов. - Назначьте объект
GMSTileLayer
карте, задав его свойствоmap
.
Maps SDK для iOS предоставляет три класса, которые можно использовать для реализации слоя листов. Для каждого класса вам нужно будет определить, как получить правильный фрагмент карты для заданного набора координат {x,y,zoom}
. Доступные варианты:
- Подкласс
GMSSyncTileLayer
, обеспечивающий реализациюtileForX:y:zoom
, который возвращает экземплярыUIImage
. - Подкласс
GMSTileLayer
, обеспечивающий реализацию асинхронного методаrequestTileForX:y:zoom
, который позже вызывает обратное изображение с изображением плитки. - Используйте существующий класс
GMSURLTileLayer
для автоматического получения плиток из URL-адресов, предоставляя блокGMSTileURLConstructor
.GMSURLTileLayer
— это конкретный класс, который не может быть подклассом.
В случае создания подкласса GMSSyncTileLayer
или GMSTileLayer
предоставление nil
результата плитки сообщит Maps SDK для iOS, что данные в настоящее время недоступны, но могут быть доступны в будущем. Альтернативно, верните kGMSTileLayerNoTile
, чтобы указать, что в этом месте нет плитки.
Для GMSURLTileLayer
возврат nil
из GMSTileURLConstructor
будет указывать на то, что в этом месте нет плитки.
Используйте GMSURLTileLayer для получения плиток из URL-адресов.
GMSURLTileLayer
не требует создания подклассов, но вам придется реализовать блок GMSTileURLConstructor
. В приведенном ниже коде показано, как использовать GMSURLTileLayer
для отображения плана многоэтажного здания.
Быстрый
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
Цель-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;
Подкласс GMSSyncTileLayer для обслуживания плиток в качестве UIImage.
GMSSyncTileLayer
и GMSTileLayer
— это абстрактные классы, предназначенные для создания подклассов. Вы можете использовать эти классы для обслуживания плиток в качестве UIImage
. В приведенном ниже примере показано, как визуализировать пользовательское изображение поверх некоторых фрагментов на карте путем создания подкласса GMSSyncTileLayer
.
Быстрый
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 } } }
Цель-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
Чтобы добавить слой на карту, создайте экземпляр объекта и установите его свойство карты.
Быстрый
let layer = TestTileLayer() layer.map = mapView
Цель-C
GMSTileLayer *layer = [[TestTileLayer alloc] init]; layer.map = mapView;
Плитки с высоким разрешением для устройств Retina
Вы можете использовать изображения с высоким разрешением как с GMSSyncTileLayer
так и GMSURLTileLayer
, установив для tileSize
значение 512. Свойство tileSize
указывает количество пикселей, в которых возвращаемые изображения плитки предпочтут отображаться; по умолчанию это значение 256 — размер плитки Google Maps на устройстве, отличном от Retina.
Если вы отображаете плитки с обычным разрешением на дюйм на устройстве с высоким разрешением, вы можете масштабировать изображения, установив для tileSize
значение 512. Обратите внимание, что повышение масштаба изображений может снизить качество изображения, особенно для тонких линий или текста. Для достижения наилучших результатов сопоставьте tileSize
и разрешение изображения с дисплеем. Карты, отображаемые на устройстве Retina, будут выглядеть лучше всего при отображении изображений с высоким разрешением и размером tileSize
512; в то время как карты, отображаемые на устройствах без Retina, будут отлично выглядеть с обычными изображениями и tileSize
по умолчанию, равным 256.
Очистка устаревших плиток
Если плитки, предоставленные слоем, становятся «устаревшими», то на слое следует вызвать метод clearTileCache
для принудительного обновления. Это приведет к перезагрузке всех тайлов на этом слое.
Быстрый
layer.clearTileCache()
Цель-C
[layer clearTileCache];