プログラム初心者です。よろしくお願いします
webサイト上の「公園」、「公衆電話」、「観光地」、「郵便ポスト」ボタンを押すと
対応するマーカーが地図上に表示される仕組みを作りたいと思っています。
具体的には、
google.maps.Marker の visibleをデフォルトでfalseにして、
クリックしたら各項目のvisibleをtrueにすれば実現できるのではと思ったのですが、
変数 visible を クリックイベントで変更できずに困っています。
また、違う方法でもっと効率のよい方法があればご教授ください。
html
1 <div id="map"><!-- マップ挿入 --></div> 2 <ul class="city-map-link"> 3 <li><a href="#" class ="map-mbox mapbtn" data-type="post"><span class="tf-w">郵便ポスト</span></a></li> 4 <li><a href="#" class ="map-park mapbtn" data-type="park">公園</a></li> 5 <li><a href="#" class ="map-tbox mapbtn" data-type="tel">公衆電話</a></li> 6 <li><a href="#" class ="map-css mapbtn" data-type="css">観光地</a></li> 7 <li><a href="#" class ="map-all mapbtn" data-type="all">すべて</a></li> 8 </ul> 9 10<script async src="https://maps.googleapis.com/maps/api/js?key=000000000000&callback=initMap"></script> 11
javascript
1const data = [ 2 { name: "郵便ポスト", lat: 35.661077, lng: 140.159477 ,cate:'park'}, 3 { name: "公園", lat: 35.662087, lng: 140.159467 ,cate:'tel'}, 4 { name: "公衆電話", lat: 35.663097, lng: 140.159457,cate:'tel' }, 5 { name: "博物館", lat: 35.663097, lng: 140.159477,cate:'post' } 6]; 7 8function initMap() { 9 const center = {lat: 35.661077, lng: 140.159477}; 10 const map = new google.maps.Map(document.getElementById("map"), { 11 zoom: 16, 12 center: center, 13 }); 14 // 現在表示されているinfoWindowオブジェクト 15 let currentWindow; 16 let icon_img; 17 let visible ; 18 19 data.map(d => { 20 // マーカーをつける 21 if(d.cate === 'post'){ 22 icon_img = './images/map/icon_post.svg'; 23 visible = false; 24 }else if(d.cate === 'park'){ 25 icon_img = './images/map/icon_park.svg'; 26 visible = false; 27 }else if(d.cate === 'tel'){ 28 icon_img = './images/map/icon_tel.svg'; 29 visible = false; 30 }else if(d.cate === 'css'){ 31 icon_img = './images/map/icon_css.svg'; 32 visible = false; 33 } 34 35 const $mapbtn = document.querySelectorAll('.mapbtn'); 36 $mapbtn.forEach((val,index) => { 37 $mapbtn[index].addEventListener('click', e =>{ 38 const maptype = e.target.dataset.type; 39 e.preventDefault(); 40 }); 41 }); 42 43 const marker = new google.maps.Marker({ 44 position: {lat: d.lat, lng: d.lng}, 45 map: map, 46 icon:new google.maps.MarkerImage( 47 icon_img, 48 new google.maps.Size(30, 30),//マーカー画像のサイズ 49 new google.maps.Point(0, 0),//マーカー画像表示の起点(変更しない) 50 new google.maps.Point(15, 15)//マーカー位置の調整 51 ), 52 visible:visible, 53 }); 54 55 // マーカークリックしたら地名をポップアップさせる 56 marker.addListener('click', () => { 57 currentWindow && currentWindow.close(); 58 const infoWindow = new google.maps.InfoWindow({content: d.name}); 59 infoWindow.open(map, marker); 60 currentWindow = infoWindow; 61 }); 62 }); 63}
現状では地図の取り込みはできていて、クリックではなく、直接変数visibleをtrueにすると
マーカー表示ができる状態です。
javascript
1 data.map(d => { 2 // マーカーをつける 3 if(d.cate === 'post'){ 4 icon_img = './images/map/icon_post.svg'; 5 visible = true; 6 }else if(d.cate === 'park'){ 7 icon_img = './images/map/icon_park.svg'; 8 visible = true; 9 }else if(d.cate === 'tel'){ 10 icon_img = './images/map/icon_tel.svg'; 11 visible = true; 12 }else if(d.cate === 'css'){ 13 icon_img = './images/map/icon_css.svg'; 14 visible = true; 15 }
試したこと
javascript
1 $mapbtn[index].addEventListener('click', e =>{ 2 const maptype = e.target.dataset.type; 3 if(maptype === d.cate){ 4 visible = true; 5 } 6 e.preventDefault(); 7 });
定数のdataは運用時に400件くらいを想定しています。(jsonデータを読み込む予定です)
つたない説明で申し訳ございませんが、よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/16 23:51
2021/02/17 01:07
2021/02/17 04:56
2021/02/17 04:57
2021/02/17 05:02
2021/02/17 09:40