如何使用AJAX浏览多个谷歌地图全景图

How to navigate multiple Google maps panoramas using AJAX

本文关键字:谷歌地图 全景 何使用 AJAX 浏览      更新时间:2023-09-26

我一直在尝试用谷歌地图播放自定义全景图。在Google Maps API页面的教程中,他们给出了一个简单的例子来说明如何添加一个自定义全景图。

假设我有两张全景图A和b,我想展示的第一张全景图是'A'。

在两个全景图之间导航的Javascript是:

var panorama
function initialize()
{
  var panoOptions = {
    pano: 'A',
    visible: true,
    panoProvider: getCustomPanorama }
  panorama = new google.maps.StreetViewPanorama(
      document.getElementById('pano_canvas'),panoOptions);
}
function getCustomPanorama(pano,zoom,tileX,tileY)
{
   if(pano == "A") 
   { 
      return {
        location: {
          pano: 'A',
          description: "Some description for A",
          latLng: // Google maps latLng for A
        },
        links: 
        [{
          heading: ... // Directions to B
          description: "Some description to B",
          pano: "B",
        }],
        tiles: { ... }
      }
   }
   else // We show panorama B
   {
     return {
       location: {
         pano: "B"
         description: ...
         latLng: ...
       }
       links: [{
         heading: ... ,
         description: ...,
         pano: "A";
       }]
       tiles: { ... }
     }
   }
}

然而,我想使用AJAX扩展教程,因为如果我有一个更大的全景样本,那么if - elseif - else开关语句的维护会变得相当繁琐。

为了方便讨论,我们设30吧!: -)

我做了一个简单的web服务,给定panoramaID"a"将返回上面IF语句中给出的相关位置,链接和tile。我们的想法是使用AJAX调用该web服务,并使用新的位置、链接和磁贴更新网页上的全景图。

现在我遇到了瓶颈:

我可以加载第一个全景图,但是我不能使用我为它设置的链接导航到下一个全景图。

我所做的是:

用处理代码替换getCustomPanorama():

var ajax_panorama = {};
function initialize()
{
  var http=new XMLHttpRequest();
  var url = "http://www.mydomain.com/MyPanoramaUrl";
  http.open("GET", url, true);
  http.onreadystatechange = function()
  {
    if(http.readyState == 4 && http.status == 200)
    {
        var object = "(" + http.responseText + ")";
        ajax_panorama = eval(object);
        var panoOptions = { ... } // As before
        panorama = ... ;
    }
  }
  http.send(null);
}
function getCustomPanorama(pano,zoom,tileX,tileY)
{
   return ajax_panorama;
}

我试过把AJAX代码在getCustomPanorama(),但没有好,并试图通过听"pano_changed"事件来处理它也没有帮助。在我看来:这一切都归结为AJAX的异步部分…

有什么更好的方法吗?

更新:我对AJAX的了解一般导致提示是:关闭异步模式!

因为我的webservice的一般想法是返回一个JSON对象,它可以被解析为Google Maps API。我的尝试是这样的:

var panorama
function initialize()
{
  var panoOptions = {
    pano: 'A',
    visible: true,
    panoProvider: getCustomPanorama 
  }
  panorama = new google.maps.StreetViewPanorama(
      document.getElementById('pano_canvas'),panoOptions);
}

function getCustomPanorama(pano,zoom,tileX,tileY)
{
  var http=new XMLHttpRequest();
  var url = "http://www.mydomain.com/MyPanoramaUrl?pano="+pano;
  http.open("GET", url, false);
  var ajaxPano = eval("(" + http.responseText + ")");
  return ajaxPano;
}

我知道这是一个老问题,但我偶然发现这个,而试图解决这样的问题。如果您将异步标志设置为false,则可以通过以下操作轻松修复此问题:

http。open("GET", url, false);而不是http。open("GET", url, true);

这就解决了我的问题。

谢谢

你的想法几乎是对的,只是有一些问题:

  1. 这听起来像你的webservice需要全景的ID,但你从来没有传递它。
  2. getCustomPanorama函数必须立即返回,所以你不能进行AJAX调用(因为AJAX调用是异步的,可能稍后返回)。

我是这样解决的:

  • 修改你的webservice,让它返回一个Javascript对象,包含你所有全景图的所有信息,以ID为关键字,例如

    panoramas = {A:{/*第一个全景/},B: {/另一个全景*/}};

保持你的代码的其余部分不变,除了修改getCustomPanorama如下:

function getCustomPanorama(pano,zoom,tileX,tileY) {
   return ajax_panorama[pano];
}

这将获取您正在导航到的全景的ID,并在您从服务器传回的对象中查找它。因为对象在你构造全景图之前就已经下载完成了,所以getCustomPanorama可以直接返回。

对于更大的全景图集(数千),您可能想要更狡猾一些,并在getCustomPanorama中使用AJAX调用,但对于少于100的全景图,提前下载整个全景图的描述就可以了。