2

我目前正在构建一个谷歌地图项目,它将根据用户输入动态加载和卸载各种 KMZ 文件。它适用于大约 8 层加载/卸载,但随后谷歌地图因 414 错误而崩溃。我已将问题追溯到 API 生成的存储字符串以引用每个 KML 层。

这是单击图层时运行的代码:

function showLayer(layername) {
  if (layers[layername].kml === undefined) {
    layers[layername].kml = loadKML(layers[layername].file, layers[layername].options);
  }
  layers[layername].kml.setMap(map);
  redrawRoutes(layers[layername].kml);
}

和 loadKML 函数:

function loadKML(file, options) {
  var path = kmlDir + file;
  options = options || { preserveViewport: true };
  layer = new google.maps.KmlLayer(path, options);
  return layer;
}

基本上我的目标是只加载每个 KML 文件一次,将其存储在一个对象中,然后在后续加载/卸载时引用它。这里的问题是在生成的 Javascript 对象内部new google.maps.KmlLayer,一个很大的长字符串

"kml:cj5TNh3iqySpI_DAGiDgbSJESQ-dakZTiMY09US6imjvFNPMTIIYNAg|ks:;dc:cg;ts:44610546|kv:3|api:3"

并每次都将其附加到请求 URI。这加起来相当快,并且在 7-8 附加之后 URI 太长并且任何后续请求都将被忽略。

有没有办法使用这个长请求字符串,我可以强制它使用自定义字符串,还是每次都清除 URI?我只会处理大约 6 个文件,我真的希望能够处理尽可能多的层加载/卸载。

4

1 回答 1

3

您正在尝试优化 Google 已有的内容。Google 缓存的 KML 文件及其关联的切片,因此破坏和重新创建图层的惩罚很小。只要 KML 图层的 url 保持不变,您就应该销毁然后重新创建图层。

无论地图上当前有多少 KML 文件,Google 都会将它们呈现为单个图块叠加层。每次您通过 setMap 添加/删除 KML 图层时,您的用户都必须下载新的平铺图像。

您的 KML 文件每隔几个小时才会被访问一次。据推测,Google 会尝试遵守为对 KML 文件的请求发出的缓存标头。但是,没有明确定义当缺少强缓存标头时,Google 将缓存您的 KML 多长时间。

Google 还规定了最短缓存时间,因此即使您通过强缓存标头指定您的 KML 文件应在 1 分钟后过期,Google 仍会在其预设(且未公开)时间缓存该文件。标准解决方法是向 KML url 添加额外的查询字符串参数,以生成以前未缓存的新/唯一地址。

于 2012-05-29T21:00:13.430 回答