Javascript 多个方向的请求在多次呼叫后需要更多的时间
假设您有一个地图可以在上面显示Kmlayer对象,每个Kmlayer对象都有一个切换复选框,位于面板中Javascript 多个方向的请求在多次呼叫后需要更多的时间,javascript,google-maps,google-maps-api-3,Javascript,Google Maps,Google Maps Api 3,假设您有一个地图可以在上面显示Kmlayer对象,每个Kmlayer对象都有一个切换复选框,位于面板中 var Province = new google.maps.LatLng(47.112754, -70.815223); var map = new google.maps.Map( document.getElementById('map'), {zoom:7,center:Province} ); 并且在KML文件中存储有限数量的路线,以优化地图的速度 Direction的请求是使用
var Province = new google.maps.LatLng(47.112754, -70.815223);
var map = new google.maps.Map( document.getElementById('map'), {zoom:7,center:Province} );
并且在KML文件中存储有限数量的路线,以优化地图的速度
Direction的请求是使用Google Maps API v3提出的
假设你有一个隐藏div中包含谷歌地图的页面,你通过这个API发出方向请求。
阵列“航路点”保存所需每条多段线的每个起点和终点的坐标
var geo_coords = ''; // holds the results
var y; // counter
var delay_per_request = 1000; // default delay in milliseconds between requests
var current_delay = delay_per_request; // current delay between requests
function calcRoute(start,end) {
setTimeout(function(){
var directionsService = new google.maps.DirectionsService();
var request = {
origin: start,
destination: end,
travelMode: google.maps.TravelMode.DRIVING
};
directionsService.route(request, function(response, status) {
// Error?
if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
document.getElementById('error_text').innerHTML += "<br>" + start + "/" + end
+ "("+status+") :: Interval:"+current_delay+"ms";
window.scrollTo(0, document.body.scrollHeight);
if (current_delay < 2600) {
current_delay += 200;
}
if (current_delay >= 1600) {
delay_per_request = 1600;
}
retry++;
if (retry < 20) {
calcRoute(start,end);
} else {
document.getElementById('error_text').innerHTML += "<br>The script stopped running after "+retry+" retries"
+ " sur " + start + "/" + end + "("+status+") :: Interval:"+current_delay+"ms";
}
// Positive result?
} else if (status == google.maps.DirectionsStatus.OK) {
var myRoute = response.routes[0].overview_path;
for (i in myRoute) {
if (myRoute[i] != undefined) {
geo_coords += myRoute[i].lat() + "," + myRoute[i].lng() + "_";
}
}
geo_coords += "!";
document.getElementById('error_text').innerHTML += "<br><font color=\"green\">" + start + "/" + end
+ "("+status+") :: Interval:"+current_delay+"ms</font>";
window.scrollTo(0, document.body.scrollHeight);
current_delay = delay_per_request;
retry = 0;
Next();
}
});
},current_delay);
}
function Next() {
if (y <= waypoints.length) {
destination = "from:" + waypoints[y] + " to:" + waypoints[y + 1];
geo_desc += description[y] + " => " + description[y+1] + "|";
calcRoute(waypoints[y],waypoints[y+1]);
y = y +2;
} else {
document.getElementById("information").setAttribute('value',geo_coords);
document.getElementById("show_debug_text").setAttribute('value',geo_desc);
document.getElementById("error").setAttribute('value',document.getElementById('error_text').innerHTML);
document.forms["kml"].submit();
}
}
Next();
var geo_coords=''保存结果
变量y;//柜台
每个请求的var延迟=1000;//请求之间的默认延迟(毫秒)
var current_delay=每个请求的延迟;//请求之间的当前延迟
函数计算(开始、结束){
setTimeout(函数(){
var directionsService=new google.maps.directionsService();
var请求={
来源:start,
目的地:完,
travelMode:google.maps.travelMode.DRIVING
};
路由(请求、功能(响应、状态){
//错误?
if(status==google.maps.GeocoderStatus.OVER\u QUERY\u LIMIT){
document.getElementById('error_text')。innerHTML+=“
”+start+“/”+end
+(“+状态+”):间隔:“+当前延迟+”毫秒”;
scrollTo(0,document.body.scrollHeight);
如果(当前_延迟<2600){
电流_延迟+=200;
}
如果(当前延迟>=1600){
每个请求的延迟=1600;
}
重试++;
如果(重试<20次){
calcRoute(开始、结束);
}否则{
document.getElementById('error_text')。innerHTML+=“
脚本在“+重试+”重试后停止运行”
+“sur”+开始+“/”+结束+”(“+状态+”)::间隔:“+当前延迟+”毫秒”;
}
//积极的结果?
}else if(status==google.maps.directionstatus.OK){
var myRoute=response.routes[0]。概述\u路径;
对于(我在我的路线中){
if(myRoute[i]!=未定义){
地理坐标+=myRoute[i].lat()+,“+myRoute[i].lng()+”;
}
}
地理坐标+=“!”;
document.getElementById('error_text')。innerHTML+=“
”+start+“/”+end
+(“+状态+”):间隔:“+当前延迟+”毫秒”;
scrollTo(0,document.body.scrollHeight);
当前延迟=每个请求的延迟;
重试=0;
Next();
}
});
}电流延迟);
}
函数Next(){
如果(是的,我认为你最好在GIS溢出网站上问这个问题。不管怎样,我不久前读到,谷歌会根据请求数量限制向地图服务器发出的请求数量,我认为如果请求数量达到某一点,你必须付费,但通常是上万次。谢谢你的快速回复nse。我会尝试一下,但我也会把问题保留在这里。地理编码器受到配额和速率限制的约束,以防止滥用。实际速率限制可能会随着服务器负载的变化而变化。Direction API webservice的速率限制是否与此相同?我的意思是,服务器是否在每次请求后越来越降低优先级?配额和速率限制两种服务的费率限制都是一样的。我不知道你所说的“服务器是否在每次请求后越来越降低优先级?”是什么意思。我不认为“优先级”与此有关。如果你做一些研究,一般的印象是(像地理编码器)您可以快速执行一些请求,然后在此之后服务将被限制在“配额/24小时”的速率之下,但是实现的详细信息不会发布,可能会定期更改,并且可能取决于服务器负载。