Google maps API v3 - KML图层更改

时间:2011-10-28 14:34:22

标签: google-maps-api-3

我使用google.maps.KmlLayer('http://mywebsite.com/my.kml')从KML文件设置对象。它正在工作,但是当我更改kml并尝试刷新网站时......我仍然保持与之前相同的状态......没有我的更改。当我将文件名更改为my2.kml时 - 它正在工作...... Google是否正在缓存我的kml?我需要做什么才能使用相同的kml文件名更新更改?

3 个答案:

答案 0 :(得分:10)

Google服务器实际上会缓存KML数据。由于Google服务器正在处理您的KML而不是您的浏览器,因此清除缓存无济于事。这就是更改文件名的原因。为了防止缓存,请在您创建KML图层的KML URL中添加缓存破坏程序,例如随机数或当前时间戳。 http://mywebsite.com/my.kml?rev=323626252346每次刷新页面时rev的值都会发生变化。您还可以编写Javascript,以便您可以单击更新KML图层对象上的URL的按钮,从而无需刷新页面。

答案 1 :(得分:5)

是的,谷歌服务器缓存KML数据。因此,请避免此缓存,将kml网址更改为

"http://www.kmlsource.com/foo.kml?dummy=" + (new Date()).getTime();

这将始终生成一个新网站,缓解问题将得到解决。

答案 2 :(得分:0)

我想向建议中添加强烈警告,以向KML URL添加缓存无效化:请注意,如果您使用(new Date()).getTime()之类的时间戳,则意味着Google将尝试获取KML文件几乎每当用户尝试显示您的KML层时,您都可以从服务器中获取该信息。

两个后果:

  • 如果网站上的访问者数量达到高峰,则同时上传文件所使用的带宽和CPU可能会非常高(当然,这也取决于KML的大小);
  • 这反过来会增加较大的延迟,从而在地图上显示KML。

更好的策略是仅在您知道KML已更改时才添加缓存清除参数。也许浏览器可以从服务器接收KML文件的哈希值或KML的版本号,并将其作为附加参数添加到请求中。每次KML文件更新时,您都需要重新计算哈希值或生成新的版本号。

一个惰性的,效率低得多的想法是服务器定期生成一个新令牌(例如,每10分钟一次,使它成为您的用例的合理期限),并让浏览器使用该令牌当它需要显示KML文件时。

一个更糟糕的想法,但与使用浏览器端毫秒时间戳进行缓存清除相比仍然好一点,是在浏览器端最多仅每10分钟更改一次参数。

例如,您可以使用类似(new Date()).getTime()

的方法来代替Math.floor((new Date()).getTime()/1000/(10*60))*(10*60)

请注意,这是一个非常糟糕的解决方案,因为它仍然会根据最终用户的计算机时钟来计算。如果最终用户在其计算机上设置了错误的时间,那么仍然可以在很短的时间内生成许多不同的时间戳。

在Google Maps JavaScript API中使用KML图层的优势之一是它们可以在Google端进行缓存:如果不需要,直接在浏览器端构建的图层可能会更好。例如。使用GeoJSON。甚至还有关于Google JS API的文档:https://developers.google.com/maps/documentation/javascript/datalayer#load_geojson