2011-06-21 7 views
0

私はマップツールのための単純なジオコード関数を実行しようとしています。私はジオコードを正常に取得しますが、ジオコード関数の戻り値としてロケーションオブジェクトを戻すことを望んでいます。このような関数からGMap位置オブジェクトを返す

何か:ロケーション項目の

function codeAddress(address) { 
    geocoder.geocode({ 'address': address}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      var location = results[0].geometry.location; 
      console.dir(location); 
      return location; 
     } else { 
      return false; 
     } 
    }); 
} 

console.dirは、予想位置のオブジェクトを示すので、関数が呼び出され、正常にデータを戻します。

この関数は、別のプロセスによって呼び出され、マーカーが作成されます。

if (coordinates = codeAddress(myaddress){ 
    // do stuff 
} 

しかし、coordinates変数は、いつものように未定義評価し、その「ものを行う」ための条件が満たされることはありません。

私はおそらく座標varの定義について本当に明白な何かが不足していることは知っていますが、それが何であるかはわかりません。

ありがとうございました。

基本コード:http://jsfiddle.net/2TXZ4/3/地図は何らかの理由で描画されませんが、

+0

okこれは非同期要求であると私は思っています。私がcodeAddress関数で戻り値をハードコードすると、すべて正常に動作します。だから、それはただ要求の性質でなければなりません。しかし、この問題に最善を尽くす方法はまだ分かりません。 – julio

答えて

0

あなたはメソッドに提供されているか、この同様の質問/答えのようなあなたのcodeAddressメソッドにコールバックを提供することができますコールバックですべての処理を行う必要があるので、geocode方法がasynchonousです(How do I return a variable from Google Maps JavaScript geocoder callback?)について説明します。以下のコードでは、doStuff関数で行っていた作業をgeocode関数のコールバックに移しました。これはうまくいくはずですが、あなたが提供したjfiddleリンク(おそらくGoogle Maps APIキーのため)でテストできません。私はこれが助けて欲しい!

+0

これは正しいですし、私は何をやってしまったのですか?私はまだ "doStuff"関数でマーカーを作成しましたが、codeAddressコールバックでmarker.setPosition(location)メソッドを使用して位置を設定しました。 – julio

0

if (coordinates = codeAddress(myaddress) - これは割り当てではなく、比較です。

[OK]をが、ここでは野生のハック(それが仕事をして)です:

<script type="text/javascript"> var geocoder; var loc; var l = false; 
function initialize() { 

geocoder = new google.maps.Geocoder(); 

var mapDiv = document.getElementById('map_canvas'); 
    map = new google.maps.Map(mapDiv, { 
     center: new google.maps.LatLng(-34.397, 150.644), 
     zoom: 8, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    });  } 


function codeAddress(address) { 
geocoder.geocode({ 
    'address': address 
}, function(results, status) { 
    if (status == google.maps.GeocoderStatus.OK) { 
     loc = results[0].geometry.location;    l = true; 
     console.log(loc);   //alert (loc); 
     //return loc;  doStuff(loc) 
    } else { 
     return false; 
    } 
}); } 


function doStuff(geo_marker){ if(l==false){ 
var thisaddress = document.getElementById("address").value; 
var myResult = codeAddress(thisaddress); }else{ 

if (loc) { 
    map.setCenter(loc); 
    var marker = new google.maps.Marker({ 
     map: map, 
     position: loc 
    }); 
l = false; //important to use function more than once :)) 
} else { 
    alert("Geocode was not successful"); 
} } 

}; 

google.maps.event.addDomListener(window, 'load', initialize); 
</script> 



<body> 
<div> 
<input id="address" type="textbox" value="Sydney, NSW"> 
<input type="button" value="Geocode" onclick="window.doStuff()"> 
</div> 
<div id="map_canvas" style="height:600px; width: 500px; position: absolute; 
    top: 80px"> </div> 

</body> 

は、私はそれがジオコーディングを行うと、このコールバックを避けるために、しかし1つの関数にマップにマーカーを追加する方が理にかなっていると思いますし、機能間で

+0

@ AR--私は同じ結果(ccordは未定義)で次も試してみました: 'var coord = codeAddress(tempaddress); \t \t \t \t console.dir(coord); \t \t \t \t if(coord){// dostuff } ' – julio

+0

私は自分の答えを更新しました。この例は間違いなく機能しています。 –

関連する問題