Map Tiles は、単に世界をインデックス付きグリッドに分割したものです。これにより、複数の地図作成スケールで効率的かつ動的に地図データにアクセスし、利用できます。Map Tiles API では、Google がキュレートした以下を含む、テーマ別の複数の地理データセットにアクセスできます。
Google の地図スタイル設定によるベクター地形データに基づくロードマップ画像タイル。
衛星カメラと航空カメラの両方で撮影され、地球の真上からの(天底)画像を提供する正投影写真。
陰影線の等高線マップ。
2D 地図タイルはすべて地理的に参照され、互いに揃っています。ビューポートの地理的範囲とズームレベルに基づいて選択されます。ズームレベルの範囲は、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)の範囲内である必要があります。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
};
}