0

我发现 StreetViewService 正在为没有图像的 latLng 对报告状态“正常”。示例代码:

let sv = new google.maps.StreetViewService();
let tokyo = {lat: 35.6895,lng: 139.6917};
sv.getPanorama({location: tokyo, radius: 250}, svCheck);
function svCheck(data, status) {
  if (status === 'OK') {
    console.log("OK for "+data.location.latLng+" at ID "+data.location.pano);
  }
  else {
    console.log("STATUS NOT OK");
  }
}

此代码将返回“OK”状态,但随后请求拉取该图像会给我一条“抱歉,我们这里没有图像”消息。例如,使用此 URL——基于上面的 pano ID——代码错误地返回 OK 状态(您必须通过自己的 API 密钥添加才能访问此链接):

https://maps.googleapis.com/maps/api/streetview?size=640x540&pano=CAoSLEFGMVFpcFB3ZWxWT21OX196WVc2ajlGeE9qbGptTHFHc2RNRjBwRlYyamhw&key= [您的API 密钥]

我的理解是 StreetViewService 的 getPanorama() 只有在对静态 API 的后续请求实际上会返回图像时才应返回状态 OK。这里发生了什么?

4

1 回答 1

2

这听起来像是街景图像 API 中的一个错误。CAoSLEFGMVFpcFB3ZWxWT21OX196WVc2ajlGeE9qbGptTHFHc2RNRjBwRlYyamhw如果我使用街景图像元数据 API 从您的示例中检查全景 ID :

https://maps.googleapis.com/maps/api/streetview/metadata?pano=CAoSLEFGMVFpcFB3ZWxWT21OX196WVc2ajlGeE9qbGptTHFHc2RNRjBwRlYyamhw&key=MY_API_KEY

我得到以下回复

{
  "copyright":"© Miller Yu",
  "date":"2018-11",
  "location":{
    "lat":35.6894875,
    "lng":139.6917064
  },
 "pano_id":"CAoSLEFGMVFpcFB3ZWxWT21OX196WVc2ajlGeE9qbGptTHFHc2RNRjBwRlYyamhw",
 "status":"OK"
}

这意味着 pano id 是有效的,它存在于 Google 数据库中,但不能通过 Street View Image API 获得。

我们可以看到这张全景图是由外部用户上传的,所以它不是典型的谷歌街景图像。我知道 Google 过去曾遇到过业务生成全景图的问题。作为参考,您可以查看 Google 问题跟踪器中的以下错误:

https://issuetracker.google.com/issues/35829459

https://issuetracker.google.com/issues/77676413

两者都被标记为固定,但在你的情况下它看起来不是真的。在这一点上,我建议再次通过他们的问题跟踪器向 Google 报告问题。

作为一种解决方法,请考虑仅请求 Google 的户外图像。source您可以在街景全景请求中指定属性,如我的示例所示

function initialize() {
  let svService = new google.maps.StreetViewService();
  let tokyo = {lat: 35.6895,lng: 139.6917};

  var panoRequest = {
    location: tokyo,
    preference: google.maps.StreetViewPreference.NEAREST,
    radius: 250,
    source: google.maps.StreetViewSource.OUTDOOR
  };

  svService.getPanorama(panoRequest, svCheck);
  function svCheck(data, status) {
    if (status === google.maps.StreetViewStatus.OK) {
      console.log("OK for "+data.location.latLng+" at ID "+data.location.pano);
      var panorama = new google.maps.StreetViewPanorama(
          document.getElementById('street-view'),
          {
            pano: data.location.pano,
      });
    } 
    else {
      console.log("STATUS NOT OK");
    }
  }
}
html, body {
  height: 100%;
  margin: 0;
  padding: 0;
}
#street-view {
  height: 100%;
}
<div id="street-view"></div>
<script async defer
         src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDztlrk_3CnzGHo7CFvLFqE_2bUKEq1JEU&callback=initialize">
    </script>

通过修改请求,您将获得一个全景 ID rHMU4M8-OvVuL5ALS0OlNg。如果您使用元数据 API 检查它

https://maps.googleapis.com/maps/api/streetview/metadata?pano=rHMU4M8-OvVuL5ALS0OlNg&key=YOUR_API_KEY

您将收到以下回复

{
  "copyright":"© Google",
  "date":"2016-07",
  "location":{
    "lat":35.68943918433396,
    "lng":139.6914496241509
 },
 "pano_id":"rHMU4M8-OvVuL5ALS0OlNg",
 "status":"OK"
}

此全景图属于 Google,可与 Street View Image API 一起正常工作

https://maps.googleapis.com/maps/api/streetview?pano=rHMU4M8-OvVuL5ALS0OlNg&size=600x400&key=YOUR_API_KEY

在此处输入图像描述

于 2020-08-19T12:09:05.687 回答