通过jquery geocoder.geocode解决地理编码问题(400项)

时间:2017-05-08 06:02:07

标签: jquery json google-maps-api-3 gmaps.js

我正在尝试用400个地址解析一个json,并在每个位置设置地图图标。我的问题是,当我循环这些项目时,我收到一个错误:OVER_QUERY_LIMIT。但是使用谷歌地理编码API设置位置的最佳方法是什么? 我的功能如下:

        function getAddresses(data) {
            var items, markers_data = [];
            if (data.addresses.length > 0) {
                items = data.addresses;

                for (var i = 0; i < items.length; i++) {
                    var
                        item = items[i]
                         , street = item.address.street
                         , zip = item.address.zip
                         , city = item.address.city
                         , country = item.address.country;
                     var
                        geocoder =  new google.maps.Geocoder()
                         , fulladdress = street + ',' + zip + ' '+ city + ',' + country;

                    setTimeout(function () {
                         geocoder.geocode({'address': fulladdress}, 
                          function(results, status) {
                            if (status == google.maps.GeocoderStatus.OK) {

                               console.log(results[0].geometry.location.lat());

                               console.log(results[0].geometry.location.lng());     
                                markers_data.push({
                                     lat : results[0].geometry.location.lat(),
                                    lng : results[0].geometry.location.lng(),
                                     title: item.name,
                                     infoWindow: {
                                        content: '<h2>'+item.name+'</h2><p>'+ street + zip + city +'</p>'
                                     }
                                });
                            } else {
                                console.log('not geocoded');
                                console.log('status');
                                console.log(status);
                            }
                         });
                     }, 1000);
                }
             }

            map.addMarkers(markers_data);
        }

我试图将我的geocoder.geocode函数放在超时函数中,但遗憾的是这不会有帮助。我在我的js中使用插件gmaps.js。

1 个答案:

答案 0 :(得分:0)

如文档中所述,地理编码器服务有每会话配额:

  

无论有多少用户共享同一项目,每个用户会话都会应用速率限制。首次加载API时,将为您分配初始请求配额。使用此配额后,API会按每秒对其他请求强制执行速率限制。如果在特定时间段内发出的请求太多,则API会返回OVER_QUERY_LIMIT响应代码。

     

每会话速率限制可防止对批处理请求(例如批量地理编码)使用客户端服务。对于批量请求,请使用Google Maps Geocoding API网络服务。

https://developers.google.com/maps/documentation/javascript/geocoding#UsageLimits

因此,您应该限制客户端呼叫并在最初的10个请求后每秒执行1个请求,或者使用Geocoding API Web服务实施服务器端批量地理编码,每秒最多可以有50个请求。

顺便提一句,您可以尝试在1秒后执行所有请求。您应该为每个下一个请求增加延迟。

setTimeout(function () {
    //Your code
}, 1000 * i);

因此第一个请求将立即执行,第二个请求将在1秒后执行,第三个请求将在2秒后执行,依此类推。