原文发布时间:2015-05-19
作者:毛毛虫
本文介绍下KML更新的原理及如何在FME中实现KML的更新操作。
首先介绍下KML文件是如何实现更新的。
对已用指定网址载入的 KML 数据进行添加、更改或删除(Change、Create 和Delete)。<targetHref>指定要对其数据进行修改的“.kml”文件或“.kmz”文件。<Update>始终包含在NetworkLinkControl中。而且,包含NetworkLinkControl的文件必须已由NetworkLink载入。
下图说明了事件的顺序。
- 一个NetworkLink将“原始”KML 文件加载到 Google 地球中,<targetHref>定义了这个原始KML的网址。以后要更新的元素需要在首次指定时明确定义 ID。该 ID 必须在给定文件中是唯一的。
- 另一个NetworkLink加载第二个 KML 文件,该文件包含对已加载的 KML 对象的更新(更改、创建和删除的任何组合操作)。
- 为了能够在 Google Earth中查找对象,Update 元素会使用targetHref元素来标识定义了要修改的对象的原始文件。而为了标识要修改的对象或新对象的容器,Change、Create 和 Delete 元素会包含用于引用这些对象 ID 的targetId属性。
下面介绍下如何用FME来更新KML文件。
1)FME中的更新模式:写模块支持把要素写入到父<Document>元素或一个<NetworkLinkControl>元素,这个<NetworkLinkControl>本身包含了<Update>要素。所有具有kml_update_mode属性的要素被设计为“Update”要素,会作为一个<Update>要素处理。
2)辅助<networklinkcontrol>元素:每个<kml>元素可以包含0个或1个<NetworkLinkControl>元素和0个或1个<Document>元素。如果一个<Document>元素和<NetworkLinkControl>元素都是父元素,那么<NetworkLinkControl>元素可以用于更新一个文件的内容而不是他的兄弟<Document>,或者它可以用于更改<networklink>中的特定参数,如刷新时间,链接名称或到期时间等。
3)更新项目的顺序:像Google Earth等地球浏览器,按次序处理<Update>元素中的每个子元素。确保正确的处理各个更新项目的依赖关系是重要的。例如,确保父文件夹的“Create”在执行一个地标的“Create”之前。写模块按下列次序对<Update>元素的内容排序:
1、根据更新的模式按下列顺序分组:Delete, Create, Change
2、父节点的执行在子节点之前
3、容器的操作在非容器之前
4、如果上述不适用,根据kml_id
4)Target Href:<Update>元素的<targetHref>子元素指定了文件的URL,更新应用的URL是一个完整的URL或相对部分URL。URL指定的是KML文件而不是NetworkLink服务的URL,虽然文件必须来自相同的服务器,也必须是HTTP请求的结果。使用文件的本地文件名://是无效的。写模块支持targetHref的说明可以通过TARGET_HREF指令在写模块层次,也可以使用kml_target_href格式属性写到要素层次。使用kml_document_name和kml_target_href格式属性的组合允许创建多个KML文件,每个文件包含自己的<NetworkLinkControl>和相关的更新要素。
下面举一个简单的例子来说明问题。
1、创建一个含有两个元素的KML文件,这两个元素分别为kml_id分别为1,2。
设置kml_parent= source
Google Earth中的打开该KML如下:
2、将该工作空间发布的FME Server,注册为Data Streaming服务。服务地址为:
http://FME3D:8080/fmedatastreaming/test/1.fmw?
3、创建一个更新的KML文件,含三个元素,分别用来更新元素1,删除元素2和创建元素3,设置Target Href属性如下:
kml_target_href=http://FME3D:8080/fmedatastreaming/test/1.fmw?
4、同样发布的FME Server,注册为Data Streaming服务。服务地址为:
http://FME3D:8080/fmedatastreaming/test/2.fmw?
5、创建一个包含两个KML链接的KML文件,内如容下:
<?xml version="1.0" encoding="UTF-8"?>
<kmlxmlns="http://earth.google.com/kml/2.2">
<Folder>
<name>test</name>
<open>1</open>
<NetworkLink>
<name>source</name>
<Link>
<href>http://FME3D:8080/fmedatastreaming/test/1.fmw?</href>
</Link>
</NetworkLink>
<NetworkLink>
<name>Update</name>
<Link>
<href>http://FME3D:8080/fmedatastreaming/test/2.fmw?</href>
<refreshMode>? onChange</refreshMode>
</Link>
</NetworkLink>
</Folder>
</kml>
在该KML中可以用<refreshMode>、<refreshInterval>、<viewRefreshMode>、<viewRefreshTime>等参数来控制刷新。
6、在Google Earth中打开该文件,显示如下:
可以看到,该文件有两个图层,分别是原图层source和更新图层Update,并且source图层中元素1已经进行了更新(位置发生了变化),元素2已经删除,新增了元素3。