使用kml文件和谷歌地图缓存到期

时间:2013-03-18 03:24:38

标签: google-maps kml

我有一些动态生成的KML文件,我想在Google地图上显示。这很简单,我之前做了几次,没问题。

我想要的是KML文件只能由Google为请求缓存。也就是说,如果一个人访问带有Google地图嵌入的页面,其中已加载并显示了我的KML,我希望该KML文件用于该页面加载。但是如果用户要刷新页面(具有相同的Google地图URL),我希望重新获取KML文件。

简单"只需添加一个时间戳参数"不起作用,因为我无法控制在页面上传递给谷歌地图的网址(只是大部分网址)。

查看<Link><networkLink>标记,它们似乎可让您控制外部资源上的过期,缓存,刷新等。阅读文档,似乎使用<refreshMode>onChange<refreshMode>使用双层方法将获得我想要的东西。

经过测试,Google即使在10-20分钟后重新加载了多个地图(当我向地图搜索框提供相同的网址时),也无法刷新链接的KML文件的内容。

这些是我正在使用的KML文件:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
  <NetworkLink>
    <Link>
      <href>URL</href>
      <refreshMode>onChange</refreshMode>
    </Link>
  </NetworkLink>
</Document>
</kml>

...

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
    <Placemark>
        <name>NAME</name>
        <visibility>1</visibility>
        <Style>
            STYLE
        </Style>
        GEOMETRY
    </Placemark>
</Document>
</kml>

...将URL,NAME,STYLE和GEOMETRY替换为正确的内容。有没有人知道我可能做错了什么?或者如果我想要的可能吗?

2 个答案:

答案 0 :(得分:1)

这就是我所知道的:

  • onChange将完全缓存响应,除非您通过<viewFormat>对KML加载启用视口直通,我几个小时后才看到任何刷新。
  • onExpire在链接的KML文件中使用'max-age'标题在Google地图中不起作用(根据文档),尽管我看到了[1]中描述的行为,这可能是相关的到默认的内部Google地图过期时间。
  • onExpire使用<NetworkLinkControl><expires>排序工作,因为数据似乎在提供的到期时间后过期,但行为看起来更接近[ 1]
  • onInterval将刷新数据,假设您的<viewRefreshTime>足够大,并且会按照自己的时间表执行(时间不是最可靠),但地图视图开始缩小完全(似乎没有办法解决这个问题)。

[1]如果您指定'max-age' X秒并且您打开页面,则在页面具有焦点时,KML将永远不会刷新。如果您将焦点移动到另一个网页或应用程序,然后等待一段时间后页面应该刷新(有时等待2分钟就足够了,有时候不是),然后你回到页面,它可能会弥补快速连续30次请求,如果您不返回内容,则尝试刷新数据;如果您确实返回内容,则只刷新一次。

长话短说:使用onExpireonInterval对Google地图中的KML文件进行缓存控制根本不可靠。在加载数据后的某个时刻,它将被刷新,因为谷歌的缓存已经摆脱它。但是什么时候缓存过期了?一些随机时间至少需要5分钟。

答案 1 :(得分:1)

对于到期日期,Google会遵循标头中的过期时间,但会强制执行至少5分钟的到期时间,以防止第三方服务器受到有效拒绝服务攻击的攻击。<​​/ p>