実現したいこと
Google Maps APIを使って複数のマーカーを表示したい。
発生している問題・分からないこと
Laravelで食べログ風アプリを作成しています。
Google Maps APIを使用して、地図上に複数のマーカーを表示したいのですが、
1つしか表示されていない状況です。
解決方法がわかる方がいらっしゃいましたら、教えていただけますと幸いです。
該当のソースコード
javascript
1// viewファイルよりお気に入り店舗の情報を取得している 2var markerData = Laravel.favorite_shops; 3var marker =[]; 4 5// googleMapsAPIを持ってくるときに,callback=initMapと記述しているため、initMap関数を作成 6async function initMap() { 7 8 // welcome.blade.phpで描画領域を設定するときに、id=mapとしたため、その領域を取得し、mapに格納します。 9 map = document.getElementById("map"); 10 11 async function setLocation(pos) { 12 13 // 現在の緯度・経度を取得 14 const currentLat = pos.coords.latitude; 15 const currentLng = pos.coords.longitude; 16 17 // 現在の緯度経度を代入 18 let currentLocation = { lat: currentLat, lng: currentLng }; 19 20 var marker = new Array(); 21 // 複数のピンを作成する 22 for (var i = 0; i < markerData.length; i++) { 23 24 var place = markerData[i]['name']; 25 26 const geocoder = new google.maps.Geocoder(); // Googlgのサーバーと通信するためのインスタンスを生成 27 geocoder.geocode( 28 { 29 address: markerData[i]['address'], // 住所から緯度経度に変換 30 region: "jp", 31 }, 32 async function (results, status) { 33 34 if (status == google.maps.GeocoderStatus.OK) { 35 36 // 取得が成功した場合 37 // 結果をループして取得します。 38 for (var i in results) { 39 if (results[i].geometry) { 40 41 // 緯度を取得します。 42 var lat = results[i].geometry.location.lat(); 43 // 経度を取得します。 44 var lng = results[i].geometry.location.lng(); 45 46 map = document.getElementById("map"); 47 48 // オプションを設定 49 opt = { 50 zoom: 11, //地図の縮尺を指定 51 center: currentLocation, //センターを取得した緯度経度に指定 52 }; 53 54 // 地図のインスタンスを作成します。第一引数にはマップを描画する領域、第二引数にはオプションを指定 55 mapObj = new google.maps.Map(map, opt); 56 57 var markerLatLng = new google.maps.LatLng({lat: lat, lng: lng}); // 緯度経度のデータ作成 58 59 marker[i] = new google.maps.Marker({ 60 // ピンを差す位置を決めます。 61 position: markerLatLng, 62 // ピンを差すマップを決めます。 63 map: mapObj, 64 65 }); 66 67 // marker[i]をコンソールで確認したが、正しい緯度経度が取得できている。 68 console.log(marker[i]); 69 70 // そもそも、ループを回して、検索結果にあっているものをiに入れていっているため 71 // 精度の低いものもでてきてしまう。その必要はないから、一回でbreak 72 break; 73 } 74 75 } 76 } else if (status == google.maps.GeocoderStatus.ERROR) { 77 alert("サーバ接続に失敗しました。"); 78 } else if (status == google.maps.GeocoderStatus.INVALID_REQUEST) { 79 alert("リクエストが無効でした。"); 80 } else if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) { 81 alert("リクエストの制限回数を超えました。"); 82 } else if (status == google.maps.GeocoderStatus.REQUEST_DENIED) { 83 alert("サービスが使えない状態でした。"); 84 } else if (status == google.maps.GeocoderStatus.UNKNOWN_ERROR) { 85 alert("原因不明のエラーが発生しました。"); 86 } 87 } 88 ); 89 } 90 } 91 92 // エラー時に呼び出される関数 93 function showErr(err) { 94 switch (err.code) { 95 case 1: 96 alert("位置情報の利用が許可されていません"); 97 break; 98 case 2: 99 alert("デバイスの位置が判定できません"); 100 break; 101 case 3: 102 alert("タイムアウトしました"); 103 break; 104 default: 105 alert(err.message); 106 } 107 } 108 109 // geolocation に対応しているか否かを確認 110 if ("geolocation" in navigator) { 111 var opt = { 112 "enableHighAccuracy": true, 113 "timeout": 10000, 114 "maximumAge": 0, 115 }; 116 navigator.geolocation.getCurrentPosition(setLocation, showErr, opt); 117 } else { 118 alert("ブラウザが位置情報取得に対応していません"); 119 } 120 121} 122 123 124 125
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
var marker[i] の中身をコンソールで確認した。
→緯度経度は正しく取得できている。
さまざまなサイトを参考にし、解決しようと試みましたが、
なかなか上手くいきませんでした。
補足

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/04/06 08:42
2024/04/06 12:33
2024/04/06 15:08
2024/04/07 04:16