【发布时间】: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