【问题标题】:Google Maps API Geocode SynchronouslyGoogle Maps API 同步地理编码
【发布时间】:2010-11-21 13:29:48
【问题描述】:

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

P.S.:我使用的是第 3 版的 api

【问题讨论】:

    标签: google-maps geolocation geocoding


    【解决方案1】:

    是的,您尝试实现的目标是可能的,尽管不需要同步请求。

    看看这段代码

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

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

    【讨论】:

    • 很好的答案!我要补充一点,您可以在用户提供所需信息后立即进行地理请求(或在那之后有一段时间)。因此,当他完成表格的其余部分时,地理编码器有时间发送回复。如果用户不断改变主意,您将提出更多这样的地理请求。
    • 至于谷歌术语,我认为如果您只是将答案存储在数据库中,您不会破坏它们。除了简单示例之外,几乎任何类型的 webapp 都需要您将答案存储在数据库中。如果你在没有谷歌地图的情况下使用答案,或者在封闭/内部系统中使用答案,就会破坏它们。
    【解决方案2】:

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

    你到底想完成什么?

    【讨论】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-04-05
      • 1970-01-01
      • 2013-12-18
      • 1970-01-01
      • 2017-04-23
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 2018-07-02
      相关资源
      最近更新 更多