谷歌服务器确实会缓存KML数据。由于谷歌服务器处理您的KML而不是您的浏览器,清除缓存将无济于事。这就是更改文件名的原因。为了防止缓存,请在创建KML图层时添加一个缓存破坏器到您的KML URL中,例如一个随机数或当前的时间戳。http://mywebsite.com/my.kml?rev=323626252346其中rev的值每次刷新页面时都会发生变化。您也可以编写JavaScript,这样您就可以单击一个按钮来更新KML层对象上的URL,无需刷新页面。
是的,谷歌服务器会缓存KML数据。所以为了避免这种缓存,请将kml网址更改为
"http://www.kmlsource.com/foo.kml?dummy=" + (new Date()).getTime();
我想对添加缓存破坏到KML URL的建议加上一个强烈的警告:请注意,如果您使用像(new Date()).getTime()
这样的时间戳,这意味着Google几乎每次用户尝试显示您的KML图层时都会尝试从您的服务器获取KML文件。
两个后果:
更好的策略是仅在您知道KML已更改时添加缓存破坏参数。也许浏览器可以从您的服务器接收到KML文件的哈希值或版本号,并将其作为请求的额外参数添加。每次更新KML文件时,您需要重新计算哈希值或生成新的版本号。
一种更懒惰、效率远低于此的想法是,服务器定期生成一个新的令牌(例如每10分钟一次,根据您的用例设置合理的时间间隔),并在浏览器需要显示KML文件时使用该令牌。
一个更糟糕的想法,但仍比使用浏览器端毫秒级时间戳进行缓存破坏要好一点的是,在浏览器端每10分钟最多更改一次参数。
例如,您可以使用类似于Math.floor((new Date()).getTime()/1000/(10*60))*(10*60)
而不是(new Date()).getTime()
。
请注意,这是一个相当糟糕的解决方案,因为它仍然基于最终用户的计算机时钟计算。如果最终用户在其计算机上设置了错误的时间,则在短时间内仍然可以生成许多不同的时间戳。
在Google Maps JavaScript API中使用KML图层的优点之一是它们在Google端被缓存:如果您不需要它,您可能最好使用直接在浏览器端构建的图层。例如使用GeoJSON。甚至有一个针对Google JS API的文档:https://developers.google.com/maps/documentation/javascript/datalayer#load_geojson