4

我有一些动态生成的 KML 文件,我想在 Google 地图上显示这些文件。这很容易,我以前做过几次,没问题。

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

简单的“仅添加时间戳参数”不起作用,因为我不会控制页面上传递给 Google 地图的 url(只是大部分 url)。

查看<Link>and<networkLink>标签,它们似乎可以让您控制外部资源的过期、缓存、刷新等。阅读文档,似乎使用<refreshMode>onChange<refreshMode>两层方法可以得到我想要的。

对此进行测试后,Google 实际上并没有刷新链接的 KML 文件的内容,即使在 10-20 分钟和多个地图重新加载后(当我向地图搜索框提供相同的 url 时)。

这些是我正在使用的 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。有谁知道我可能做错了什么?或者如果我想要的是可能的?

4

2 回答 2

1

对于过期,Google 遵循标头中的过期时间,但强制至少 5 分钟过期,以防止第 3 方服务器受到有效的拒绝服务攻击。

于 2013-04-03T15:10:06.230 回答
1

这是我所知道的:

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

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

长话短说:在 Google 地图中对 KML 文件的缓存控制onExpire完全onInterval不可靠。在您的数据加载后的某个时间点,它会被刷新,因为 Google 的缓存已经删除了它。但是那个缓存什么时候过期呢?一些随机时间,至少 5 分钟。

于 2013-03-18T07:47:55.583 回答