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


CodeAnywhereでターミナルに触る練習をする
Vue CLI 3でfaviconの設定をする方法
Nuxt.jsでのページ遷移設定方法(Vue Routerやnuxt-link)|Nuxt.jsの基本
Visual Studio Codeでパス補完機能を細かく設定して自分好みにできる拡張機能「Path Autocomplete」
全角スペースを可視化してくれるVisual Studio Codeの拡張機能「zenkaku」
Google Maps APIをローカル開発環境で使用するときの制限設定方法
様々な作業を自動化するgulpの基礎と導入方法
WordPressで作成した記事をSlackでシェアしたときに、抜粋文が長く表示される場合の対処法
JetpackでのError during WebSocket handshakeの解決方法
CSSで::placeholderにスタイルを設定する方法
iTerm2で「Use System Window Restoration Setting」を設定しているとアラートが表示されて機能しない
Google Chromeのサイト内検索(カスタム検索)機能を別のプロファイルに移行する方法
iPadで入力モードを切り替えずに数字や記号をすばやく入力する方法
iPhoneやiPadでYouTubeの再生速度を3倍速や4倍速にする方法
Keynoteで有効にしているはずのフォントが表示されない現象
MacのKeynoteにハイライトされた状態でコードを貼り付ける方法
AirPodsで片耳を外しても再生が止まらないようにする方法
iTerm2でマウスやトラックパッドの操作を設定できる環境設定の「Pointer」タブ
DeepLで「インターネット接続に問題があります」と表示されて翻訳できないときに確認すること
Ulyssesの「第2のエディタ」表示を使って2つのシートを横並びに表示する
chezmoi(シェモア)で始めるdotfiles管理
GitHubの通知を見逃さない!通知に特化したアプリ「Gitify」
Keyboard Maestroの変数基礎
Neovimを使い始める最初の一歩として便利な「LazyVim」
ウェブサイトをmacOSアプリとしてラッピングする「Unite Pro」
Keyboard Maestroの「Macro Debugger」で複雑なマクロのデバッグを行う方法
無料版でも高機能なランチャーアプリ「Raycast」の基本機能と環境設定
OnyXでターミナルを使わずにmacOSの詳細設定を行う
軽量で高速なターミナルエミュレーター「Ghostty」の設定方法
Eagleで実現するクリエイティブ素材の簡単管理