質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

747閲覧

GoogleMap クリックでmarkerを変更したい。

take45

総合スコア30

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/02/16 09:09

プログラム初心者です。よろしくお願いします

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データを読み込む予定です)
つたない説明で申し訳ございませんが、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

marker を配列などに入れておいて、visibleを操作すればいいのではないかな、と思いました。

setVisible | Marker  |  Maps JavaScript API  |  Google Developers


個人的には、markermanager を使うと楽かもしれないな、と思います。
Google Maps JavaScript API v3 Utilities

投稿2021/02/16 09:35

Lhankor_Mhy

総合スコア36158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

take45

2021/02/16 23:51

早速の回答ありがとうございます。 ご紹介いただいたリンク先を参照いたしましたが、 私の英語力とプログラム力不足のため、 どのようにすれば解決できるかわかりませんでした。 大変申し訳ございませんが、もし可能なら どこをどのように変更したら良いかご教授いただけるとありがたいです。
Lhankor_Mhy

2021/02/17 01:07

失礼しました。markermanager はこの目的には合わなさそうでした。 具体的には、 const marker = new google.maps.Marker( としているところを、配列にpushするなどしてマーカーの配列を作り、 $mapbtn[index].addEventListener('click', e =>{ の中で、配列を.forEachで回すなどして、ひとつづつ setVisible() メソッドで叩いていく、という流れがいいのではないかな、と思います。
take45

2021/02/17 04:56

自己解決いたしました。 回答を受け止める実力がなく申し訳ございませんでした。 また、2度も回答いただきありがとうございました。
Lhankor_Mhy

2021/02/17 04:57

ご解決されて何よりです。
take45

2021/02/17 09:40

ありがとうございます。 正にやりたいことです。 既に解決案で実装を終えたので、次回アップデート時にご紹介いただいた方法で実装したいと思います。 大変参考になりました。
guest

0

自己解決

iniMap()で地図自体を何度も描画したくなかったので、全てのマーカ情報を得た上で、visible機能でマーカーのみ表示、非表示をしようとしていましたが、実力不足でうまくいかなかったので、
各マーカー情報を分け、iniMap()に引数を追加し、addeventListenerでiniMap()に再度引数を渡し再描画することで解決しました。

元データ

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 8 9function initMap() { 10 11} 12 13

変更データ

javascript

1 2const dataPost = [ 3 { name: "郵便ポスト", lat: 35.661077, lng: 140.159477 ,cate:'post'}, 4 5]; 6const dataPark = [ 7 { name: "公園", lat: 35.662087, lng: 140.159467 ,cate:'park'}, 8]; 9const dataTel = [ 10 { name: "公衆電話", lat: 35.663097, lng: 140.159457,cate:'tel' }, 11]; 12const dataCss = [ 13 { name: "博物館", lat: 35.663097, lng: 140.159477,cate:'css' } 14]; 15const dataAll = [ 16 { name: "郵便ポスト", lat: 35.661077, lng: 140.159477 ,cate:'post'}, 17 { name: "公園", lat: 35.662087, lng: 140.159467 ,cate:'park'}, 18 { name: "公衆電話", lat: 35.663097, lng: 140.159457,cate:'tel' }, 19 { name: "博物館", lat: 35.663097, lng: 140.159477,cate:'css' } 20]; 21 22 23 24function initMap(data) { 25 26} 27 28const $mapbtn = document.querySelectorAll('.mapbtn'); 29 $mapbtn.forEach((val,index) => { 30 $mapbtn[index].addEventListener('click', e =>{ 31 const maptype = e.target.dataset.type; 32 initMap(maptype) 33 e.preventDefault(); 34 }); 35 }); 36

ご回答いただいた方、ありがとうございました。

投稿2021/02/17 04:48

take45

総合スコア30

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問