如何使用AJAX浏览多个谷歌地图全景图
How to navigate multiple Google maps panoramas using AJAX
我一直在尝试用谷歌地图播放自定义全景图。在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);
这就解决了我的问题。
谢谢
你的想法几乎是对的,只是有一些问题:
- 这听起来像你的webservice需要全景的ID,但你从来没有传递它。
- 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的全景图,提前下载整个全景图的描述就可以了。
- 谷歌地图固定位置覆盖
- 不显示带有本地json文件数据的谷歌地图脚本
- 谷歌地图不是以HTML显示,而是在JS Fiddle上工作
- 谷歌地图标记不会显示
- 无法在JS中显示谷歌地图
- 科尔多瓦页面类应用程序中的多个谷歌地图
- 需要帮助谷歌地图方向面板在FancyBox中显示
- 在谷歌地图上获取事件的x,y坐标
- 谷歌地图API v3不适用于移动浏览器或PhoneGap
- 模拟谷歌地图中的点击
- 如何知道哪个标记被谷歌地图点击了
- 谷歌地图JS API+JSON-多个标记没有显示
- 缓存谷歌地图数据
- 谷歌地图劫持了iphone's滚动(触摸事件)-如何恢复
- 在谷歌地图上绘制位置数据库
- 标记的实时更新,无需加载页面谷歌地图API V3
- 可以't计算自定义谷歌地图的js
- 在谷歌地图上放置标记或叠加视图 街景全景 通过纬度/长度和间距
- 如何使用AJAX浏览多个谷歌地图全景图
- 不包括“业务视图”;全景图时,请求谷歌地图API街景