Слои плитки

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

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

Введение

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

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

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

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

В реализации проекции Меркатора от Google, тайл с координатами (0,0) всегда находится в северо-западном углу карты, при этом значения x увеличиваются с запада на восток, а значения y — с севера на юг. Тайлы индексируются с использованием координат x,y от этой точки отсчета. Например, при уровне масштабирования 2, когда Земля разделена на 16 тайлов, каждый тайл может быть обозначен уникальной парой x,y :

Карта мира, разделённая на четыре ряда и четыре столбца плиток.

Каждый фрагмент карты представляет собой квадрат размером 256x256 точек. При нулевом уровне масштабирования весь мир отображается в одном фрагменте. Каждый последующий уровень масштабирования увеличивает увеличение в два раза. Например, при первом уровне масштабирования карта отображается в виде сетки фрагментов 2x2, при втором — в виде сетки 4x4, а при третьем — в виде сетки 8x8. Для создания изображений для слоя фрагментов карты необходимо создать изображение размером 256x256 точек для каждого фрагмента при каждом уровне масштабирования, который вы хотите поддерживать.

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

  1. Создайте объект GMSURLTileLayer или пользовательский подкласс GMSTileLayer или GMSSyncTileLayer .
  2. При желании можно изменить свойство zIndex , чтобы отрегулировать его положение относительно других слоев тайлов.
  3. Присвойте объекту GMSTileLayer карту, задав его свойство map .

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
      

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

Быстрый

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.

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

Прозрачные залежавшиеся плитки

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

Быстрый

layer.clearTileCache()
      

Objective-C

[layer clearTileCache];