3

我正在构建一个为独立的 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>

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

4

3 回答 3

4

我最初版本的问题遗漏了两个事实证明是相关的:1)我使用 Java API for KML 来生成这个,2)里面的 XML 命名空间<kml>。在无数次 阅读这篇 Google KML Group 帖子后,我终于明白了这一点。

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

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

于 2011-08-31T15:21:49.003 回答
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.
于 2020-01-14T12:14:54.970 回答
-1

我有一些示例使用不同的方法在这里做其他事情可能与你的相关(因为你的目的是“发送一组初始数据,然后使用标签动态更新它”):

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

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

如何进行动态自动刷新 3D 跟踪:

  1. 准备一个 RestFul 服务以从 DB 生成 KML 文件(KML 示例在上面的链接中)

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

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

  4. 当 Google Earth 打开 KMZ 文件时,Google Earth 将自动刷新以从该 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>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>
于 2015-10-06T18:37:34.827 回答