【问题标题】:How to preload some part of google maps?如何预加载谷歌地图的某些部分?
【发布时间】:2012-04-06 12:24:33
【问题描述】:

我正在使用 Google Maps API 构建一个网络应用程序,我需要平滑地放大一个区域,所以我使用 setTimeout 每秒增加缩放级别,但是在某些网络不好的地方,地图图像是加载太慢以至于页面很快变成了白页......

所以我的问题是可以预加载谷歌地图的某些部分(从 3 点缩放到 16 点)

【问题讨论】:

  • 我遇到了同样的问题。想让缩放级别的变化更平滑...
  • @Flaudre 你试过 RASG 的解决方案吗?
  • 对于慢速连接的用户来说,缓慢放大也许不是最好的用户体验?即使您预先加载了所有数据,他们也必须在某个时候等待大量图像加载
  • @Flaudre 请检查答案。

标签: javascript performance google-maps google-maps-api-3 preload


【解决方案1】:

您可以将其预加载到隐藏的 div 或 iframe 中。

但你应该确保它不违反Google Maps/Google Earth APIs Terms of Service

10.1.3 对数据导出或复制的限制。

(b) 不预取、缓存或存储内容。您不得预取, 缓存或存储任何内容,但您可以存储:(i) 有限 以提高性能为目的的内容数量 您的 Maps API 实施,如果您临时、安全地这样做,并且 以不允许在本网站之外使用内容的方式 服务; (ii) Maps API 的任何内容标识符或密钥 文档特别允许您存储。例如,您必须 不要使用内容来创建独立的“地点”数据库。

【讨论】:

  • 读到似乎可以预加载以提高性能。
  • 看来 ToS 并不反对 @RASG 提供的解决方案。所以去吧,别担心!伙计,我们在任何法庭上都支持你!
【解决方案2】:

编写一些代码

我刚刚根据 RASG 5 年前的想法创建了一个脚本。让我们创建一个隐藏的地图,当它完全加载时,放大它。我们一次又一次地这样做,直到它缓存所有的缩放。工作的fiddle is here。我在右上角放置了一个信息div,以查看缩放进度。

// init the hidden map
var mapOptions = {
  center: new google.maps.LatLng(center.lat, center.lng),
  zoom: minZoom + 1
};
var preMap = new google.maps.Map(document.getElementById('map-canvas-hidden'), mapOptions);

// when the current hidden map is fully loaded, zoom it in 
preMap.addListener('tilesloaded', function() {
  $('#out').html('Zoom ' + preMap.getZoom() + ' preloaded');

  // if there is zoom to zoom-in, do it after some rest
  if(preMap.getZoom() < maxZoom) {
    setTimeout(function(){
      preMap.setZoom(preMap.getZoom() + 1);
    }, 50);
  }
});

它真的会缓存地图吗?

好吧,清除浏览器缓存并打开小提琴。

在浏览器网络活动中,我们可以看到大量图片正在下载。然后放大地图并再次观看活动。看起来所有的图像都是从缓存中加载的。

希望对你有帮助。

【讨论】:

  • 您可以在前两个缓存获取时计算出慢速放大的速度。
  • 非常好! +1 弄脏你的手 :)
  • 嘿,伊万,非常感谢您的努力。我检查页面太晚了,无法奖励一些赏金。我希望你能接受一个简单的投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 2014-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
相关资源
最近更新 更多