Слои плитки

Выберите платформу: Android iOS JavaScript

Вы можете добавлять изображения поверх вашей карты в качестве слоя плиток. Слои плиток размещаются поверх плитки карты на определенном уровне масштабирования. При наличии достаточного количества плиток вы можете дополнять данные карты 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 точек для каждого фрагмента на каждом уровне масштабирования, который вы хотите поддерживать.

Добавить слой плитки

  1. Создайте экземпляр объекта GMSURLTileLayer или пользовательский подкласс GMSTileLayer или GMSSyncTileLayer .
  2. При желании измените свойство zIndex , чтобы настроить его положение по отношению к другим слоям плитки.
  3. Назначьте объект 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
      

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;
      

Подкласс 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
    }
  }
}

      

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
      

Чтобы добавить слой на карту, создайте экземпляр объекта и задайте его свойство карты.

Быстрый

let layer = TestTileLayer()
layer.map = mapView
      

Objective-C

GMSTileLayer *layer = [[TestTileLayer alloc] init];
layer.map = mapView;
      

Плитки с высоким разрешением для устройств Retina

Вы можете использовать изображения с высоким разрешением DPI с GMSSyncTileLayer или GMSURLTileLayer , установив для tileSize значение 512. Свойство tileSize указывает количество пикселей, в которых возвращенные изображения плиток будут отображаться; по умолчанию оно равно 256 — размеру плитки Google Maps на устройстве без дисплея Retina.

Если вы отображаете плитки с нормальным DPI на устройстве с высоким DPI, вы можете увеличить масштаб изображений, установив tileSize на 512. Обратите внимание, что увеличение масштаба изображений может ухудшить качество изображения, особенно для тонких линий или текста. Для достижения наилучших результатов подберите tileSize и DPI изображения к дисплею. Карты, отображаемые на устройстве Retina, будут выглядеть лучше всего при отображении изображений с высоким DPI с tileSize , равным 512; в то время как карты, отображаемые на устройстве без Retina, будут отлично выглядеть с обычными изображениями и tileSize по умолчанию, равным 256.

Очистка устаревших плиток

Если плитки, предоставленные слоем, становятся «устаревшими», то следует вызвать метод clearTileCache для слоя, чтобы принудительно обновить его. Это приведет к перезагрузке всех плиток на этом слое.

Быстрый

layer.clearTileCache()
      

Objective-C

[layer clearTileCache];