web-dev-qa-db-ja.com

google.maps.geocoderを使用して場所の緯度/経度を取得する

私は自分のアプリケーションで会場の場所を保存するためにいくつかのajaxを使用しようとしていて、スタックオーバーフローで次のコードに遭遇しました

function getLatLong(address) 
{
    var geocoder = new google.maps.Geocoder();
    var result = "";
    geocoder.geocode( { 'address': address, 'region': 'uk' }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            result[lat] = results[0].geometry.location.Pa;
            result[lng] = results[0].geometry.location.Qa;
        } else {
            result = "Unable to find address: " + status;
        }
    });
    return result;
}

私の問題は、関数を呼び出すときに何も返さないことと、デバッグしてブレークポイントをchrome)に設定すると、結果[lat] = results [0]で中断する前に、最初にreturn結果で中断することです。 geometry.location.Pa;

配列は配列型として宣言する必要があることはわかっていますが、results [0] .geometry.locationオブジェクトを返すだけでも、何も返されませんでした

場所の緯度/経度を返すにはどうすればよいですか?データベースに保存できますか?

18
Chris Mccabe

直面している問題は、結果を返す前にgeocoder.geocode関数をすぐに完了するものとして扱っていることです。実際に起こっていることは、geocoder.geocodeがトリガーされ、その後すぐに結果が返されることです。非同期の結果が返されない可能性が高いため、結果は空です。ジオコーディングの結果は、プルではなくプッシュと考えてください。表示されていないstoreResult関数は、情報を保存するために必要なコードです。結果をエラー文字列と組み合わせるため、それをstoreResult関数で処理する必要があります。別の方法として、成功または失敗を示すステータスを結果に含めることができます。

function getLatLong(address) {
var geocoder = new google.maps.Geocoder();
var result = "";
geocoder.geocode( { 'address': address, 'region': 'uk' }, function(results, status) {
     if (status == google.maps.GeocoderStatus.OK) {
         result[lat] = results[0].geometry.location.Pa;
         result[lng] = results[0].geometry.location.Qa;
     } else {
         result = "Unable to find address: " + status;
     }
     storeResult(result);
    });
}
16
Tony Miller

これは答えではありませんが、PaとQaは常にlng()関数とlat()関数を使用しないでください。

 place.geometry.location
{...}
    Pa: 56.240477
    Qa: -0.902655999999979
    toString: function(){return"("+this.lat()+", "+this.lng()+")"}
    equals: function(a){return!a?k:Cd(this.lat(),a.lat())&&Cd(this.lng(),a.lng())}
    lat: function(){return this[a]}
    lng: function(){return this[a]}
    toUrlValue: function(a){a=Hd(a)?a:6;return $d(this.lat(),a)+","+$d(this.lng(),a)}
20
Lee Smith

私はこれに懸命に奮闘し、以下が機能することを発見しました。

  1. オブジェクトをループして、新しい配列にプッシュします。

    var newArray = [];
    
    for (var key in latLng) {
    
       newArray.Push(key);
    
    }
    
  2. 角かっこ構文で変数値を使用してオブジェクトを呼び出し、ドット表記を改行します。

    var lat = latLng[newArray[0]];
    
    var lng = latLng[newArray[1]];
    
2
vars
function getLatLong(address) 
{
    var geocoder = new google.maps.Geocoder();
    var result = '';
    geocoder.geocode( { 'address': address }, function(results, status{
        if (status == google.maps.GeocoderStatus.OK) {
            // Call the lat/lng functions to return a computed value.
            result[lat] = results[0].geometry.location.lat();
            result[lng] = results[0].geometry.location.lng();
        } else {
            result = 'Unable to find address: ' + status;
        }
    });
    return result;
}

getLatLong('address'); 

私の場合、プレイスオブジェクトから緯度と経度を取得する最も簡単な方法は次のとおりです。

  var latitude=place.geometry.location['k'];
  var longitude=place.geometry.location['A'];
0
Mr Br