【问题标题】:How to delay google geocoding? [duplicate]如何延迟谷歌地理编码? [复制]
【发布时间】:2017-02-12 18:56:00
【问题描述】:

我正在尝试通过循环遍历邮政编码从 json 文件中对大约 100 个邮政编码进行地理编码,但是在 11 个邮政编码之后我受到 OVERY_QUERY_LIMIT 错误的限制。看来我每秒使用地理编码器的速度太快了。我曾尝试将 setTimeout 合并到其中,但无法使其正常工作。我怎样才能减慢这个过程?

代码

<head>
    <meta charset="UTF-8">
    <title>heatmap test</title>

    <style>
        html {
            height: 100%
        }

        body {
            height: 100%;
            margin: 0;
            padding: 0;
            font-family: sans-serif;
        }

        #map-canvas {
            height: 100%
        }
    </style>
</head>

<body>
    <div id="map-canvas"></div>

    <script src="https://maps.googleapis.com/maps/api/js"></script>
    <script src="assets/gmaps.js"></script>
    <script>
        document.addEventListener("DOMContentLoaded", function (event) {

                var getPostcodes = function () {

                    //json link
                    var json = "http://localhost/addresses.json/";

                    var request = new XMLHttpRequest();
                    request.open('GET', json, true);

                    request.onload = function () {
                        if (request.status >= 200 && request.status < 400) {
                            // Success!
                            var data = JSON.parse(request.responseText);

                            //GET POSTCODES IN ARRAY
                            var postcodesArray = [];
                            for (var i = 0; i < data.length; i++) {
                                postcodesArray.push(data[i].from_postcode);
                            }

                            //filter all falsey values from array
                            var postcodes = postcodesArray.filter(Boolean);

                            //creating object for inserting data
                            var testData = {
                                data: []
                            };

                            //GET LAT/LONG POSITIONS
                            //for loop to create geocode object for each postcode
                            for (var n = 0; n < postcodes.length; n++) {

                                setTimeout(function(){

                                GMaps.geocode({
                                    address: postcodes[n],
                                    callback: function (results, status) {
                                        if (status == google.maps.GeocoderStatus.OK) {
                                            var location = results[0].geometry.location;

                                            var latitude = parseFloat(location.lat().toFixed(8)),
                                                longitude = parseFloat(location.lng().toFixed(8));

//                                            pushing lat and long data to object
                                            testData.data.push({
                                                lat: latitude,
                                                lng: longitude
                                            });
                                        } else if (status === google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
                                            console.log("error");
                                        }

                                    }

                                });

                                }, 500);
                            }

                            console.log(testData);
                        }
                        else {
                            console.log("failed");
                        }
                    };
                    request.onerror = function () {
                        // There was a connection error of some sort
                    };
                    request.send();
                }

                getPostcodes();

            });
    </script>
</body>

【问题讨论】:

  • 限制是每秒 50 个请求,但是您的问题是,如果这是针对 Web 的,多个用户可以从他们的浏览器同时运行该代码,即使您确实限制了它的速率在客户端,没有办法限制不同用户的速率,因此为什么大多数人会在服务器端使用队列来代替。
  • 嗯...地理编码一次并存储数据??每次页面加载时都这样做是没有意义的
  • 我这样做是为了在热图中使用 lat/lng,是否建议在服务器端进行?您还会将数据存储在哪里?
  • 更新该数组非常简单,然后将其输出为 json,如果这是您唯一的存储,则将其放回文件中。或者在您的服务器或第三方服务上使用数据库
  • 您认为这是否可行,将我的 testdata 对象转换为 json 并存储在外部文件中,进行字符匹配,以便下次打开它时跳过现有的邮政编码并继续构建文件?

标签: javascript google-maps settimeout geocoding


【解决方案1】:

SetTimeout 只是延迟代码,而您已经给超时设置了延迟。

您的所有函数都会等待500ms,然后立即运行。

你可以做的是像这样有一个动态延迟:

...

for (var n = postcodes.length; n--;) {
    setTimeout(function(){
        GMaps.geocode({
            ...
        })
    }, 500 * n);
}

....

或使用 setInterval,但上面的代码效果最好。 setInterval 就没那么有意义了。

【讨论】:

  • 实际上,由于地理编码是异步的,递归函数最有意义。
  • 他的问题只是一秒钟内发起了太多的请求,异步在其中没有任何作用。
  • 他没有说他只想在收到回复后才发送请求
  • 嘿,我试过了,我的 testdata 对象返回空,但是错误越少,时间越长。我正在尝试将 lat/lng 用于热图,因此正在处理的数据不会花费太长时间
  • 限制时间将500 * n更改为20 * n。根据 adeneo `限制是每秒 50 个请求`
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多