タイルレイヤー

プラットフォームを選択: Android iOS JavaScript

地図の上にタイル レイヤとして画像を追加できます。タイル レイヤは、特定のズームレベルで地図タイルの上に配置されます。十分な数のタイルがあれば、複数のズームレベルでマップ全体に対して Google の地図データを補うことができます。

はじめに

タイルレイヤ(タイル オーバーレイとも呼ばれる)を使用すると、Google の基本地図タイルの上に画像を重ねることができます。この機能を使用して、POI や交通情報などのデータやローカル画像をアプリに追加できます。kGMSTypeNone 地図タイプと組み合わせると、タイルレイヤを使用して Google の基本地図データを独自のデータに置き換えることができます。

タイルレイヤは、大きい画像をマップに追加する場合に役立ちます。これは通常、広い地理的領域が対象です。一方、地面 オーバーレイは、地図上の 1 か所に 1 枚の画像を固定したい場合に便利です。

タイル座標

Maps API は、各ズームレベルの画像を、順序付けられたグリッドに配置された一連の正方形の地図タイルに分割します。地図を新しい位置にスクロールする、または新しいズームレベルにスクロールすると、Maps API は必要なタイルを判別し、その情報を、取得する一連のタイルに変換します。

Google によるメルカトル図法の実装では、座標(0,0)のタイルは常にマップの北西隅にあり、x 値は西から東へと増分し、y 値は北から南へと増分します。タイルは、この原点からの x,y 座標を使用してインデックスが付けられます。たとえば、ズームレベル 2 で地球が 16 個のタイルに分割された場合は、各タイルは一意の x,y ペアで参照できます。

4 行 4 列のタイルで分割された世界地図。

各マップ タイルは 256 x 256 ポイントの正方形です。ズームレベル 0 では、全世界が 1 つのタイルでレンダリングされます。各ズームレベルは、2 の倍数で倍率が増大します。たとえば、ズームレベル 1 ではマップは 2x2 グリッドのタイルとしてレンダリングされ、ズームレベル 2 では 4x4 グリッド、ズームレベル 3 では 8x8 グリッドとしてレンダリングされます。タイルレイヤの画像を作成するには、サポートするズームレベルごとに、各タイルの 256x256 ポイントの画像を作成します。

タイル レイヤの追加

  1. GMSURLTileLayer オブジェクト、または GMSTileLayer または GMSSyncTileLayer のカスタム サブクラスをインスタンス化します。
  2. 必要に応じて、zIndex プロパティを変更して、他のタイルレイヤとの 相対的な位置を調整します。
  3. map プロパティを設定して、GMSTileLayer オブジェクトを地図に割り当てます。

Maps SDK for iOS には、タイルレイヤの実装に使用できる 3 つのクラスが用意されています。各クラスで、指定された {x,y,zoom} 座標の正しい地図タイルを取得する方法を定義する必要があります。使用できるオプションは次のとおりです。

  • GMSSyncTileLayer をサブクラス化し、UIImage インスタンスを返す tileForX:y:zoom の実装を提供します。
  • GMSTileLayer をサブクラス化し、後でタイル画像でコールバックする非同期メソッド requestTileForX:y:zoom の実装を提供します。
  • 既存のクラス GMSURLTileLayer を使用して、URL からタイルを自動的に取得し、GMSTileURLConstructor ブロックを提供します。GMSURLTileLayer は、サブクラス化できない具象クラスです。

GMSSyncTileLayer または GMSTileLayer をサブクラス化する場合、nil タイルの結果を提供すると、Maps SDK for iOS にデータが利用できないが、今後利用可能になる可能性があることを通知します。または、kGMSTileLayerNoTile を返して、この場所にタイルがないことを示します。

GMSURLTileLayer の場合、GMSTileURLConstructor から nil を返すと、この場所にタイルがないことを示します。

GMSURLTileLayer を使用して URL からタイルを取得

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
      

マップにレイヤーを追加するには、オブジェクトをインスタンス化して map プロパティを設定します。

Swift

let layer = TestTileLayer()
layer.map = mapView
      

Objective-C

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

Retina 端末用の高 DPI タイル

tileSize を 512 に設定すると、GMSSyncTileLayer または GMSURLTileLayer で高 DPI 画像を使用できます。 tileSize プロパティは、返されるタイル画像が優先的に表示されるピクセル数を示します。デフォルトは 256 です。これは、Retina 以外のデバイスでの Google マップタイルのサイズです。

高 DPI デバイスに通常の DPI タイルを表示する場合は、tileSize を 512 に設定して画像を拡大できます。画像をアップスケーリングすると、特に細い線やテキストの場合、画質が低下する可能性があります。最適な結果を得るには、tileSize と画像の DPI をディスプレイに合わせます。Retina デバイスに表示される地図は、tileSize が 512 の高 DPI 画像を表示すると最適に見えます。一方、Retina 以外のデバイスに表示される地図は、通常の画像とデフォルトの tileSize 256 で見栄えがよくなります。

古いタイルを消去する

レイヤによって提供されたタイルが「古く」なった場合は、レイヤでメソッド clearTileCache を呼び出して強制的に更新する必要があります。これにより、このレイヤのすべてのタイルが再読み込みされます。

Swift

layer.clearTileCache()
      

Objective-C

[layer clearTileCache];