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);
});
}これで、複数のピンが表示されて、クリックするとピンの画像が変わり、マップ中央にスクロールするようになりました。


Google Maps APIでマップの見た目をカスタマイズする方法
JavaScriptのforEach内で「continue」や「break」のような動作をさせる方法
Movable Typeでコメントアウトして出力時に無視する方法
Visual Studio Codeで読み込んだCSSで設定されているclass名の入力補完をしてくれる拡張機能「HTML CSS Support」
iOS Safariで指定したフォントサイズにならない場合の対処法
Dart Sassの変数の基本的な使い方|Dart Sass入門
Webデザイナーを目指す専門学生が技術ブログを書くメリット
SourceTreeのカスタムアクションを使って差分ファイルだけをまとめる方法
WordPressのプラグインはどれを入れたら良い?とりあえず最初に導入をオススメするプラグイン一覧
EmmetのWrap with Abbreviationで複数行のマークアップを効率的に行う
iTerm2で「Use System Window Restoration Setting」を設定しているとアラートが表示されて機能しない
Google Chromeのサイト内検索(カスタム検索)機能を別のプロファイルに移行する方法
iPadで入力モードを切り替えずに数字や記号をすばやく入力する方法
iPhoneやiPadでYouTubeの再生速度を3倍速や4倍速にする方法
Keynoteで有効にしているはずのフォントが表示されない現象
MacのKeynoteにハイライトされた状態でコードを貼り付ける方法
AirPodsで片耳を外しても再生が止まらないようにする方法
iTerm2でマウスやトラックパッドの操作を設定できる環境設定の「Pointer」タブ
DeepLで「インターネット接続に問題があります」と表示されて翻訳できないときに確認すること
Ulyssesの「第2のエディタ」表示を使って2つのシートを横並びに表示する
OnyXでターミナルを使わずにmacOSの詳細設定を行う
軽量で高速なターミナルエミュレーター「Ghostty」の設定方法
Eagleで実現するクリエイティブ素材の簡単管理
かゆいところに手が届く「Supercharge」でMac環境を便利にカスタマイズする
超軽量なコードエディタ 「Zed」をサブエディタとして活用する
Bartender 6で追加されたWidgets機能で自作メニューバーアイテムを簡単に作成する
Googleカレンダーを便利に活用するための小技集(祝日だけを表示・月末の繰り返しイベントを追加)
Obsidianを使った「自己流PKM」で行う知識トレーニング
テキストエディタ・ノートアプリ関連のショートカットキーをKeyboard Maestroで統一する
Path Finderを使ってキーボードだけでファイル操作する方法(応用編)