Google Maps KML正在加载 - 414请求URI太大

时间:2012-05-29 18:51:51

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

我目前正在构建一个Google Maps项目,该项目将根据用户输入动态加载和卸载各种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文件一次,将其存储在一个对象中,然后在后续加载/卸载时引用它。这里的问题是在new google.maps.KmlLayer生成的Javascript对象内部,一个很大的长字符串

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

并每次将其附加到请求URI。这相当快速地增加,并且在7-8追加后,URI太长并且忽略任何后续请求。

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

1 个答案:

答案 0 :(得分:3)

您正在尝试优化Google已有的功能。 Google缓存的KML文件及其相关的磁贴,因此销毁和重新创建图层的代价非常小。只要KML图层的网址保持不变,您就应该销毁然后重新创建图层。

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

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

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