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


Visual Studio Codeで複数ファイルを編集するときにタブやペインの操作方法
Vue CLIでGA4を導入する方法
gitignoreで特定ファイルをGitで無視する方法
Local by Flywheelの「Starting Local Machine…」画面から進まないときに試すこと
PS Auto Sitemapを使って自分のブログのサイトマップを作成する
HTTP通信をラクに実装できる「axios」の基本
iTerm2でさらに細かい機能の設定ができる環境設定の「Advanced」タブ
Visual Studio Codeでコメントを色分けして管理する「Better Comments」
SourceTreeを開くと「’git status’ failed with code 69:’」というポップアップが出てくる場合の解決方法
AirPodsで片耳を外しても再生が止まらないようにする方法
MacのKeynoteにハイライトされた状態でコードを貼り付ける方法
iTerm2でマウスやトラックパッドの操作を設定できる環境設定の「Pointer」タブ
DeepLで「インターネット接続に問題があります」と表示されて翻訳できないときに確認すること
Ulyssesの「第2のエディタ」表示を使って2つのシートを横並びに表示する
新しいMacBook Proを購入して移行するときにやること|ユーティリティ系アプリの設定編
外部マウスを自由にカスタマイズできるステアーマウスで、マウスの細かい設定を行う
Keyboard Maestroを使ってGyazoアプリをショートカットキーで起動する方法
Homebrew Caskを使うとき、「brew cask search」は効かないので「brew search」を使うようにする
ちょっとした作業をラクにするアプリとそのTips #1日1Tips – 2019年9月
Bartender 4のShow for Updates機能を使って、AirPodsに接続しているときだけ「ToothFairy」のアイコンを表示させる
Abstractを使っている場合は、Default Folder Xの「今開いている書類のある場所をファイルダイアログで開く」をオフにする
Google Chromeで「パスワードを保存しますか?」ポップアップを非表示にする方法
Chrome拡張機能の「Get RSS Feed URLs」でサイトのRSSを簡単に取得