问题 Google Maps API地理编码同步


我想知道是否可以使用googlemaps api同步对某些内容进行地理编码,因此不会等待调用回调函数,而是等待返回一个值。有没有人找到办法做这样的事情。

P.S。:我正在使用api的第3版


11894
2017-08-21 05:02


起源



答案:


Geocoder使用值调用您的回调函数。这是唯一的方法。如果它是同步的,则在等待Geocode处理时,您的脚本将冻结。没有任何理由这样做。

你想要完成什么?


2
2017-08-21 05:44



我有一个包含地址的表格。作为验证表单数据的一部分,我正在考虑使用谷歌地理编码器来检查地址。我还需要将纬度,经度值输入到我的数据库中。我知道我可以使用回调函数来做到这一点,但这似乎是一个黑客,会更复杂。 - giroy
Geocoder完全用于回调函数。别担心,这不是黑客攻击。 :)这真的是你唯一的选择。但请注意,如果您使用地理编码器而不以某种方式在Google地图上显示结果,您将违反Google地图服务条款。 - Chris B
据我所知,你不能在内部系统或选定的观众中使用谷歌API。您使用地图的页面应该对整个互联网开放 - 阅读合同条款。好@B Chris @Chris B. - Paulo Henrique
停止说“没有任何理由做X”。总有一些原因。在这种情况下,用户可以在Geocoder回复之前浏览(使用提交按钮)。 - GoTo
@GoTo没有任何理由完全冻结浏览器。如果你真的需要阻止他们在等待回调时做某事,你可以手动完成。用户仍应能够滚动或访问其他功能。 - Chris B


答案:


Geocoder使用值调用您的回调函数。这是唯一的方法。如果它是同步的,则在等待Geocode处理时,您的脚本将冻结。没有任何理由这样做。

你想要完成什么?


2
2017-08-21 05:44



我有一个包含地址的表格。作为验证表单数据的一部分,我正在考虑使用谷歌地理编码器来检查地址。我还需要将纬度,经度值输入到我的数据库中。我知道我可以使用回调函数来做到这一点,但这似乎是一个黑客,会更复杂。 - giroy
Geocoder完全用于回调函数。别担心,这不是黑客攻击。 :)这真的是你唯一的选择。但请注意,如果您使用地理编码器而不以某种方式在Google地图上显示结果,您将违反Google地图服务条款。 - Chris B
据我所知,你不能在内部系统或选定的观众中使用谷歌API。您使用地图的页面应该对整个互联网开放 - 阅读合同条款。好@B Chris @Chris B. - Paulo Henrique
停止说“没有任何理由做X”。总有一些原因。在这种情况下,用户可以在Geocoder回复之前浏览(使用提交按钮)。 - GoTo
@GoTo没有任何理由完全冻结浏览器。如果你真的需要阻止他们在等待回调时做某事,你可以手动完成。用户仍应能够滚动或访问其他功能。 - Chris B


是的,虽然不需要同步请求,但您可以实现的目标是可行的。

看看这段代码

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”存储响应。最后,表单由客户端脚本提交,包括两个新字段。在服务器端,您可以将它们存储在数据库中。

!请注意,这是可能的,但可能违反谷歌条款,如上所述。


7
2017-09-12 17:11



很好的答案!我想补充一点,一旦用户提供了所需的信息(或者之后有一些时间),你就可以做地理请求。因此,当他完成表格的其余部分时,Geocoder有时间发送回复。如果用户不断改变主意,您将会发出更多这样的地理位置请求。 - GoTo
至于谷歌术语,如果您只是将答案存储在数据库中,我认为您不会破坏它们。几乎任何超出简单示例的webapp都需要您将答案存储在数据库中。如果您在没有Google地图的情况下使用答案,或在封闭/内部系统中使用答案,则会将其分解。 - GoTo


我只是在表单提交期间使用一个标志来知道提交应该通过的时间或何时应该等待地理编码。完成地理编码后,它将再次重新提交表单。

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

1
2018-06-01 07:14