谷歌地图API v3 - KML图层的变化

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

你尝试过清空浏览器缓存吗?(或者使用CTRL+F5刷新页面而不是仅仅按F5) - Joachim Rohde
是的,我尝试在不同的浏览器中打开我的网站:Opera、IE、Safari、Chrome、FF...结果都一样。 - Jacob Jedryszek
@JoachimRohde 这样行不通。谷歌正在缓存KML,而不是客户端的浏览器。 - Matyas
3个回答

10

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


以上不是我的问题。但这里有示例代码。它从当前网站获取KML并显示它。我认为Google会缓存KML将近一天的时间。所以它随时可能恢复到实际的KML文件。 - Shyam K
不好意思,您的方法是正确的。显然,Google地图从KML文件中获取坐标时是相反的方式。在KML上是(x,y)。当我前往x,y的maps.google.com时,它指向格陵兰海的某个位置。但当我颠倒坐标时,它指向了正确的地方。这在之前(使用您的方法之前)没有发生过,因为该值被缓存了。感谢您的帮助:D - Shyam K
我发现,如果您更改了初始的kml文件并且其中包含错误,Google地图将显示最新的无错误地图。(这花费了我一些时间才注意到...以防对某人有所帮助) - Jorge
是的,重命名文件立即生效。如果你正在测试并且没有时间浪费,这似乎是最好的解决方案。 - Shina
2
我对API文档的质量感到惊讶。 - MastaBaba
显示剩余2条评论

5

是的,谷歌服务器会缓存KML数据。所以为了避免这种缓存,请将kml网址更改为

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

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

伟大的 hack。救了我的一天。 - tala9999

0

我想对添加缓存破坏到KML URL的建议加上一个强烈的警告:请注意,如果您使用像(new Date()).getTime()这样的时间戳,这意味着Google几乎每次用户尝试显示您的KML图层时都会尝试从您的服务器获取KML文件。

两个后果:

  • 如果您的网站访问量达到峰值(当然这也取决于您的KML大小),同时上传文件的带宽和CPU使用量可能会非常高;
  • 这反过来又会导致在地图上显示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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接