プログラマブル深海魚

目立たないけど華やかに

Google Mapをページに埋め込む

WebページにGoogle Mapを表示してみたかったので、実際にやってみました。

Google Mapを表示するには、Maps JavaScript APIを利用します。
Maps JavaScript APIGoogle Cloud Platformを構成するAPIの1つなので、まずはGoogle Cloud Platformで必要な準備をしてから実際にコードを書いていきます。

目次

プロジェクトを作成する

APIを使用するために、まずGoogle Cloud Platformにプロジェクトを作成する必要があります。

まず、Google Cloudを開きます。
https://cloud.google.com/

Google Cloud

[コンソールへ移動]を押して、Google Cloud Consoleに移動します。

Google Cloud Console

[プロジェクトの選択]を押して、プロジェクト選択画面の[新しいプロジェクト]からプロジェクトを作成します。

プロジェクト選択画面
プロジェクト名に「Test Project」と入力している
プロジェクトの作成

プロジェクト名に「Test Project」と入力し(実際には何でもいい)、[作成]を押します。
これでプロジェクトが作成されます。

新規プロジェクト

請求先アカウントの作成

課金をしない場合でも、プロジェクトには請求先の設定が必要になります。
請求先を設定するためには、請求先アカウントを作成してプロジェクトとリンクします。

まず、請求先アカウントを作成します。左のメニューから[お支払い]を押します。

プロジェクトの画面

[請求先アカウントを管理]を押します。

お支払い

[アカウントを作成]を押します。

請求先アカウントの管理画面

名前を入力して(ここでは「Test Project 請求先」)、[続行]を押します。

名前に「Test Project 請求先」と入力している
請求先アカウント作成

お支払い方法を入力して、[送信して課金を有効にする]を押します。これで請求先アカウントが作成されます。

お支払い方法を入力する
お支払い方法入力

次に、プロジェクトに請求先アカウントをリンクするために、
プロジェクトのアカウントに「プロジェクト請求管理者」のロールを追加します。

左のメニューから[IAM]を押して、IAMの管理画面を開きます。 アカウントの右にある鉛筆アイコンを押します。

IAMの管理画面

[別のロールを追加]を押して、増えた枠の「ロール」に[Billing]>[プロジェクト請求管理者]を指定します。
指定したら、[保存]を押します。

[[Billing]>[プロジェクト請求管理者]を追加する]
ロールの割り当て

これで、「プロジェクト請求管理者」のロールが追加されました。

IAMの管理画面(ロール追加後)

最後に、請求先アカウントをプロジェクトにリンクします。

再度、左のメニューから[お支払い]を押して、表示された画面で[請求先アカウントをリンク]を押します。

お支払い

作成した請求先アカウントを選択し、[アカウントを設定]を押します。

請求先アカウントを指定する

これで、請求先の設定が終わりました。

お支払い(請求先アカウント設定後)

APIキーを作成する

Maps JavaScript APIを利用するために、まずはGoogle Maps Platform APIAPIキーを作成します。

左のメニューから[Google Maps Platform]を押します。

プロジェクトの画面

そのまま、[GOOGLE MAPS PLATFORM に移動]を押します。

APIキー作成

APIキーを、使用するリファラーに制限します。
今回、私はローカル環境で、Play Frameworkで作成したアプリケーション上を動かす想定なので、HTTPリファラーを選択してリファラーを"localhost:9000/*"としました。
(9000はAkka HTTPのデフォルトのポート番号)

