Google Maps APIでピンのアクティブ時にピン画像を変える方法

Google Mapsでオリジナルのピンを表示させたい場合、通常時とクリック時でピンを変えたい場合があります。
そんなときの実装方法についてまとめておきます。
Google Maps APIの設定
Google Maps APIの初期設定については過去に記事にしてあるのでそちらをご覧ください。
そして、オリジナルのピンの表示方法は下記の記事で解説しています。
上記の2つの記事が前提で、まずは下記のコードでGoogle Maps APIでオリジナルのピンを表示させます。
<div id="map"></div>
<script>
initMap();
function initMap() {
let map = new google.maps.Map(document.getElementById('map'), {
center: {lat: 35.681382, lng: 139.766083},
zoom: 8
});
//マーカーの追加
let marker = new google.maps.Marker({
position: {lat: 35.681382, lng: 139.766083}, // ピンの緯度・経度
map: map, // 追加するGoogle Mapsを指定
icon: {
url: './images/pin.png' // ピンの画像パスを指定
}
});
}
</script>クリックしたらピンを変える
ピンをクリックしたときに状態を変えたいので、ピンに対してaddListenerでclickを指定します。
そしてsetOptionsを使うと、後からピンの状態を変えられます。
今回の場合はアイコン画像だけ変えられればOKなのでicon.urlを別の画像にします。
marker.addListener('click', function() { // markerクリック時に発火
marker.setOptions({ // ここでピンのoptionを変更
icon:{
url:'./images/pin_active.png', // クリック時の画像を指定
}
});
});クリックしたピンをマップの中央にする
クリックしてただ画像が変わるだけだとあまり意味はないので、クリックしたらピンをマップの真ん中に移動させるようにしましょう。
panTo(座標)で、指定した座標に滑らかに移動します。
他にsetCenter(座標)というものもありますが、こちらはアニメーションせず一瞬で移動してしまいます。
marker.addListener('click', function() {
marker.setOptions({
icon:{
url:'./images/pin_active.png',
}
});
map.panTo(marker.position); // この行を追加
});setCenterを使いたい場合は、panToをsetCenterに変えればそのまま使えます。
複数のピンを用意する
ピンが1つだけで、アクティブ時のピンを変えたい場合は少ないと思います。
複数用意したい場合は、下記のようにピンの座標を配列で用意します。
let markers = [
{
lat: 35.681082,
lng: 139.766883
},
{
lat: 35.681482,
lng: 139.766483
},
{
lat: 35.681882,
lng: 139.766043
},
];次に、マーカーの画像を元に戻す処理を追加しておきます。
そうしないとクリックしたマーカー全てがアクティブなものに変わっていってしまいます。
やっていることは、markerArrayというピンの情報が入った変数をループさせて、順番にデフォルト状態の画像を設定しているだけです。
function clearMarker() {
markerArray.forEach(function (marker, idx) {
marker.setOptions({
icon:{
url:'./images/pin.png',
}
});
});
}あとはループでピンを登録していきながら、そのときにクリック時の処理も一緒に登録していきます。
markerArrayを定義すること、markerを作成したあとにそれをmarkerArrayにpushしておくこと、クリック時の処理の最初にclearMarker()を使ってピンをクリアするのを忘れないようにしましょう。
let markerArray = [];
for (let i = 0; i < markers.length; i++) {
let markerPosition = new google.maps.LatLng({lat: markers[i]['lat'], lng: markers[i]['lng']});
let marker = new google.maps.Marker({
position: markerPosition,
map: map,
icon: {
url: './images/pin.png'
}
});
markerArray.push(marker); // markerArrayにmarker情報を追加
// クリック時の処理
marker.addListener('click', function() {
clearMarker(); // ピンのクリア
marker.setOptions({
icon:{
url:'./images/pin_active.png',
}
});
map.panTo(markerPosition);
});
}これで、複数のピンが表示されて、クリックするとピンの画像が変わり、マップ中央にスクロールするようになりました。


WordPressで「予約投稿の失敗」となってしまう場合の対処方法
Visual Studio Codeのエクスプローラー上でファイル・フォルダの複製ができるようになる拡張機能「Duplicate action」
gulp-sass 5の「does not have a default Sass compiler」エラーを解消する
ウェブ上でLaTeXで数式をキレイにプレビューするJavaScriptライブラリ「MathJax」
Vue CLI 3でfaviconの設定をする方法
gulpfile.jsにAutoprefixerのブラウザオプションを書くとエラーがでる場合の修正方法
JavaScriptのテンプレートリテラル内で条件分岐を行う方法
W3 Total Cacheをレスポンシブデザインのテーマで使用する時の注意ポイント!!【WordPress】
WordPressのカスタム投稿タイプを追加後、ページは存在しているはずなのに404になる場合の解決方法
AirPodsで片耳を外しても再生が止まらないようにする方法
MacのKeynoteにハイライトされた状態でコードを貼り付ける方法
iTerm2でマウスやトラックパッドの操作を設定できる環境設定の「Pointer」タブ
DeepLで「インターネット接続に問題があります」と表示されて翻訳できないときに確認すること
Ulyssesの「第2のエディタ」表示を使って2つのシートを横並びに表示する
iTerm2でキーボードを使った操作を設定できる環境設定の「Keys」タブ
macOS Mojaveのログイン周りの設定まとめ(ゲストユーザのオフ、ログイン時の壁紙変更)
macOSの環境をすぐに復元したり、別Macと同期するために必要な情報をまとめた「アプリ設定フォルダ」を作る
Mac版GoodNotes 5でiPadで書いたノートをMacでも閲覧したり編集する
面倒なことを解消するアプリの細かい設定 #1日1Tips – 2019年11月
Path Finder 9をインストールしたらとりあえず行う初期設定
Visual Studio Codeでショートカットキーを変更する方法
IllustratorとPhotoshopとXDのツール系のショートカットキーを統一させる
HTMLタグの入力をラクにするスニペット集
Visual Studio Codeで簡易的なローカルサーバーを起動して、コード保存時に自動でブラウザをリロードする拡張機能「Live Server」