0

最近問題が発生しました。皆さんが助けてくれるかもしれません。

まず、Web サイトとマーカーを作成し、中心点を取得して住所を逆ジオコーディングしようとしています。

私のコードは以下です:

function ReverseGeocode(lat, lng)
{
    var latlng = new google.maps.LatLng(lat, lng);
    var geocoder = new google.maps.Geocoder();
    geocoder.geocode({"latLng": latlng}, function(results, status)
    {
        if (status != google.maps.GeocoderStatus.OK)
        {
            alert("Geocoding has failed due to "+ status);
        }
        address = results[0].formatted_address;
    });
}

私がここで抱えている問題は、「アドレス」を戻そうとすると (現在、アドレスはグローバル変数です)、「未定義」しか得られないことです。

これを返そうとするコードは次のとおりです。 sendString += '&lat=' + lat; sendString += '&lng=' + lon; ReverseGeocode(center.lat(), center.lng()); アラート(""+アドレス);

sendString += '&address=' + address 
var currentLang = "en"
sendString += '&phone=' + document.getElementById("number").value;
sendString += '&email=' + document.getElementById("email").value;
sendString += ($("prefsms").checked)?'&contactMethod=sms':'&contactMethod=email';
sendString += '&serviceType=' + document.getElementById("serviceType").value;
sendString += '&language=' + currentLang;
alert(""+sendString);

アラート ボックスに表示されるのは「未定義」だけです。それでも、ReverseGeocode 関数に別のアラート ボックスを追加すると、アラート ボックスに住所が表示されますが、これは外部関数のアラート ボックスの後に発生します。

何が起こっているかについてのアイデアはありますか?私は、ReverseGeocode 関数内のアラート ボックスが最初に表示されると考えていましたが、その逆ではありませんでした。

ありがとう!

4

2 に答える 2

1

Heitor Chang が言ったように、ジオコーディングは非同期です。そのため、住所を返そうとすると、コールバックとして渡した関数に返されますgeocoder.geocode()。混乱している?これを参照してください:

function ReverseGeocode(lat, lng)
{
    var latlng = new google.maps.LatLng(lat, lng);
    var geocoder = new google.maps.Geocoder();
    geocoder.geocode({"latLng": latlng}, function(results, status)
    {
        if (status != google.maps.GeocoderStatus.OK)
        {
            alert("Geocoding has failed due to "+ status);
        }
        return results[0].formatted_address; // this is how you might've been returning (i am just assuming since you didn't provide any code that returns address.
    });
}

これで、渡した関数に返されることがわかりますgeocoder.geocode()

あなたがすべきことは、コールバックを使用することです - おそらく気付かずにここでコールバックを渡しています - ReverseGeocode 関数の 3 番目の引数としてコールバックを受け入れ、結果が OK になったら、コールバックを呼び出してアドレスを返します。方法は次のとおりです。

function ReverseGeocode(lat, lng, cb)  // cb - callback, a function that takes the address as an argument.
{
    var latlng = new google.maps.LatLng(lat, lng);
    var geocoder = new google.maps.Geocoder();
    geocoder.geocode({"latLng": latlng}, function(results, status)
    {
        if (status != google.maps.GeocoderStatus.OK)
        {
            alert("Geocoding has failed due to "+ status);
        }
        cb(results[0].formatted_address); // call the callback passing to it the address and we're done.
    });
}

それの使い方?こちらです:

ReverseGeocode( LAT, LNG, function(address) {
    // do something with the address here. This will be called as soon as google returns the address.
});
于 2012-05-10T16:50:44.253 に答える
0

(逆) ジオコーディングは非同期です。つまり、リクエストが Google サーバーに送られ、スクリプトが実行され続け、result is OKGoogle が応答を返したときにブロック内のコードが実行されます。全体的な実行は、コマンドが記述された順序で実行されるとは限りません。

コードの値を使用するにはaddress、返されたステータスが OK であるコード ブロックにコードを含める必要があります。

于 2012-05-10T16:37:34.693 に答える