Google 如果找到街道数据,街景 JS APIv3 重试请求 ZERO_RESULTS
Google Street View JS APIv3 retry request if street data found ZERO_RESULTS
当我为最大半径 50 米内的标记获取全景图时,有时它找不到全景图,但如果我设置大约 60 米以上的半径,那么它就会起作用。
所以我想自动再次请求半径为 +10 米的街道数据,如果在总共 100 米内没有发现任何东西,则完全停止。
我知道如何在过程 JS 中使用 for 或 while 循环它,但我不知道 OOP JS,所以我不确定where/how 是否根据函数响应再次触发请求。
基本上代码看起来像
marker1.addListener('click', function(event) {
popup1.open(map, marker1);
sv.getPanorama({location: event.latLng, radius: 50}, processSVData);
});
...
function processSVData(data, status) {
if (status === google.maps.StreetViewStatus.OK) {
panorama.setPano(data.location.pano);
panorama.setPov({
heading: 270,
pitch: 0
});
panorama.setVisible(true);
} else if (status === google.maps.StreetViewStatus.ZERO_RESULTS) {
alert(status + " need to retry with radius +10 merters but how?");
} else {
alert(status + " cant do nothing about it bye");
}
}
这是完整示例标记 B 具有 50 米处的街景数据,而标记 A 没有。
JSFiddle
假设程序中其他地方没有全景查询调用过快(超过查询限制)的冲突,那么一个可能的解决方案是使用带有 timeout
的函数来处理查询.
function getPanorama(args){
setTimeout(function(){
sv.getPanorama(args, function(data, status){processSVData(data, status, args);
//need to pass args to callback to properly increment
}, query_limit_delay);
}
并在 processSVData
中:
function processSVData(data, status, args){
//code
} else if (status === google.maps.StreetViewStatus.ZERO_RESULTS) {
if(args.radius < 100){
args.radius += 10; //increase radius by 10 meters
getPanorama(args);
}
}
//code
}
基本上,这 1) 调用了 getPanorama
函数。一旦延迟(不超过查询限制)过去,它将返回的数据发送到回调。如果有ZERO_RESULTS
,则将上次查询的半径增加10,重复上述过程。但是,如果出现数据,则处理数据并退出循环。
一个人通过调用类似的东西来发起查询:
marker1.addListener('click', function(event) {
popup1.open(map, marker1);
getPanorama({location: event.latLng, radius: 50});
});
祝你申请成功!
如果这个 API 有查询限制,我还没有达到。我实现了一个递归函数。尝试类似的东西:
marker1.addListener('click', function(event) {
popup1.open(map, marker1);
processSVData(event.latLng, 50); // first try 50 meters
});
function processSVData(loc,rad) {
sv.getPanorama({location:loc, radius:rad}, function(data,status){
if (status===google.maps.StreetViewStatus.ZERO_RESULTS) {
processSVData(loc,rad+10); // increment by 10 meters
} else if (status===google.maps.StreetViewStatus.OK) {
// Success!
panorama.setPano(data.location.pano);
panorama.setPov({
heading: 270,
pitch: 0
});
panorama.setVisible(true);
} else {
// Failure
alert(status + " cant do nothing about it bye");
}
});
}
当我为最大半径 50 米内的标记获取全景图时,有时它找不到全景图,但如果我设置大约 60 米以上的半径,那么它就会起作用。
所以我想自动再次请求半径为 +10 米的街道数据,如果在总共 100 米内没有发现任何东西,则完全停止。
我知道如何在过程 JS 中使用 for 或 while 循环它,但我不知道 OOP JS,所以我不确定where/how 是否根据函数响应再次触发请求。
基本上代码看起来像
marker1.addListener('click', function(event) {
popup1.open(map, marker1);
sv.getPanorama({location: event.latLng, radius: 50}, processSVData);
});
...
function processSVData(data, status) {
if (status === google.maps.StreetViewStatus.OK) {
panorama.setPano(data.location.pano);
panorama.setPov({
heading: 270,
pitch: 0
});
panorama.setVisible(true);
} else if (status === google.maps.StreetViewStatus.ZERO_RESULTS) {
alert(status + " need to retry with radius +10 merters but how?");
} else {
alert(status + " cant do nothing about it bye");
}
}
这是完整示例标记 B 具有 50 米处的街景数据,而标记 A 没有。 JSFiddle
假设程序中其他地方没有全景查询调用过快(超过查询限制)的冲突,那么一个可能的解决方案是使用带有 timeout
的函数来处理查询.
function getPanorama(args){
setTimeout(function(){
sv.getPanorama(args, function(data, status){processSVData(data, status, args);
//need to pass args to callback to properly increment
}, query_limit_delay);
}
并在 processSVData
中:
function processSVData(data, status, args){
//code
} else if (status === google.maps.StreetViewStatus.ZERO_RESULTS) {
if(args.radius < 100){
args.radius += 10; //increase radius by 10 meters
getPanorama(args);
}
}
//code
}
基本上,这 1) 调用了 getPanorama
函数。一旦延迟(不超过查询限制)过去,它将返回的数据发送到回调。如果有ZERO_RESULTS
,则将上次查询的半径增加10,重复上述过程。但是,如果出现数据,则处理数据并退出循环。
一个人通过调用类似的东西来发起查询:
marker1.addListener('click', function(event) {
popup1.open(map, marker1);
getPanorama({location: event.latLng, radius: 50});
});
祝你申请成功!
如果这个 API 有查询限制,我还没有达到。我实现了一个递归函数。尝试类似的东西:
marker1.addListener('click', function(event) {
popup1.open(map, marker1);
processSVData(event.latLng, 50); // first try 50 meters
});
function processSVData(loc,rad) {
sv.getPanorama({location:loc, radius:rad}, function(data,status){
if (status===google.maps.StreetViewStatus.ZERO_RESULTS) {
processSVData(loc,rad+10); // increment by 10 meters
} else if (status===google.maps.StreetViewStatus.OK) {
// Success!
panorama.setPano(data.location.pano);
panorama.setPov({
heading: 270,
pitch: 0
});
panorama.setVisible(true);
} else {
// Failure
alert(status + " cant do nothing about it bye");
}
});
}