2009-08-21 14 views
11

googlemaps apiを使用して何かをジオコードできるかどうかは、コールバック関数が呼び出されるのを待つのではなく、返される値を待つことになります。誰かがこれのようなことをする方法を見つけましたか?Google Maps API Geocode Synchronously

P.S:私は、API

答えて

1

ジオコーダが値を使用してコールバック関数を呼び出すのバージョン3を使用しています。これが唯一の方法です。同期していた場合、ジオコードが処理されるのを待っている間にスクリプトがフリーズします。そういう理由は本当にありません。

あなたは正確に何を達成しようとしていますか?

+1

私は住所を含むフォームを持っています。フォームデータの検証の一環として、googlesジオコーダーを使用して住所を確認することを考えていました。私はまた、私のデータベースに入力する緯度、経度の値が必要です。私はコールバック関数を使用してこれを行うことができますが、それはハックのように思え、より複雑になります。 – giroy

+1

ジオコーダは、コールバック関数とともに使用されることを意図しています。心配しないでください。ハックではありません。 :)それは本当にあなたの唯一のオプションです。ただし、GeocoderをGoogleマップ上に何らかの形で表示せずに使用している場合は、Google Maps利用規約を破ってしまうことに注意してください。 –

+0

私が知る限り、内部システムまたは選択したユーザー層でGoogle APIを使用することはできません。マップを使用するページはインターネット全体に開放されている必要があります。契約条件をお読みください。良い@Bクリス@クリスB –

7

はい、達成しようとしていることは可能ですが、同期要求は必要ありません。したがって、このコード

function StoreGeo() 
{ 
     var address = $('input[name=zipcode]').val() + ', ' + $('input[name=city]').val(); 
geocoder.geocode({ 'address': address}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
     var ll = results[0].geometry.location.toString(); 

      llarr = ll.replace(/[\(\) ]/g, '').split(','); 

       for(i = 0; i < llarr.length;i++) 
       { 
        $('#form').append($('<input type="hidden" name="'+(i == 0 ? 'lat' : 'long')+'">').val(llarr[i])); 
       } 

       $('#form').submit(); 
     } 
     else 
     { 
     alert(status); 
     } 
    }); 

    $('#form').unbind('submit'); 
    return false; 
} 

$(document).ready(function() { 

    //init maps 
    geocoder = new google.maps.Geocoder(); 

    $('#form').bind('submit',function() { 
     StoreGeo(); 
    }); 

}); 

見て、あなたのフォームからのアドレス情報に基づいて地理要求を行うに提出されたフォームにハンドラを提出する添付。しかし同時に、ハンドラでfalseを返すことによって提出を延期します。 レスポンスハンドラは2つの非表示のテキストフィールド 'lat'と 'long'を作成し、レスポンスを保存します。最後にフォームは2つの新しいフィールドを含むクライアントスクリプトによって提出されます。サーバー側では、それらをDBに格納することができます。

!!これは可能ですが、おそらく上記のようにGoogleの用語に反していることに注意してください。

+1

すばらしい答え!私は、ユーザーが必要な情報を提供したらすぐに(またはその後にタイムアウトして)ジオリクエストを行うことができると付け加えます。したがって、フォームの残りの部分を完了している間、ジオコーダーは応答を送信する時間を持っています。ユーザーが心を変え続ければ、このような地理的な要求をさらに増やすことになります。 – GoTo

+0

Googleの用語としては、データベースに回答を保存するだけではそれを壊すとは思わない。ほとんどすべての種類のWebアプリケーションは、単純な例を超えて、データベースに回答を保存する必要があります。 Googleマップなしで、または閉鎖/内部システムで回答を使用すると、それらを壊します。 – GoTo

1

フォームの送信中にフラグを使用して、送信が成功するか、ジオコーディングを待つかを判断します。ジオコーディングが完了すると、フォームは再びフォームを再送信します。

var hasGeocoded = false; 

    searchFrom.on('submit', function(){ 
     //If not geocoded yet 
     if (!hasGeocoded) { 
      var geocoder = new google.maps.Geocoder(); 
      var location = locationEl.val(); 
      geocoder.geocode({'address': location}, function (results, status) { 
       hasGeocoded = true; 

       if (status == google.maps.GeocoderStatus.OK) { 
        $('#coords').val(
         results[0].geometry.location.lat() + ',' + results[0].geometry.location.lng() 
        ); 
       } 

       searchFrom.submit(); 
      }); 

      return false; //wait for geocoder to finish and re-submit the form 
     } 

     return true; 
    });