2011-08-30 106 views
3

我正在构建将数据提供给独立Google地球客户端的应用程序。我想发送一组初始数据,然后使用<NetworkLinkControl><Update><cookie>标签动态更新它,以便在服务器上进行更改。我使用KML(JAK)库的Java API生成KML。不幸的是,虽然我可以证实GE正在刷新我的NetworkLink并拉下我发送的更新,但我的更新没有在GE出现。经过大量阅读,似乎可能是更新的<targetHref>可能是问题,但我99.9%确定我通过相同的字符串发送。如何使用NetworkLinkControl和KML(JAK)的Java API正确更新Google地球KML?

让我困惑的部分是我看到冲突信息是否需要将<cookie>元素的值附加到<targetHref>。实际上,当我从静态服务器URL提供手写测试KML文件时,实际上看到了一个较早的原型更新,因此我怀疑它不是。实际上,目前令人沮丧的是:我已经看到了在自己的机器上更新工作,但现在无法使用看起来像有效且正确的KML。

目前的设置是这样的(剥离为清楚起见外来XML命名空间; “$ CLIENT_ID” 是一个GUID类的字符串):

<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> 

根KML文件从http://server/kml/ $ {CLIENT_ID}服务

初始内容KML从http://server/kmlupdates/ $ {} CLIENT_ID服务:

<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> 

后来更新KML从http://server/kmlupdates/ $服{} CLIENT_ID:

<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> 

如果任何人有什么我失踪这里任何建议,我会非常感激。谢谢!

回答

4

这个问题的原始版本遗漏了两个事实,这两个事实证明是相关的:1)我使用KML的Java API来生成这个,2)<kml>中的XML命名空间。无数次阅读this Google KML Group post后,我终于明白了这一点。

问题是最后一个XML命名空间“xmlns:xal”。出于某种原因,将其从KML中移除可让<Update>标签实际更改Google地球中的项目。 JAK不允许您更改名称空间,但可以从编组字符串中手动剥离它。

绝对怪异,但至少我找到了解决方案。

-1

我用不同的方法去做别的事情在这里可能与你的一些样品(如你的目的“寄过来的一组初始数据,然后动态地使用标签更新”):

https://sites.google.com/site/canadadennischen888/home/kml/auto-refresh-3d-tracking

方法是所有更改都来自服务器Restful服务。希望能帮助到你。详情:

如何使一个动态自动刷新3D追踪:

  1. 准备RESTful服务从数据库生成KML文件(KML样品里面上面的链接)

  2. 我的其他JSP代码将生成一个KMZ文件,其中包含我的Restful服务的链接。 KMZ文件具有onInterval(如在底部)

  3. Jsp网页允许用户下载KMZ文件。

  4. 当谷歌地球打开KMZ文件,谷歌地球将自动刷新,以获得从RESTful服务

  5. 每次令人耳目一新的新数据,服务器将用新的数据的最新更新KML数据发送到GE。

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>[email protected]</name> 
    <open>1</open> 
    <Link> 
    <href>http://localhost:9080/google-earth-project/rest/kml/10001/20002</href> 
    <refreshMode>onInterval</refreshMode> 
    </Link> 
    </NetworkLink> 
    </kml> 
+0

唯一纽带,答案是没有用的;你能否在你的答案中包括一些代码,以及你认为它的相关性? –

+0

已经更新了更多细节... –

相关问题