2012-01-10 3 views
16

я пытался использовать некоторые Ajax, чтобы сохранить место проведения месте в моем приложении и наткнулся на следующий код на переполнение стекаизвлечения широты/долготы местоположения с помощью google.maps.geocoder

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; 
} 

моя проблема в том, когда я вызываю функцию, которая ничего не возвращает, и когда я отлаживаю и устанавливаю точки останова в хром, он ломается на результат возврата перед тем, как он разбивает результат [lat] = results [0] .geometry.location.Pa;

Я знаю, что массив должен быть объявлен как массив типа, но даже когда я просто возвращая результаты [0] не .geometry.location объекта ничего не было возвращается

что я могу сделать, чтобы вернуть широту/долготу из где я могу хранить в своем db?

+0

возможно дубликат [Google Places API почему он возвращает Lat и Lon под другой переменной каждый раз?] (Http://stackoverflow.com/questions/13505928/google-places-api-why-does -it-returns-lat-and-lon-under-a-different-variable-eac) – Gajus

ответ

16

Проблема, с которой вы сталкиваетесь, заключается в том, что вы обрабатываете функцию geocoder.geocode как немедленно завершающую работу перед тем, как выполнить результат возврата. Что действительно происходит, так это то, что геокодер.geocode запускается, а затем вы получаете немедленное возвращение результата. Поскольку асинхронный результат, скорее всего, не возвращен, ваш результат пуст. Подумайте о результате геокодирования в качестве толчка, а не тяги. Функция storeResult, не показана, представляет собой код, который вам нужно сделать для сохранения информации. Поскольку вы комбинируете результат с строкой ошибки, вы должны обращаться с этим в функции storeResult. В качестве альтернативы вы можете иметь статус в результате, который указывает на succcess или failure.

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); 
    }); 
} 
+0

спасибо за это, я использовал javascript для проверки адреса, чтобы начать с него, затем отправил его на сервер и использовал http-запрос, чтобы захватить информация о геокодировании. вероятно, реорганизует дальше по дороге –

+0

Как говорит Ли Смит, не используйте внутренние поля результатов. Я просто использовал их, потому что ОП сделал это. Google часто меняет имена внутренних переменных, поэтому вы не можете полагаться на них. Используйте API. –

+4

См. Ответ Ли Смита ... вместо этого используйте функции geometry.location.lat() и geometry.location.lng(). – NexusRex

20

Это не ответ, но не использовать Pa и Qa всегда использовать LNG() и широты() функции:

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)} 
+14

Чтобы добавить больше ясности в этот ответ: геокодер карты Google иногда возвращает значения lat и lng как Pa и QA, в других случаях это Sa и Ta ... единственным гарантированным способом является использование geometry.location.lat() и геометрии. location.lng() – NexusRex

2

Я упорно боролся с этим и нашел следующее к работе ,

  1. Петля через объект и нажать на новый массив:

    var newArray = []; 
    
    for (var key in latLng) { 
    
        newArray.push(key); 
    
    } 
    
  2. Позвони ваш объект с переменными значениями с синтаксиса квадратных скобок, точечные обозначения разрывов:

    var lat = latLng[newArray[0]]; 
    
    var lng = latLng[newArray[1]]; 
    
0

В моем случае простейшим решением для получения широты и долготы от объекта места был:

var latitude=place.geometry.location['k']; 
    var longitude=place.geometry.location['A']; 
Смежные вопросы