Слои плитки

Выберите платформу: 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
      

Цель-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];