图块图层

请选择平台: Android iOS JavaScript

您可以将图片作为图块图层添加在地图上。图块图层 放置在特定缩放级别的地图图块之上。有了足够的功能块, 可在多个缩放级别为整个地图补充 Google 的地图数据。

简介

图块图层(有时称为图块叠加层)允许 放置在 Google 基本地图图块之上。这是一种很棒的方法 (如地图注点或路况信息)和本地图像, 。与kGMSTypeNone地图类型结合使用时, 图块层可让您有效地将 Google 的基本地图数据替换为您自己的数据。

当您想要添加大量图像时,图块图层非常有用, 覆盖大的地理区域。相比之下,地面 叠加层可用于修正单张图片的某个位置 。

图块坐标

Maps API 将各缩放级别的图像分解成一组方形地图 并排列在有序网格中。当地图滚动到 新位置或新缩放级别,则 Google Maps API 会确定 并将其转换为要检索的一组图块。

对于 Google 的墨卡托投影实现,带有 坐标 (0,0) 始终位于地图的西北角,值为 x 从西向东增加,y 值从北向南增加。 系统使用基于该原点的 x,y 坐标为图块建立索引。例如,在 缩放级别 2,当地球分为 16 个图块时,每个图块都可以 唯一 x,y 对引用:

分为四行和四列图块的世界地图。

每个地图图块都是一个256x256的正方形点阵。缩放级别为 0 时,整个地球 呈现在单个图块中缩放级别每增加 1,放大倍数就会增加 的因数为 2。因此,缩放级别为 1 时,地图将渲染为 图块,缩放级别为 2 时为 4x4 网格,缩放级别为 3 时为 8x8 网格,依此类推。 如果要为图块图层创建图片,您需要新建一个 您想支持的每个缩放级别下的每个图块的 256x256 个点图像。

添加图块图层

  1. 实例化 GMSURLTileLayer 对象或其自定义子类 GMSTileLayer/GMSSyncTileLayer
  2. (可选)修改 zIndex 属性以调整其位置 以及它与其他图块层的相对关系
  3. 通过设置 GMSTileLayer 对象 map,将其分配给地图。 属性。

Maps SDK for iOS 提供了三个类,可用于 实现图块层对于每个类,您都需要定义 一组给定 {x,y,zoom} 坐标对应的正确地图图块。可用的选项包括:

  • 子类 GMSSyncTileLayer,用于提供 返回 UIImage 实例的 tileForX:y:zoom
  • 子类 GMSTileLayer,用于实现异步 方法 requestTileForX:y:zoom,用于稍后回调图块图片。
  • 使用现有类 GMSURLTileLayer 自动提取功能块 提供 GMSTileURLConstructor 代码块。GMSURLTileLayer 是一个无法派生子类的具体类。

如果要创建 GMSSyncTileLayerGMSTileLayer 的子类,请提供 nil 图块结果会告知 Maps SDK for iOS,当前 但将来可能会提供或者 返回 kGMSTileLayerNoTile,表示此位置没有图块 位置。

对于 GMSURLTileLayer,从 GMSTileURLConstructor 返回 nil 将 表示该位置没有图块。

使用“GMS网址TileLayer”从网址提取图块

GMSURLTileLayer 不需要子类化,但您必须 实现 GMSTileURLConstructor 代码块。以下代码展示了如何 使用 GMSURLTileLayer 显示多层建筑物的楼层平面图。

Swift

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

GMSSyncTileLayerGMSTileLayer 是抽象类,旨在 已子类化。您可以使用这些类将图块用作 UIImage。以下 示例展示了如何在地图上的一些图块上渲染自定义图像 通过创建 GMSSyncTileLayer 的子类来实现。

Swift

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
      

要将图层添加到地图,请实例化对象并设置其地图属性。

Swift

let layer = TestTileLayer()
layer.map = mapView
      

Objective-C

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

用于Retina设备的高DPI图块

您可以通过 GMSSyncTileLayer 使用高 DPI 图片 或 GMSURLTileLayer(将 tileSize 设置为 512)。 tileSize 属性表示返回的图块的像素数 优先显示为默认为 256,即维度 显示 Google 地图图块的画面。

如果您在高 DPI 设备上显示普通 DPI 图块 将 tileSize 设置为 512。请注意,放大图片可能会降低 尤其是针对细线或文字。为了获得最佳效果,请将 tileSize 和图片 DPI。Retina 设备上显示的地图将 tileSize 为 512 时,在显示高 DPI 图片时效果最佳; 而地图在非视网膜显示设备上显示时,在普通图片上的显示效果也比较好 默认 tileSize 为 256。

清除过时图块

如果图层提供的图块变得“过时”,该方法 应对图层调用 clearTileCache 以强制刷新。这将 使该图层上的所有图块重新加载。

Swift

layer.clearTileCache()
      

Objective-C

[layer clearTileCache];