如何使用NetworkLinkControl和Java API for KML(JAK)正确更新Google Earth KML?

问题描述 投票:3回答:3

我正在构建一个向独立的Google Earth客户端提供数据的应用程序。我想发送一组初始数据,然后在服务器上发生更改时使用<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>

[如果有人对我在这里缺少的内容有任何建议,我将不胜感激。谢谢!

kml google-earth jak
3个回答
4
投票

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

问题是最后一个XML名称空间“ xmlns:xal”。由于某些原因,将其从KML中删除后,<Update>标签实际上可以更改Google Earth中的项目。 JAK不允许您更改名称空间,但可以从封送的字符串中手动剥离它。

绝对很奇怪,但至少我找到了解决方法。


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.

-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. 当Google Earth打开KMZ文件时,Google Earth将自动刷新以从该Restful服务获取新数据

  5. 每次刷新时,服务器都会将最新的更新KML数据和新数据发送到GE。

  6. 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>
    
© www.soinside.com 2019 - 2024. All rights reserved.