2009-08-21 142 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; 
    });