Google Map Api 複数のマーカーを設置するスクリプトで一部が表示されない

このQ&Aのポイント
  • Google Map Apiで複数のマーカーを設置するスクリプトを組みましたが、一部が表示されずに問題が発生しています。
  • 表示されるマーカーと表示されないマーカーが混在しており、処理の速度やJSの処理の流れに問題があるのかもしれません。
  • すべてのマーカーが表示されるようにするためには、表示の前に適切な待ち時間を設けるか、ajaxを使用するなどの対策が必要です。
回答を見る
  • ベストアンサー

Google Map Api 複数のマーカーをおくと、一部が表示されない

お疲れ様です。 お世話になっております。 Google Map Apiで複数のマーカーを設置するスクリプトを組みました。 10件程度は問題なく表示されるのですが、10件を境に、表示されたり、されなかったりします。 F5で表示されるもの、されないものとまばらになるので、なんとなく原因は、処理よりも表示のほうが速いからではないか?ということなんですが、JSの処理の流れがイマイチわかっていないので、結論は出せません。 実際20件登録したところ、10件~17件の間で出たり出なかったりします。1~10件までは必ず表示され、その後ろのIDを持つものがランダムになります。 これを確実に全部表示されるようにしたいのですが、表示の前にsleepなどかけるのがよいのか、ajaxにしてみるのがよいのかなど、検討がつきません。 下記が、書いたスクリプトです。 もしよければ、アドバイスお願いします。 var markers = new Object(); var marker = new Object(); marker["name"] = "xxx"; marker["icon"] = "ylw-pushpin"; marker["address"] = "座標変換用の住所"; marker["text"] = "噴出しの中身"; marker["center"] = "中心にするかしないか"; markers[0] = marker; 20回ループ markers[20] = marker; googlemap(markers) -----------googlemap(markers) function googlemap(markers) { if (GBrowserIsCompatible()) { geocoder = new GClientGeocoder(); map = new GMap2(document.getElementById("map")); map.addControl(new GSmallZoomControl()); map.addControl(new GScaleControl()); for(var i in markers){ showAddress(markers[i]); //ここは20回ちゃんとまわってるようです } } } ------------------showAddress() function showAddress(amarker) { if (geocoder) { geocoder.getLatLng( amarker['address'], function(point) { if(amarker['center'] == 1){ map.setCenter(point, 12); } //アイコンが指定されてたらアイコンを設定 if(amarker['icon']){ var marker = new GMarker(point,micon); //アラートしてみると、ここが10回~17回ぐらいしか回ってない }else{ var marker = new GMarker(point); } map.addOverlay(marker); GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(ふきだしのなかみ) }); } ); } }

質問者が選んだベストアンサー

  • ベストアンサー
  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.1

それはおそらく geocoder.getLatLng() をループで連続してまわしているからです。 位置の取得に失敗しているため、マーカー表示できないのです。 無料サービスの方では、連続してジオコーディングできない仕様に なっています。レスポンスのステータスに620が返っているはずです。 ステータスが200(正常以外)の時は、時間を2~3秒待って、再度 コールするようなループにすればうまくいくはずです。 ステータスによるハンドリングが面倒ならpointがnullかどうかで判定できます。

参考URL:
http://code.google.com/intl/ja/apis/maps/documentation/services.html#Geocoding_Object
nyalio
質問者

お礼

(゜Д゜;)ガーーーーン 知りませんでした・・・。 DBに登録される時点でlat,lonにgetLatLngで変換して入れようと思います。 すっごい困ってたんです。 おかげさまで助かりました。 今すぐ変換スクリプト組んできます。 ありがとうございましたー。

その他の回答 (2)

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.3

連続回答してすみません。 GooglMap好きなもので.... マーカーが多量にある時の抜本的な対策ですが 位置情報は都度都度ジオコーディングするのでなく、 予め取得した結果をDB(javascriptでは無理)なり、XMLなり、 JSONなり、リテラル値で準備しておいて、そこから取得して マーカー作成し表示させるのです。 それでもマーカーが100個..-> 1000個になると、ブラウザーが ハング状態になります。 そんな時は、GMarkerManagerクラスを使って、マップスケール毎に 表示するマーカーを制御したりします。 それでも遅いなら、「Google Maps API for Flash」の方を使います。

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.2

補足 待つのは2~3秒でなく、 0.2~0.3秒でもだいじょうぶそうです。(混み具合によります) 参考投稿(よそですが) http://groups.google.com/group/Google-Maps-API-Japan/browse_thread/thread/c3e2eee995280ae7

関連するQ&A

  • googlemap api で複数マーカー表示

    複数のマーカー表示は最初できてたんですが、 住所から座標を取得してマーカーを複数表示ができません。。 <script type="text/javascript"> function load() { if (GBrowserIsCompatible()) { var map = new GMap2(document.getElementById("map")); //地図を作成 map.setCenter(new GLatLng(35.969115,139.372559), 8); //地図を表示((中心の緯度,経度),縮尺) map.addControl(new GSmallMapControl()); //マップコントローラを付ける map.addControl(new GMapTypeControl()); //マップタイプコントローラを付ける map.addControl(new GScaleControl()); //スケールコントローラを付ける map.removeMapType(G_HYBRID_MAP); //マップタイプコントローラから地図+写真を削除する map.enableScrollWheelZoom(); //マウスホイールによるズーム処理を有効化 //マーカー追加プログラム function addMarker(lat,lng,html) { var geocoder = new GClientGeocoder(); geocoder.getLatLng ( lat, function(point) { var marker = new GMarker(new GLatLng(point,lng)); //マーカー生成 GEvent.addListener(marker,"mouseover",function(){marker.openInfoWindowHtml(html);});//マーカーにマウスが当たると情報ウィンドウを表示する map.addOverlay(marker); //マーカーをオーバレイ表示する } ); } //マーカー追加 addMarker("横浜市",'<p>html</p>'); addMarker("東京都",'<p>html</p>'); } } </script> </head> <body onload="load()" onunload="GUnload()"> 中略・・・ 初心者なもので、、、 ご回答お願いいたします。

  • Google Maps:同マップ内でそれぞれのアイコンの表示・非表示を切り替えるには

    いつもお世話になっております。 Google Mapsを利用し、同マップ内でそれぞれのアイコンの表示・非表示を切り替えたいという要望を受けたのですが、やりかたがわからず途方に暮れています。 - 要望 ------------------------------------------- 1.Google Maps内にカテゴリ1~6に属する、デザインがちがうアイコンをそれぞれ3つずつ表示。 2.このアイコンを、カテゴリ群ごとにボタンか何かで表示・非表示を切り替える。 -------------------------------------------------- [1]に関してはできたのですが、[2]のやり方がわかりませんでした。 代替案として、カテゴリごとにGoogle Mapsを読み込むhtmlを変えて iframe内で表示するというのを出したのですが、 “同マップ上でアイコンだけ表示したり消したり”したいとの ことでした。 [1]を実現するのに使用したコードが下記になります。 (※マーカーの関するスクリプトだけ外部ファイル化し、bodyにonloadでcreateMapを読み込んでいます) ----------------------------------------------------- function createMap() { var map = new GMap2(document.getElementById("map")); map.addControl(new GLargeMapControl()); map.addControl(new GOverviewMapControl()); map.setCenter(new GLatLng(緯度, 経度), 13); var icon = new GIcon(); icon.image = "marker.png"; icon.shadow = "shadow.png"; icon.iconSize = new GSize(20, 34); icon.iconAnchor = new GPoint(10, 34); icon.infoWindowAnchor = new GPoint(7, 1); var icon2 = new GIcon(); icon2.image = "marker2.png"; icon2.shadow = "shadow.png"; icon2.iconSize = new GSize(20, 34); icon2.iconAnchor = new GPoint(10, 34); icon2.infoWindowAnchor = new GPoint(7, 1); var point001 = new GLatLng(緯度, 経度); var marker001 = new GMarker(point001, icon); map.addOverlay(marker001); GEvent.addListener(marker001, 'click', function() { marker001.openInfoWindowHtml('<div style="width: 300px">吹き出し<\/div>'); }); var point002 = new GLatLng(緯度, 経度); var marker002 = new GMarker(point002, icon2); map.addOverlay(marker002); GEvent.addListener(marker002, 'click', function() { marker002.openInfoWindowHtml('<div style="width: 300px">吹き出し<\/div>'); }); } ---------------------------------------------- ここまで 方法について、ご存じの方がいらっしゃったら 教えていただきたいです。 よろしくお願いいたします!

  • Googlemap apiでFFとNNでマーカーの表示が出ないのですが、どこが間違っていますか?

    Googlemap でマーカーの吹き出しに指定のHtmlを表示するように書いたつもりなのですが、IEとオペラでは意図どうりに表示されるのですがFFとNNではマーカーが表示されません。 javascriptはあまり得意ではないのでわかりやすく説明して頂けると他助かります。 //<![CDATA[ function load() { if (GBrowserIsCompatible()) { var map = new GMap2(document.getElementById("map")); map.setCenter(new GLatLng(43.05578, 141.353257), 15); map.addControl(new GLargeMapControl()); map.addControl(new GMapTypeControl()); kyaba =[ [141.353075, 43.053673, "ダミー", "ダミー2", "ダミー3"], [141.352919, 43.054167, "ダミー", "ダミー2", "ダミー3"] ]; for (i = 0; i < kyaba.length; i++){ point = new GPoint(kyaba[i][0], kyaba[i][1]); dada = "<p>" + kyaba[i][2] + "</p>" + "<p>" + kyaba[i][3] + "</p>" + "<p>" + kyaba[i][4] + "</p>"; createMarker(point, dada); function createMarker(point,msg){ var marker = new GMarker(point); map.addOverlay(marker); GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(msg); }); } } } } //]]> </script>

  • google mapで二番目以降のマップが表示されない

    自作のマーカーを使い、マーカーをクリックすると吹き出しが出るようにして、マップ上2か所にマーカーを付けたのですが、2番目のマーカーが全く反映されません。 下に書いたものがそのコードなのですが、見直してもどこにミスがあるのかわかりません… どなたか解決策をお願いします… <script type="text/javascript"> //<![CDATA[ var map = new GMap(document.getElementById("map")); map.addControl(new GLargeMapControl()); map.addControl(new GMapTypeControl()); map.centerAndZoom(new GPoint(135.384521484375,34.73709847578162), 8 ); var icon = new GIcon(); icon.image = " pngイメージ画像 "; icon.shadow = " pngイメージ画像 "; icon.iconSize = new GSize(12, 20); icon.shadowSize = new GSize(22, 20); icon.iconAnchor = new GPoint(6, 20); icon.infoWindowAnchor = new GPoint(5, 1); // 1番目位置 var point = new GPoint(省略); var marker = new GMarker(point,icon); map.addOverlay(marker); // 1番目吹き出し GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml("<div style='width:350px;font-size:12px;' ><table><tr><td><img src=イメージ画像 ><br><a href=\"ページへのリンク\"target=\"blank\" >説明文<br><br></td></tr></table></div>");}); var marker = createMarker(point,html); map.addOverlay(marker); // 2番目位置 var point = new GPoint(省略); var marker = new GMarker(point,icon); map.addOverlay(marker); // 2番目吹き出し GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml("<div style='width:350px;font-size:12px;' ><table><tr><td><img src=イメージ画像 ><br><a href=\"ページへのリンク\"target=\"blank\" >説明文<br><br></td></tr></table></div>");}); var marker = createMarker(point,html); map.addOverlay(marker); //]]> </script>

  • Googleマップのウィンドウの表示

    Googleマップの情報ウィンドウの件ですが、ページが開いた瞬間ウィンドウが開いた状態にしたいのですが、 クリックしてウィンドウを開く方法しかわかりませんでした。 ワンクッション置かずにウィンドウを表示させる方法はありませんでしょうか? 以下が関連のソースになります。 上手くカスタマイズできませんでしょうか。(座標はダミーです) よろしくお願いいたします。 //指定されたpoint(緯度経度)、icon、htmlをもったGMarkerを作って返す関数 function createMarker(point, icon, html) { var marker = new GMarker(point, icon); //クリックしたら吹き出し表示 GEvent.addListener(marker, 'click', function() { marker.openInfoWindowHtml(html); }); return marker; } //アイコンを追加 map.addOverlay(createMarker(new GLatLng(105.612038, 27.409698), icon, "<nobr><b>aaa<br>aaa</b><br>aaa<br>aaa</nobr>"));} }

  • GoogleMaps API 住所から複数ピンを表示

    GoogleMaps API素人ですが・・・ 最近いろいろやっていてやっとDBの住所(日本語の住所 例:大阪府大阪市中央区平野町1丁目)を引っ張ってきてグーグルマップで座標を取得してピンを立てることに成功しました。 今苦戦しているのは同じ地図上に複数のピンをさす方法です。 どなかた教えていただけないでしょうか? ちなみに今1ピン表示に成功してるコードはこちらです。 どこから、どこまで繰り返したらいいのでしょうか・・・? ------------------------------ <? //DB(MySQL)からデータ取得 $address = $row["address"]; $fukidashi = "住所:".$row["address"]; ?> <div id="map" style="width:500px; height:400px; border:1px solid #999;"></div> <script type="text/javascript"> <!-- var map = null; var geocoder = null;   var address = "<?=$address;?>"; function load() { if (GBrowserIsCompatible()) { map = new GMap2(document.getElementById("map")); map.addControl(new GLargeMapControl()); geocoder = new GClientGeocoder(); geocoder.getLatLng( address, function(point) { if (!point) { alert(address + " の住所が見つかりません"); } else { map.setCenter(point, 16); var marker = new GMarker(point); map.addOverlay(marker); //吹きだし情報 var msg_html1 = "<?=$fukidashi;?>"; marker.openInfoWindowHtml(msg_html1); } } ); } } //--> </script>

  • グーグルマップについて教えてください。

    【やりたいこと】 グーグルマップとストリートビューを連動するところまではできました。しかし、地図をクリックして取得されるデータをマーカーが出るように設定し所までは良かったのですが、そのマーカーをクリックしても必要なデータが表示されません。どの様にしたらいいでしょうか? ソースは下記の通りです。 var map; var myPano; var panoClient; var currentLatLng = new GLatLng(35.6829, 139.7653); window.onload = function() { load(); loadd(); setEvent(); } function load() { map = new GMap2(document.getElementById("mymap"),{draggableCursor:"crosshair"}); map.setCenter(new GLatLng(35.6829, 139.7653), 8);    map.addControl(new GMapTypeControl());    map.addControl(new GLargeMapControl3D());    streetview = new GStreetviewOverlay();    map.addOverlay(streetview); map.addControl(new GOverviewMapControl(new GSize(200,200))); } function loadd() {     myPano = new GStreetviewPanorama(document.getElementById("pano")); GEvent.addListener(map,"click", function(overlay,point) { currentLatLng=point; myPano.setLocationAndPOV(currentLatLng); map.setCenter(currentLatLng); }); } function createGMarker(title, html, lat, lng) { var infoObj = new Object(); infoObj.title = title; var gpObj = new GLatLng(lat, lng); var marker = new GMarker(gpObj, infoObj); map.addOverlay(marker); GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(html); }); }

  • Googleマップ上で、オリジナルのマーカーを表示したい

    Googleマップ上で、オリジナルのマーカーを表示したい WEBサイトに表示しているミニ写真画像にマウスオーバーしたら、 Googleマップでマーカーを使ってその写真の場所を表示し、拡大写真も表示するようにしたいと思い、 下記のサイトを参考にして、作成しています。 http://ascii.jp/elem/000/000/421/421381/ Googleマップのデフォルトマーカーを使っては、希望通り、 上記のサイトのようなものができました。 ここで、表示する間隔が狭いので、わかりやすく、数字を振った オリジナルマーカーを使って表示したいと思うのですが、 それがうまくできません。 jisファイルは下記のように書いています。 $(function(){ var map = new GMap2(document.getElementById("gmap")); var firstData = $(".map:first").attr("longdesc").split(","); $("#googlemap").html("<img src=" + firstData[0] + ">"); var pos = new GLatLng(parseFloat(最初に表示する緯度),parseFloat(最初に表示する経度)); map.addOverlay(new GMarker(pos)); map.setCenter(new GLatLng(最初に表示する緯度, 最初に表示する経度), 15); map.addControl(new GSmallMapControl()); $(".map").mouseover(function(){ var shopdata = $(this).attr("longdesc").split(","); $("#googlemap").html("<img src=" + shopdata[0] + ">"); var markerIcon1 = new GIcon(); markerIcon1.image = "./img/flg-"+shopdata[3]+".png"; markerIcon1.iconSize = new GSize(20, 34); markerIcon1.iconAnchor = new GPoint(10, 34); var marker1 = new GMarker(new GLatLng(shopdata[1],shopdata[2]), markerIcon1); if($(this).attr("flag")) return; map.panTo(marker1, 9); map.addOverlay(marker1); $(this).attr("flag", true); }); }) HTMLのミニ画像を表示している部分は以下です。 <img src="./img/map-1.jpg" class="sekomap" longdesc="./img/map1-1.jpg,緯度,経度,マーカーに表示したい数字"> プログラムに間違いがあるかもしれませんが、 この状態ですと、エラーになって、オリジナルのマーカーも表示されないし、 ミニ写真の位置にも移動しなくなってしまいます。 どなたかご存じの方いらっしゃいましたら、教えてください。 色々調べましたが、もうお手上げ状態です。。(ToT)

    • ベストアンサー
    • AJAX
  • GOOGLE MAPを別ウインドで表示

    ホームページ作成初心者です。 ネットの検索で、以下スクリプトで自分の作成したホームページにGoogleMAPを表示することができました。しかしこのやり方ですと、表示する地図ごとにHTMLで記述する必要があるように思います。当方は表示したい地図が100個以上あるので全てHTMLファイルを作成するのは困難です。できればホームページに地図ボタンを100個作成し、ボタンを押されたときに引数として必要パラメータを渡して、地図表示を行うHTMLファイルをひとつ用意しておいて、そのHTMLファイルで全ての地図表示をするように変更したいのですが、どうしたらよいかご存知の方がいましたら教えて頂けないでしょうか? 以下が使用しているGoogleMAP表示のソースです。 <body> <div id="map" style="width: 800px; height: 180px"></div> <div id="message"></div> <script type="text/javascript"> //<![CDATA[ var map = new GMap(document.getElementById("map")); map.addControl(new GSmallMapControl()); // 3.で取得した 緯度、経度を (経度, 緯度)の順で入力する // // new GPoint(139.711606, 35.646643) ←この部分 // var point = new GPoint(139.48270082473755, 35.90869157631627); map.centerAndZoom(point, 0); var icon = new GIcon(); // マーカーのアイコン画像指定 icon.image = "map_arrow.png"; // マーカーの影アイコン画像指定 icon.shadow = "map_arrow_shadow.png"; // アイコンのサイズを記述 icon.iconSize = new GSize(34, 25); // 影アイコンのサイズを記述 icon.shadowSize = new GSize(34, 25); icon.iconAnchor = new GPoint(1, 23); icon.infoWindowAnchor = new GPoint(10, 10); // もう一度マーカーのアイコン画像指定 icon.transparent = "map_arrow.png"; var marker = new GMarker(point, icon); GEvent.addListener(marker, "click", function() { // // marker.openInfoWindowHtml("<b><a href='http://www.goo.ne.jp/'>マル広</a></b>" ); }); map.addOverlay(marker); //]]> </script> </body> 以上です。なにぶん初心者なので、他に必要な情報など ありましたらご教示お願いします。 よろしくお願いします。

  • googlemapapi複数マーカー10個以上表示

    初心者です。。 見よう見まねで何とか下記まではできました。 function load() { if (GBrowserIsCompatible()) { var map = new GMap2(document.getElementById("map")); //地図を作成 map.setCenter(new GLatLng(35.969115,139.372559), 8); //地図を表示((中心の緯度,経度),縮尺) map.addControl(new GSmallMapControl()); //マップコントローラを付ける map.addControl(new GMapTypeControl()); //マップタイプコントローラを付ける map.addControl(new GScaleControl()); //スケールコントローラを付ける map.removeMapType(G_HYBRID_MAP); //マップタイプコントローラから地図+写真を削除する map.enableScrollWheelZoom(); //マウスホイールによるズーム処理を有効化 //マーカー追加プログラム function addMarker(address, html) { var geocoder = new GClientGeocoder(); geocoder.getLatLng(address, function(point) { var marker = new GMarker(point); //マーカー生成 GEvent.addListener(marker,"mouseover",function(){marker.openInfoWindowHtml(html);});//マーカーにマウスが当たると情報ウィンドウを表示する map.addOverlay(marker); //マーカーをオーバレイ表示する }); } //マーカー追加 addMarker("住所",'<p>html</p>'); addMarker("住所",'<p>html</p>'); addMarker("住所",'<p>html</p>'); addMarker("住所",'<p>html</p>'); addMarker("住所",'<p>html</p>'); addMarker("住所",'<p>html</p>'); addMarker("住所",'<p>html</p>'); addMarker("住所",'<p>html</p>'); addMarker("住所",'<p>html</p>'); addMarker("住所",'<p>html</p>'); addMarker("住所",'<p>html</p>'); addMarker("住所",'<p>html</p>'); addMarker("住所",'<p>html</p>'); addMarker("住所",'<p>html</p>'); addMarker("住所",'<p>html</p>'); addMarker("住所",'<p>html</p>'); addMarker("住所",'<p>html</p>'); addMarker("住所",'<p>html</p>'); addMarker("住所",'<p>html</p>'); addMarker("住所",'<p>html</p>'); addMarker("住所",'<p>html</p>'); addMarker("住所",'<p>html</p>'); } } 10個以上あるとマップ上に表示されないようです。。。 最終的に100件200件になると思うので、 すべて表示させたいのですが・・・ 何か方法はないでしょうか。。 具体的に教えていただけると助かります。。

専門家に質問してみよう