Слои плитки

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

Вы можете добавлять изображения поверх карты в качестве слоя листов. Слои листов размещаются поверх фрагмента карты с определенным уровнем масштабирования. Имея достаточно фрагментов, вы можете дополнить данные карты Google для всей карты с несколькими уровнями масштабирования.

Введение

Слои фрагментов (иногда называемые наложениями фрагментов) позволяют накладывать изображения поверх фрагментов базовой карты Google. Это отличный способ добавить данные, такие как достопримечательности или информацию о пробках, и местные изображения в ваше приложение. В сочетании с типом карты kGMSTypeNone слои листов эффективно позволяют заменить данные базовой карты Google своими собственными.

Слои листов полезны, когда вы хотите добавить на карту обширные изображения, обычно охватывающие большие географические области. В отличие от этого, наложения на землю полезны, когда вы хотите зафиксировать одно изображение в одной точке на карте.

Координаты плитки

Maps 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

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

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

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

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

Быстрый

layer.clearTileCache()
      

Цель-C

[layer clearTileCache];