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

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

ただいまの
回答率

90.62%

  • JavaScript

    15874questions

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

  • JSP

    902questions

    JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

  • Google マップ

    353questions

    Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

  • サーブレット

    117questions

    サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

GoogleMapにマーカーを置くために待機時間を作りたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 757

aruheno

score 26

お世話になっております。

現在、DB上に登録している個人情報から住所を取得し、それら全ての場所にGoogelMap上でマーカーを置くウェブアプリケーションを作っています。
10件前後では大丈夫だったのですが、30件前後の住所データを利用すると、「OVER_QUERY_LIMIT」と表示され、一部マーカーが配置されないという問題が出ています。
調べてみたところ、この問題は1度の操作でマーカーを配置しようとしていたために起きているらしく、ちゃんと時間を置いて配置すれば問題なく置けるとの事です。(参考にしたサイトでは、700件マーカーを配置していました)
そこで、sleapやwaitなどの待機時間を作るメソッドをJavaScript内に入れようと考えましたが、setTimeoutは引数にメソッドが必要となり、現在作成しているJavaScriptのマーカー配置メソッドに適用するのは難しいと思いました。
引数が必要ない待機時間を作るメソッドか、もしくは待機時間を取りながらマーカーを配置する良い案があればご回答願います。

現在のJavaScript
var geocoder;
var map;
var detail=new Array();
detail[0] = new Array();
detail[1] = new Array();
detail[2] = new Array();

//GoogleMapの初期描画
function initializeAll() {
    geocoder = new google.maps.Geocoder();
    var latlng = new google.maps.LatLng(緯度,経度);
    var opts = {
        zoom: 10,
        center: latlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    }

    map = new google.maps.Map(document.getElementById("map_canvas"), opts);
}

//取得した個人情報(String)を分解
function getdata(unames,addrs,tels){

    detail[0]=addrs.split(",");
    detail[1]=unames.split(",");
    detail[2]=tels.split(",");

}

//個人情報の数だけマーカー配置メソッドを呼び出す
function plotAddressAll() {
    for(var key=1;key<detail[0].length;key++){
        codeAddress(detail[0][key], detail[1][key], detail[2][key]);
}
}

//マーカー配置メソッド
function codeAddress(address,  name, tel) {

    if (geocoder) {
        geocoder.geocode( { 'address': address,'region': 'jp'},
            function(results, status) {

            if (status == google.maps.GeocoderStatus.OK) {
                map.setCenter(results[0].geometry.location);

                var bounds = new google.maps.LatLngBounds();

                for (var r in results) {
                    if (results[r].geometry) {
                        var latlng = results[r].geometry.location;
                        bounds.extend(latlng);
                        var marker = new google.maps.Marker({
                            position: latlng,
                            map: map,
                            title: name,
                            icon: "image.png",
                        });

                        // 吹き出しを表示(クリック時)
                        var msg = "";
                        msg += "<p style='color: blue;'>" + marker.title + "</p>";
                        msg += "<p>" + address + "</p>";
                        msg += "<p>" + tel + "</p>";
                        attachMessage(marker, msg);

                        document.getElementById('id_ido').innerHTML = latlng.lat();
                        document.getElementById('id_keido').innerHTML = latlng.lng();

                    }
                }
            }else{
            alert("Geocode 取得に失敗しました reason: "
                    + status);
            }
        });
    }
}

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

setTimeoutなどで非同期に実行する場合は別として、ブラウザ上で実行されるJavaScriptは基本的にシングルスレッドで動いています。そのため、(同期的に)時間を待たせるような処理を行ってしまうと、その間ブラウザの操作すらできなくなります。最悪、「スクリプトの実行に時間がかかっています。強制終了しますか?」のようなメッセージを発してしまうこととなります。

時間のかかる処理をフロントエンドで行いたい場合は、タイマーなどで呼び出されるごとに小分けで処理をやっていく、というのがほぼ唯一の選択肢です。

なお、毎回ジオコーディングするのは無駄が多いので、データの登録時点で行って経緯度を記録しておけば、APIの利用制限もほぼ気にしなくて良くなります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/15 17:45

    ありがとうございます。
    ジオコーディングのルールがよくわかっていないので、再度調べてみます。
    分からなかった時はもう一度質問するかもしれません。
    その時はよろしくお願いします。

    キャンセル

+1

geocoder.geocode( { 'address': address,'region': 'jp'}, 

このように、描画のたびにジオコーディングする仕様だと、待機時間を設定しても同じように制限されます。一度取得した緯度経度情報をDBに登録しておくなど、根本的な仕様変更が必要です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/15 17:44

    ありがとうございます。
    もう一度コードを見直してみようと思います。

    キャンセル

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

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    グーグルマップで複数個所にピンが立てたい

    グーグルマップに複数個所ピンを立てて、クリックしたらピンがたった場所への説明がポップアップで出てくるプログラムを作りたいのです。しかし上手く行かなくて困っています。 こんな感じの

  • 解決済

    JSONのデータをグーグルマップに表示

    お世話になります。 現在、JSONのデータをグーグルマップに表示する機能を実装しようとしているのですが、JSONのデータをループで取れなくて困っています。 よろしければご教授く

  • 解決済

    Javaで住所から緯度経度を取得するために、ライブラリを入れたい」

    お世話になります。 Javaを使って、住所から緯度経度を取得したいです。 調べてみるとGoogleが公式でライブラリを公開しているらしいのでこれを利用しようと思っていますが、ライ

  • 解決済

    【Google maps api】座標A地点から〇〇km離れた位置にB地点を設定する

    GoogleMapsapiにて座標A地点から〇〇km離れた位置にB地点を設定する 初投稿です。 GoogleMap上の任意の場所をA地点として登録ができ、 登録したA地点から

  • 解決済

    Googleスプレッドシート

    お尋ねします。googleでマップガジェッドの追加の仕方を教えてください  Googleスプレッドシートに住所を10個を格納してgoogleマップにポインター10個出したいで

  • 解決済

    Google Mapで複数マーカー

    Google Mapで複数マーカーを立てようとしています。 PHPで $address[] = $value['address']; $address = json_e

  • 解決済

    googlemapが描画されません

    こちらの質問に関連したことなのですが、質問の内容が変わってしまったので改めてご教授願います。 下記のような表示をcategory-スラッグ.phpにしたいと思っております。

  • 解決済

    Google Map Api 地図表示を複数回行う

    Google map api v3にて1ページに地図を複数回表示する処理をjavascriptで実装したいのですが、うまく行きません。。 var geocoder; var

同じタグがついた質問を見る

  • JavaScript

    15874questions

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

  • JSP

    902questions

    JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

  • Google マップ

    353questions

    Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

  • サーブレット

    117questions

    サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。