Google Map にマーカーを付けてみた

100均のダイソーの店舗情報のようなマップを作りたい その方法について
https://oshiete.goo.ne.jp/qa/10253056.html

この程度の回答で文字制限に引っかかるとは!
click イベントをマーカーに貼り付けようと思って
m.addEventListener ('click', ....
ここでエラーがでて、いきづまってしまった。
よく見たら
m.addListener (...
だった。


もしかしてだけど、アニメーション的なのが要望だったのか?

<!DOCTYPE html>
<html lang="ja">
<title>Google Maps APIテスト</title>
<meta charset="utf-8">
<style type="text/css">
#container {
	width: 1000px;
	margin: 0 auto;
}
#sample {
	width: 1000px;
	height: 800px;
}
</style>

<body>
<div id="container">
	<div id="sample"></div>
</div>


<script src="https://maps.googleapis.com/maps/api/js?key="></script>
<script>

{ //GoogleMap
    
  const
    tool = google.maps,

    createHtml = (n, t) =>
      '<div class="sample">' + n + '<br>' + t + '</div>',
    
    createMap = (target, latlng, zoom) =>
      new tool.Map (target, { center: new tool.LatLng (latlng), zoom }),
    
    createMark = (map, markers) =>
      markers.map (([lat, lng, name, text, url]) => {
        let
          p = new P (lat, lng),
          m = new tool.Marker ({ position: new tool.LatLng (p), map}),
          f = new tool.InfoWindow ({ content: createHtml (name, text)});

        if (url)
          m.setOptions ({ icon: { url }});

          m.addListener ('click', f.open.bind (f, map, m), false);
        return m;
      });
  

  class P { //position
    constructor (lat, lng) {
      this.lat = lat;
      this.lng = lng;
    }
  }
    
  
 
  class GoogleMap {
    constructor (target, [lat, lng], zoom = 15, markers = []) {
      if (3 > arguments.length)
        throw new Error (alert ('引数が不足'));

      this.target = target;
      this.position = new P (lat, lng);
      this.map  = createMap (target, this.position, zoom);
      this.mark = createMark (this.map, markers);
    }    
  }
  
  this.GoogleMap = GoogleMap;
}




let src = [
  "data:image/png;base64,",
  "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"
].join ('\n');

let
  target   = document.querySelector ('#sample'),
  position = [35.679000, 139.780000],
  zoom     = 13,
  markers  = [
    [35.710001, 139.810666, '東京スカイツリー', '高さ634m'],
    [35.658641, 139.745473, '東京タワー', '高さ333m', src]
  ],
  map = new GoogleMap (target, position, zoom, markers);

</script>

アニメーションを付加してみる

<!DOCTYPE html>
<html lang="ja">
<title>Google Maps APIテスト</title>
<meta charset="utf-8">
<style type="text/css">
#sample {
	width: 1000px;
	height: 800px;
}
</style>

<body>
<div id="sample"></div>


<script src=
  "https://maps.googleapis.com/maps/api/js?key="
></script>
<script>

{ //GoogleMap

  const
    tool = google.maps,

    createHtml = (n, t) =>
      '<div class="sample">' + n + '<br>' + t + '</div>',

    createMap = (target, latlng, zoom) =>
      new tool.Map (target, { center: latlng, zoom }),

    createMarker = markers =>
      markers.map (([lat, lng, title, text, icon], i) =>
        new tool.Marker ({
          title,
          //label: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[i],
          position: new P (lat, lng),
          animation: tool.Animation.DROP,
          //draggable:true,
          icon
        })),

    createInfoWin = markers =>
      markers.map (([lat, lng, title, text, icon]) =>
        new tool.InfoWindow ({ content: createHtml (title, text)})),

    addClickEvent = (map, marker, infoWin) =>
      marker.forEach ((m, i) =>
        m.addListener ('click', infoWin[i].open.bind (infoWin[i],map, m))
      );



  class P { //position
    constructor (lat, lng) {
      this.lat = lat;
      this.lng = lng;
    }
  }



  class GoogleMap {
    constructor (target, [lat, lng], zoom = 15, markers = []) {
      if (3 > arguments.length)
        throw new Error (alert ('引数が不足'));

      this.target = target;
      this.map = createMap (target, new P (lat, lng), zoom);
      this.marker = createMarker (markers);
      this.infoWin = createInfoWin (markers);

      this.addClickInfo ();

      setTimeout (this.setMark.bind (this), 1500);
      setTimeout (this.setAnimeBounce.bind (this), 3500);
    }

    setMark (wait = 2000) {// ms秒かけてマーカーの全てを表示する
      let interval = 2000 / (this.marker.length || 1);
      this.marker.forEach ((m, i) =>
        setTimeout (m.setMap.bind (m, this.map), interval * i));
    }

    setAnimeBounce () {
      this.marker.forEach (m =>
        m.setAnimation (tool.Animation.BOUNCE));
    }

    removeMark (wait = 0) {
      let interval = 2000 / (this.marker.length || 1);
      this.marker.forEach ((m, i) =>
        setTimeout (m.setMap.bind (m, null), interval * i));
    }

    addClickInfo () {
      addClickEvent (this.map, this.marker, this.infoWin);
    }
  }

  this.GoogleMap = GoogleMap;
}



let
  target   = document.querySelector ('#sample'),
  position = [35.679000, 139.780000],
  zoom     = 13,
  markers  = [
    [35.710001, 139.810666, '東京スカイツリー', '高さ634m'],
    [35.658641, 139.745473, '東京タワー', '高さ333m']
  ];

new GoogleMap (target, position, zoom, markers);

</script>