如何在FME中更新KML

原文发布时间:2015-05-19

作者:毛毛虫

本文介绍下KML更新的原理及如何在FME中实现KML的更新操作。

首先介绍下KML文件是如何实现更新的。

对已用指定网址载入的 KML 数据进行添加、更改或删除(ChangeCreate Delete)。<targetHref>指定要对其数据进行修改的“.kml”文件或“.kmz”文件。<Update>始终包含在NetworkLinkControl中。而且,包含NetworkLinkControl的文件必须已由NetworkLink载入。

下图说明了事件的顺序。

                    

  1. 一个NetworkLink原始”KML 文件加载到 Google 地球中,<targetHref>定义了这个原始KML的网址。以后要更新的元素需要在首次指定时明确定义 ID。该 ID 必须在给定文件中是唯一的。
  2. 另一个NetworkLink加载第二个 KML 文件,该文件包含对已加载的 KML 对象的更新(更改、创建和删除的任何组合操作)。
  3. 为了能够在 Google Earth中查找对象,Update 元素会使用targetHref元素来标识定义了要修改的对象的原始文件。而为了标识要修改的对象或新对象的容器,ChangeCreate  Delete 元素会包含用于引用这些对象 ID targetId属性。

下面介绍下如何用FME来更新KML文件。

1FME中的更新模式:写模块支持把要素写入到父<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

4Target Href<Update>元素的<targetHref>子元素指定了文件的URL,更新应用的URL是一个完整的URL或相对部分URLURL指定的是KML文件而不是NetworkLink服务的URL,虽然文件必须来自相同的服务器,也必须是HTTP请求的结果。使用文件的本地文件名://是无效的。写模块支持targetHref的说明可以通过TARGET_HREF指令在写模块层次,也可以使用kml_target_href格式属性写到要素层次。使用kml_document_namekml_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


猜你喜欢

转载自blog.csdn.net/fmechina/article/details/80849702