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");
        }
    });
}