2009-08-21 139 views
11

我想知道是否可以使用googlemaps api同步地理解某些內容,而不是等待回調函數被調用,它將等待返回值。有沒有人找到一種方法來做這樣的事情。Google Maps API Geocode Synchronous

P.S:我使用的API

回答

1

地理編碼器調用與價值回調函數的版本3。這是做到這一點的唯一方法。如果它是同步的,那麼腳本會在等待Geocode處理時凍結。真的沒有理由這樣做。

你究竟想完成什麼?

+1

我有一個包含地址的表單。作爲驗證表單數據的一部分,我正在考慮使用Google地理編碼器來檢查地址。我還需要將緯度,經度值輸入到我的數據庫中。我知道我可以使用回調函數來做到這一點,但是這看起來像是一種黑客,而且會更復雜。 – giroy 2009-08-21 14:24:24

+1

Geocoder完全打算與回調函數一起使用。別擔心,這不是黑客行爲。 :)這真的是你唯一的選擇。但是請記住,如果您使用地理編碼器而不以某種方式在Google地圖上顯示結果,那麼您將違反Google地圖服務條款。 – 2009-08-21 14:53:58

+0

據我所知,你不能在內部系統或選擇的受衆中使用google api。您使用地圖的頁面應該對整個互聯網開放 - 閱讀合同條款。好@B克里斯@克里斯B – 2010-06-28 15:13:07

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'並存儲響應。最後表單由客戶端腳本提交,包括兩個新字段。在服務器端,您可以將它們存儲在數據庫中。

!!請注意,這是可能的,但可能違反谷歌條款,如上所述。

+1

偉大的答案!我會補充說,只要用戶提供了所需的信息(或在此之後有一段時間),就可以進行地理位置請求。因此,當他完成表格的其餘部分時,Geocoder有時間發送回覆。如果用戶不斷改變主意,那麼您會做出更多類似於此的地理位置請求。 – GoTo 2013-06-12 21:43:30

+0

至於谷歌的條款,我不認爲你打破他們,如果你只是將答案存儲在數據庫中。幾乎任何一種超越簡單示例的web應用程序都需要您將答案存儲在數據庫中。如果您在沒有Google地圖的情況下使用答案,或者在封閉/內部系統中使用答案,則可以將其分解。 – GoTo 2013-06-12 21:48:02

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