今回は「HTTPリファラー(ウェブサイト)」、リファラーに「localhost:9000/*」を指定
APIキーの制限

以上で、APIキーの作成が完了しました。
[認証情報]の画面で「鍵を表示します」を押すと、作成したAPIキーを表示できます。

実際に埋め込んでみる

実際に、以下を参考にGoogle Mapを表示してみます。
https://developers.google.com/maps/documentation/javascript/overview

まず、HTMLを作成します。
Google Mapを表示するdiv要素を用意し、Google Maps APIスクリプトを読み込みます。("YOUR_API_KEY"に発行したAPIキーを入れます)

<!DOCTYPE html>
<html>
<head>
  <title>Google Maps Test</title>
</head>
<body>
  <div id="map"></div>
  <script async src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap"></script>
</body>
</html>

次に、スタイルシートスクリプトを書きます。今回はSCSSとTypeScriptで書きます。
スタイルは、マップ表示領域のサイズを指定します。スクリプトでは、Google Maps APIスクリプト読み込みでcallbackに指定しているinitMap関数を定義します。
TypeScriptからGoogle Maps APIを使用する場合、先に@types/google.mapsパッケージをインストールする必要があります。

body {
  margin: auto;
  width: 60vw;
}
#map {
  width: 100%;
  height: 600px;
}
let map: google.maps.Map;
function initMap(): void {
  map = new google.maps.Map(document.getElementById("map") as HTMLElement, {
    center: { lat: 35.625, lng: 139.429 },
    zoom: 18,
  });
}

HTMLのhead内にCSSJavaScriptの読み込みを追加します。
(それぞれ/assets/styles/test.cssと/assets/scripts/test.jsに配置されると仮定)

<link href="/assets/styles/test.css" rel="stylesheet">
<script defer src="/assets/scripts/test.js"></script>

これで、画面にGoogle Mapが表示されます。

Google Mapの表示

初期の中心点・倍率を指定する

google.maps.Mapのコンストラクタの第2引数に与えたオプションによって、中心地と倍率を変更することができます。

  • center: 中心点(緯度・軽度)
  • zoom: 倍率

上記の例ではサンリオピューロランドを表示しましたが、例えば以下とするとよみうりランドを表示することができます。

map = new google.maps.Map(document.getElementById("map") as HTMLElement, {
  center: { lat: 35.628, lng: 139.516 },
  zoom: 16,
});

中心点をよみうりランドに変更

マーカーを表示する

以下のステップ2にある例のように、google.maps.Markerでマップのマーカーを定義します。
https://developers.google.com/maps/documentation/javascript/adding-a-google-map

スクリプトにマーカーの定義を追加します。また、オプションでdraggable=trueとすると、マーカーを画面上でドラッグして移動できるようになります。
(デフォルトではドラッグ不可)

const marker = new google.maps.Marker({
  position: { lat: 35.625, lng: 139.429 },
  draggable: true,
  map: map,
});

マーカーの表示

マーカーの位置を取得する

マーカーの位置を取得するには、マーカーに対してgetPosition()を使用します。
getPosition()により位置を取得して、さらにlat()とlng()でそれぞれ緯度と経度を取得できます。

「Get Position」ボタンを押すと、ダイアログで現在の緯度・経度を表示するように修正してみました。

<!DOCTYPE html>
<html>
<head>
  <title>Google Maps Test</title>
  <link href="/assets/styles/test.css" rel="stylesheet">
  <script defer src="/assets/scripts/test.js"></script>
</head>
<body>
  <div id="map"></div>
  <input id="getPosition" type="button" value="Get Position">
  <script async src="https://maps.googleapis.com/maps/api/js?key=AIzaSyC7BUBhU-Mf2GRr8ZRXF5IXF8oW3nnmQ20&callback=initMap"></script>
</body>
</html>
let map: google.maps.Map;
let marker: google.maps.Marker;

function initMap(): void {
  map = new google.maps.Map(document.getElementById("map") as HTMLElement, {
    center: { lat: 35.625, lng: 139.429 },
    zoom: 18,
  });

  marker = new google.maps.Marker({
    position: { lat: 35.625, lng: 139.429 },
    map: map,
    draggable: true,
  });
}

document.getElementById("getPosition").addEventListener('click', (e: Event) => {
  alert(`Lat: ${marker.getPosition().lat()}, Lng: ${marker.getPosition().lng()}`);
});

緯度・経度の取得と表示

おわり

以上の内容で、位置を表示したり逆に位置を指定させたりといったことが簡単にできるようになります。
今回はこちらには載せていませんが、Web APIのGeolocation APIを使って現在位置をマーカーの位置にするといったこともできたので、
いろいろと応用できそうです。

参考文献

Google Maps Platform のドキュメント | Maps JavaScript API | Google Developers
https://developers.google.com/maps/documentation/javascript?hl=ja

Google Maps API を使ってみた - Qiita
https://qiita.com/Haruka-Ogawa/items/997401a2edcd20e61037

Google Maps PlatformのAPI 使用の上限設定 – @dream-PLUS
https://ring-and-link.co.jp/dream2000/user/notice/web/2975

Google Cloud Platformの課金アカウント作成手順
https://webservicies.net/gcp-accreate/