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

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

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

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

1504閲覧

google maps api でマーカーが表示されない原因と解決策を教えてください!

hhhira326

総合スコア4

Google API

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

1クリップ

投稿2022/01/30 08:56

google maps api で周辺の飲食店情報を取得しようとしています。
位置情報取得した後のマップは表示されるのですが
ポインターが表示されません。

どうやら変数userPositionに値が入っていないようです。
geolocationでは値が代入され動いているのですが、
それ以降は値が入っていません。

原因や解決策を教えてください!!

hoge.js

1var takeoutVal = 0; 2var distanceVal = 400; 3var genreVal = 0; 4 5function tChange() { 6 takeoutVal = document.getElementById("takeout").value; 7}; 8function dChange() { 9 distanceVal = document.getElementById("distance").value; 10}; 11function gChange() { 12 genreVal = document.getElementById("genre").value; 13}; 14var map; 15var userPosition; 16 17//================================================== 18 19 20// mapの表示 21function initMap() { 22 'use strict'; 23 var mapCanvas = document.getElementById('map'); 24 25 // Geolocation 26 if (!navigator.geolocation) { 27 alert('Geolocation not supported'); 28 return; 29 } 30 navigator.geolocation.getCurrentPosition(function(position) { 31 userPosition = {lat: position.coords.latitude, lng: position.coords.longitude} 32 map = new google.maps.Map(mapCanvas, { 33 center: userPosition, 34 zoom: 15, 35 radius: distanceVal, 36 disableDefaultUI: true, //地図切り替え、ズームボタンなどを無効化する 37 fullscreenControl: true,//全画面表示コントロールは表示する 38 fullscreenControlOptions: { //全画面表示コントロールの位置 39 position: google.maps.ControlPosition.RIGHT_BOTTOM, 40 }, 41 }); 42 }, function() { 43 alert('Geolocation failed!'); 44 return; 45 }); 46 47 //情報ウィンドウのインスタンスの生成(後でマーカーに紐付け) 48 var infowindow = new google.maps.InfoWindow(); 49 50 //PlacesService のインスタンスの生成(引数に map を指定) 51 var service = new google.maps.places.PlacesService(map); 52 53 54 service.nearbySearch({ 55 location: userPosition, //検索するロケーション 56 radius: distanceVal, //検索する半径(メートル) 57 openNow:true, 58 type: ['food'] //タイプで検索。文字列またはその配列で指定 59 }, callback); //コールバック関数(callback)は別途定義 60 61 function callback(results, status) { 62 if (status === google.maps.places.PlacesServiceStatus.OK) { 63 //results の数だけ for 文で繰り返し処理 64 for (var i = 0; i < results.length; i++) { 65 createMarker(results[i]); 66 } 67 } 68 } 69 70 //マーカーを生成する関数(引数には検索結果の配列 results[i] が入ってきます) 71 function createMarker(place) { 72 //var placeLoc = place.geometry.location; 73 var marker = new google.maps.Marker({ 74 map: map, 75 position: place.geometry.location //results[i].geometry.location 76 }); 77 78 //マーカーにイベントリスナを設定 79 marker.addListener('click', function() { 80 infowindow.setContent(place.name); //results[i].name 81 infowindow.open(map, this); 82 }); 83 }

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

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

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

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

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

Lhankor_Mhy

2022/01/31 01:53

「ポインターが表示されません」とのことですが、マーカーのことでいいですか?
hhhira326

2022/01/31 04:23

はい!失礼しました!マーカーのことです!
guest

回答1

0

ベストアンサー

navigator.geolocation.getCurrentPosition()は非同期処理なので、service.nearbySearch(...)が実行されるタイミングではコールバック関数のfunction(position) {...}は実行されていません。
コールバックの中に書くか、Promise などを使って処理するのがいいでしょう。

javascript - Javascirpt async/awaitを用いた非同期処理の制御について - スタック・オーバーフロー

投稿2022/01/31 02:04

Lhankor_Mhy

総合スコア36142

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

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

hhhira326

2022/01/31 05:34

ありがとうございます!貼っていただいたものを参考にpromiseで処理したらできました! 非同期処理かどうかの見極めがわからないのですが、どうなったら非同期関数という判断になりますか? 「ページのリロードがされない」を基準に判断すればいいのでしょうか??
Lhankor_Mhy

2022/01/31 05:55 編集

大抵はMDNに「非同期的に」などと書いてありますが、これは書いてないですね。 仕様を読めばタスクキューを使うことは分かるのですが、ちょっとハードル高いですね。 https://w3c.github.io/geolocation-api/#acquire-a-position https://qiita.com/sho_U/items/ff82aa576837198097ce HTTPリクエストやGPS測位みたいな、処理に時間がかかるものはだいたい非同期的、と覚える感じでいいと思います。(そうでないとブロッキングが起きてしまうので)
hhhira326

2022/01/31 06:18

ご丁寧にありがとうございます!! jsも未熟でリファレンスを翻訳してもわからなかったのでとても助かりました!! 本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問