我正在构建一个向独立的Google地球客户端提供数据的应用程序。我希望发送一组初始数据,然后在服务器上发生变化时使用<NetworkLinkControl>
和<Update><cookie>
标记动态更新数据。我正在使用Java API for KML(JAK)库生成KML。不幸的是,虽然我可以确认GE正在刷新我的NetworkLink并删除我发送的更新,但我的更新都没有出现在GE中。经过大量阅读后,似乎可能是更新的<targetHref>
可能是问题,但我99.9%肯定我发送了相同的字符串。
令我感到困惑的部分原因是我看到有关<cookie>
元素的值是否需要附加到<targetHref>
的信息存在冲突。当我从静态服务器URL提供手写的测试KML文件时,我确实看到了一个早期的原型更新,所以我怀疑它不是。实际上,这就是目前令人沮丧的事情:我已经看到在我自己的机器上更新工作,但现在无法使用看似有效且正确的KML的工作。
当前设置看起来像这样(为了清楚起见,剥离了无关的XML名称空间;“$ CLIENT_ID”是类似GUID的字符串):
从http://server/kml/ $ {CLIENT_ID}提供的根KML文件:
<kml xmlns="http://www.opengis.net/kml/2.2"
xmlns:gx="http://www.google.com/kml/ext/2.2"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:xal="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><NetworkLink>
<Link>
<href>http://server/kmlupdates/${CLIENT_ID}</href>
<refreshMode>onInterval</refreshMode>
<refreshInterval>1.0</refreshInterval>
<viewRefreshTime>0.0</viewRefreshTime>
<viewBoundScale>0.0</viewBoundScale>
</Link>
</NetworkLink></kml>
从http://server/kmlupdates/ $ {CLIENT_ID}投放的初始内容KML:
<kml><NetworkLinkControl>
<minRefreshPeriod>0.0</minRefreshPeriod>
<maxSessionLength>-1.0</maxSessionLength>
<cookie>cookie=0|kmlRequestType=updates|projectID=6|lastUpdateSeenIndex=-1</cookie>
</NetworkLinkControl>
<Document id="myProject">
<name>My ProjectProject</name>
<Placemark id="pm1"><name>point1</name>
<Point><coordinates>-117.0,35.0</coordinates></Point>
</Placemark>
</Document></kml>
稍后更新来自http://server/kmlupdates/ $ {CLIENT_ID}:
的KML<kml><NetworkLinkControl>
<minRefreshPeriod>0.0</minRefreshPeriod>
<maxSessionLength>-1.0</maxSessionLength>
<cookie>cookie=0|kmlRequestType=updates|projectID=6|lastUpdateSeenIndex=0</cookie>
<Update>
<targetHref>http://server/kmlupdates/${CLIENT_ID}</targetHref>
<Change>
<Placemark targetId="pm1">
<name>Name changed by Update Change</name>
</Placemark>
</Change>
</Update>
</NetworkLinkControl></kml>
如果有人对我在这里缺少什么有任何建议,我会非常感激。谢谢!
答案 0 :(得分:4)
我的问题的原始版本遗漏了两个事实证明是相关的:1)我正在使用Java API for KML来生成这个,以及2)<kml>
中的XML命名空间。我终于在无数次阅读this Google KML Group post之后想到了这一点。
问题是最后一个XML命名空间“xmlns:xal
”。出于某种原因,从KML中删除它允许<Update>
标记实际更改Google地球中的项目。 JAK不允许您更改命名空间,但您可以从封送的字符串中手动删除它。
绝对奇怪,但至少我找到了解决方案。
答案 1 :(得分:0)
根据https://developers.google.com/kml/documentation/kmlreference:
<xal:AddressDetails> is used by KML for geocoding in Google Maps only.
Currently, Google Earth does not use this element; use <address> instead.
答案 2 :(得分:-1)
我有一些示例使用不同的方法在这里执行其他可能与您相关的事情(因为您的目的是“发送一组初始数据,然后使用标签动态更新”):
https://sites.google.com/site/canadadennischen888/home/kml/auto-refresh-3d-tracking
方法是所有更改都来自服务器Restful服务。希望能帮助到你。详情如下:
如何制作动态自动刷新3D跟踪:
准备RestFul服务以从DB生成KML文件(KML样本在上面的链接中)
我的其他jsp代码将生成一个KMZ文件,其中包含指向Restful服务的链接。 KMZ文件有onInterval(如下图所示)
Jsp网页允许用户下载KMZ文件。
当Google地球打开KMZ文件时,Google地球会自动刷新以从该Restful服务获取新数据
每次刷新时,服务器都会向GE发送包含新数据的最新更新KML数据。
KMZ样本:
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2"
xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
<NetworkLink>
<name>Dennis_Chen_Canada@Hotmail.com</name>
<open>1</open>
<Link>
<href>http://localhost:9080/google-earth-project/rest/kml/10001/20002</href>
<refreshMode>onInterval</refreshMode>
</Link>
</NetworkLink>
</kml>