ベクター地図

Maps JavaScript API では、ラスターとベクターという 2 種類の地図を実装できます。デフォルトではラスターマップが読み込まれます。この地図は、ピクセルベースのラスター画像タイルのグリッドとして表示されるもので、Google Maps Platform のサーバーサイドで生成されてからウェブアプリに配信されます。ベクターマップはベクトルベースのタイルで構成されており、WebGL を使用して、読み込み時にクライアントサイドで描画されます。WebGL は、ブラウザがユーザーのデバイスの GPU にアクセスし、2D や 3D のグラフィックをレンダリングできるようにするウェブ テクノロジーです。

ベクターマップは、ユーザーが使い慣れている Google マップと同じですが、デフォルトのラスタータイル マップと比べて多くの利点があります。特に、鮮明なベクターベース画像と、ズームアップすると建物の 3D 表示が追加される機能が有用です。また、ベクターマップは、WebGL オーバーレイ表示による 3D コンテンツの追加機能や、プログラムによる上下左右の傾き制御、強化されたカメラ コントロール機能、滑らかなズームを実現する小数ズームなどの新機能にも対応しています。

ベクターマップのスタートガイド

カメラをコントロールする

カメラ プロパティの組み合わせを一括で更新するには、map.moveCamera() 関数を使用します。map.moveCamera() は、更新するすべてのカメラ プロパティを含む 1 つのパラメータを承認します。次の例では、map.moveCamera() を呼び出して、centerzoomheadingtilt を一度に設定しています。

map.moveCamera({
  center: new google.maps.LatLng(37.7893719, -122.3942),
  zoom: 16,
  heading: 320,
  tilt: 47.5
});

次に示すように、アニメーション ループを使用して map.moveCamera() を呼び出すことで、カメラ プロパティをアニメーション化することができます。

const degreesPerSecond = 3;

function animateCamera(time) {
  // Update the heading, leave everything else as-is.
  map.moveCamera({
    heading: (time / 1000) * degreesPerSecond
  });

  requestAnimationFrame(animateCamera);
}

// Start the animation.
requestAnimationFrame(animateCamera);

小数ズーム

ベクター地図は小数ズームに対応しているため、整数ではなく小数値を使用してズームできます。ラスター地図とベクター地図はどちらも小数ズームに対応していますが、ベクター地図はデフォルトでオン、ラスター地図はデフォルトでオフになっています。小数ズームのオン、オフを切り替えるには、地図オプションの isFractionalZoomEnabled を使用します。

次の例では、地図を初期化する際に小数ズームを有効にしています。

map = new google.maps.Map(document.getElementById('map'), {
  center: {lat: -34.397, lng: 150.644},
  zoom: 8,
  isFractionalZoomEnabled: true
});

以下のように地図オプションの isFractionalZoomEnabled を設定することで、小数ズームのオンとオフを切り替えることもできます。

// Using map.set
map.set('isFractionalZoomEnabled', true);

// Using map.setOptions
map.setOptions({isFractionalZoomEnabled: true});

小数ズームがオンかオフかを検出するようにリスナーを設定できます。この設定は、isFractionalZoomEnabledtrue または false に明示的に設定していない場合に特に便利です。次のコード例は、小数ズームが有効になっているかどうかを確認します。

map.addListener('isfractionalzoomenabled_changed', () => {
  const isFractionalZoomEnabled = map.get('isFractionalZoomEnabled');
  if (isFractionalZoomEnabled === false) {
    console.log('not using fractional zoom');
  } else if (isFractionalZoomEnabled === true) {
    console.log('using fractional zoom');
  } else {
    console.log('map not done initializing yet');
  }
});