Map Tiles は、世界をインデックス付きのグリッドに分割したものです。これにより、複数の地図縮尺で地図データに効率的かつ動的にアクセスして利用できます。
Map Tiles API を使用すると、
Google がキュレートした次のものを含む、複数のテーマ別地理空間データセットにアクセスできます。
Google の地図作成スタイルを使用した、ベクター地形データに基づく道路地図画像タイル。
衛星カメラと航空機搭載カメラの両方で撮影された正射投影画像。地球の真上(天底)の画像を提供します。
陰影起伏等高線図。
2D Map Tiles はすべて地理参照され、互いに位置合わせされています。これらは、ビューポートの地理的範囲とズームレベルに基づいて選択されます。ズームレベルは 0(世界全体を表示)から 22(道路やブロックを表示)までです。
地図のテーマ
次の地図のテーマの地図タイルを取得できます。
| 地図のテーマ | 説明 |
|---|---|
| 道路地図 | 道路、建物、スポット、行政境界 |
| 衛星 | 宇宙から撮影した写真画像 |
| 地形 | 植生などの自然特性を示す等高線図 |
Map Tiles API から地図タイルをリクエストするには、まず
セッション トークンをリクエストする必要があります。セッション トークンは、地図とビューポートの現在の状態を追跡します。セッション トークンを設定するときは、必要な地図のテーマに合わせて mapType 値を設定する必要があります。
その後、Map Tiles API へのリクエストごとにセッション トークンを含める必要があります。
ビューポート情報のリクエスト
ビューポートは、世界シーンを囲むボックスのサイズを定義します。ビューポート情報のリクエストは、現在のビューポートを構成する地図タイルの詳細を返します。ビューポート情報をリクエストする理由は、存在しないズームレベルで画像をリクエストしないようにするためです。
たとえば、ほとんどの都市にはズームレベル 22 の画像がありますが、海にはありません。海は特徴のない青い正方形が表示されるだけです。
ビューポート リクエストは、次の形式の HTTPS GET リクエストです。
curl "https://tile.googleapis.com/tile/v1/viewport?session=YOUR_SESSION_TOKEN &key=YOUR_API_KEY &zoom=zoom &north=north &south=south &east=east &west=west"
リクエストには次のフィールドが含まれます。
zoom- ビューポートのズームレベル。
north、south、east、west- ビューポートの最北端、最南端、最東端、最西端のポイントを度で表します。北と南は範囲(-90, 90)内、東と西は範囲(-180, 180)内にする必要があります。日付変更線を超える境界を表すには、西を正の値(170 など)、東を負の値(-170 など)にできます。すべてのパラメータが必須です。
ビューポート情報レスポンス
ビューポート レスポンスは、画像があるエリアとズームレベルを示します。ビューポート情報レスポンスの形式は次のとおりです。
{
"copyright": "Map data ©2023",
"maxZoomRects": [
{
"maxZoom": 19,
"north": 90,
"south": -90,
"east": 180,
"west": -180
},
{
"maxZoom": 9,
"north": 90,
"south": -90,
"east": 180,
"west": -180
},
{
"maxZoom": 14,
"north": 84.375,
"south": -84.375,
"east": 180,
"west": -180
}, ...
]
}
レスポンス本文には次のフィールドが含まれます。
copyright- 道路地図タイルと衛星タイルを表示するときに地図に表示する必要がある帰属情報文字列が含まれます。詳細については、 Map Tiles API のポリシーをご覧ください。
maxZoomRect- 現在のビューポートと重複する境界矩形の配列が含まれます。また、各矩形内で使用可能な最大ズームレベルも含まれます。
タイル座標関数
ほとんどのプログラミング言語で、特定のズームレベルで緯度/経度のペアからタイル座標に変換するツール(単純な関数)を使用できます。
次の JavaScript コード例では、まず latLng からポイントに変換し、次にポイントからタイル座標に変換します。
var TILE_SIZE = 256;
function fromLatLngToPoint(latLng) {
var mercator = -Math.log(Math.tan((0.25 + latLng.lat() / 360) * Math.PI));
return {
x: TILE_SIZE * (latLng.lng() / 360 + 0.5),
y: TILE_SIZE / 2 * (1 + mercator / Math.PI)
};
}
function fromLatLngToTileCoord(latLng, zoom) {
var point = fromLatLngToPoint(latLng);
var scale = Math.pow(2, zoom);
return {
x: Math.floor(point.x * scale / TILE_SIZE),
y: Math.floor(point.y * scale / TILE_SIZE),
z: zoom
};
}