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


Local by FlywheelでWordPressのローカル開発環境構築のハードルが一気に下がる
Visual Studio Codeの基本|概要やインストールから日本語化など最低限の設定方法
スマホやPCにプッシュ通知をしてくれる「Push7」をブログに追加する方法
常時SSL化の設定をしたのに「保護された通信」が表示されない時はパスにHTTPが残っているのかも?
効率的なマークアップが出来るようになるEmmetでHTMLを書く時の基本
スクロールしてもテーブルヘッダーが追尾するテーブルの作り方
TwitterとFacebook用のOGP設定方法と表示確認方法
Google Maps APIをローカル開発環境で使用するときの制限設定方法
ブラウザでこれ以上スクロールできない場合の挙動を制御する「overscroll-behavior」プロパティ
CSSで::placeholderにスタイルを設定する方法
iTerm2で「Use System Window Restoration Setting」を設定しているとアラートが表示されて機能しない
Google Chromeのサイト内検索(カスタム検索)機能を別のプロファイルに移行する方法
iPadで入力モードを切り替えずに数字や記号をすばやく入力する方法
iPhoneやiPadでYouTubeの再生速度を3倍速や4倍速にする方法
Keynoteで有効にしているはずのフォントが表示されない現象
MacのKeynoteにハイライトされた状態でコードを貼り付ける方法
iTerm2でマウスやトラックパッドの操作を設定できる環境設定の「Pointer」タブ
AirPodsで片耳を外しても再生が止まらないようにする方法
DeepLで「インターネット接続に問題があります」と表示されて翻訳できないときに確認すること
Ulyssesの「第2のエディタ」表示を使って2つのシートを横並びに表示する
1つのノートアプリにすべて集約するのをやめた理由|2025年時点のノートアプリの使い分け
Notionログイン時の「マジックリンク」「ログインコード」をやめて普通のパスワードを使う
AlfredでNotion内の検索ができるようになるワークフロー「Notion Search」
Gitで1行しか変更していないはずのに全行変更した判定になってしまう
Macでアプリごとに音量を調節できるアプリ「Background Music」
Macのターミナルでパスワード付きのZIPファイルを作成する方法
MacBook Proでディスプレイのサイズ調整をして作業スペースを広げる
SteerMouseの「自動移動」機能で保存ダイアログが表示されたら自動でデフォルトボタンへカーソルを移動させる
iPhoneでタッチが一切効かなくなった場合に強制再起動する方法