FMEDesktop培训教程第四章数据格式变换一.docx
《FMEDesktop培训教程第四章数据格式变换一.docx》由会员分享,可在线阅读,更多相关《FMEDesktop培训教程第四章数据格式变换一.docx(23页珍藏版)》请在冰豆网上搜索。
FMEDesktop培训教程第四章数据格式变换一
FME和数据格式
互操作性指的是,交换不同系统和应用程序的信息。
FME通过支持海量空间和非空间数据格式间的转换来实现互操作性。
支持的格式
FME支持200多种格式的数据。
令人惊奇的是,在过去的十年内这种比例呈稳步上升趋势,并没显示出任何下降或停滞不前的趋势。
MrSaif-Investor说过…
“虽然说过去的表现并不能保证将来,但是在这个图标中,我没有看到任何下滑的趋势。
”
FME能够同时处理多种源格式和目标格式的数据,并且以一种完全语义的方式,我可以用最小的努力,将不同的数据集转化成我想要的格式。
为什么有这么多种格式?
现在有许多领域都要用到空间数据,所以才会有越来越多的格式。
在SafeSoftware中,有时我们将这些格式称之为数据的“家族”,这些家族中的每个成员都有不同的数据,这些数据有它们自身的特性,与其它的数据的结构类型区分开来。
也可以添加上面提到的家族
当然最大的难处,还是在处理不同类型的数据时,保存这些数据的意思和内容,例如,将地图和数据库的数据结合成GIS格式的输出数据,FME的读模块和写模块就能很好地做到这一点。
读取或写入
值得我们关注的是,并非FME支持的每一种格式都能够同时进行读取和写入。
一些格式的数据仅仅支持读取(例如,ESRIArcGISmxdfiles),而一些格式仅仅支持写入(例如,SVG)。
但是,大多数格式还是同时支持读取和写入的。
非空间格式
FME支持大量的非空间格式,所以,FME不仅仅能够处理空间要素的非空间属性,它也能处理非空间要素。
许可证和系统要求
FME有许多不同的版本,FME的版本是由许可证决定的,而不是所安装的产品决定的,所以FME的CD-ROM和下载版本都是相同的。
不同的FME版本仅仅在所支持的格式上有所不同,只有FMEDesktopEdition有不同(更为受限制的)的功能。
通常,版本的名字是由它们支持的格式所命名,例如,FMESmallworldEdition就特别支持GESmallworld格式的数据集。
当只有在系统中安装适合的应用程序时,才能支持一些格式,例如,ESRIGeoDatabase:
因为FME使用ArcObjects组件对象来读取GeoDatabase的数据,所以就必须要安装ArcGIS并获得有效地许可证,以使FME支持该格式。
FormatPlug-Ins
FME需要支持一些非常专业的数据格式,这种情况下,就要花钱购买plug-in,通常第三方供应商使用FMEPlug-InSDK来开发特定plug-in(插件)。
MsSurveyor说过…
“登录网站
重要的FME术语
在FME会使用到大量特有的术语,我们有必要理解它们的意思
当我们对数据集进行批量处理,或是处理多个数据集时,了解这些属于术语就显得格外重要。
读模块和写模块
写模块或读模块是FME的一个术语,表示在转换过程中读取一个源数据集或写入一个目标数据集。
Navigator窗口中出现的要么是写模块,要么就是读模块,右图例子中出现的就是其中一个。
读模块和写模块的图标如图所示:
但是,为什么读模块/写模块和数据集之间有区别呢?
这是因为许多FME转换任务都会处理多个数据集。
但是有时候,源数据集在格式和结构上是完全相同的,所以使用一个单一的读模块能更有效地对它进行处理。
有时候源数据集—虽然在格式上相同,但是可能结构不同,这就要求使用不同的读模块处理它。
数据集和要素类别
数据集
地理信息协会将数据集定义为“具有相同的主题数据的有组织集合”,这是对FME中的数据集的一个很好的描述。
在FME中,数据集指的是将参与转换的数据的集合。
FME可以从多个数据集中读取数据,或是将数据写入到多个数据集中,并且这些数据可以在相同的位置,或者也可以是分散于不同的位置。
要素类别
要素类别是FME的一个术语,描述数据集中可辨别的一个子集,因此,每个数据集可能含有大量不同的要素类别。
这个术语还有其它的常用叫法,例如,“图层(Layer)”,“要素类(featureclass)”,对象类(objectclass)”
例如,一个空间数据集可能是关于‘规划信息的,其中也包括“道路”,“物业”以及“学校”方面的信息。
在FME中,‘规划信息’就是数据集的名字,而“道路”,“物业”以及“学校”就是不同的要素类别。
注意:
不要将“要素类别”和“几何属性类”型弄混了,后者是有关点,线,多边形的术语。
数据集的类型
源数据集只是许多不同类型中的一种。
数据集类型在数据储存和数据结构上进行区分。
因为FME会用不同的方法处理每一种类型,所以有必要了解这种区别,并且知道你正要处理的数据是什么类型的。
数据集分为四种基本类型,如下:
文件形式的数据集
文件形式的数据集就像你所听到的那样简单,它指的是在一个文件中保存数据集,例如,AutoCADDXF:
每个DXF文件都是一个单独的数据集。
文件形式数据集内的要素类
它通常用一些方法将数据进行分类,在FME中,这些层次就是不同的要素类。
例如,在AutoCAD中,数据就被定义为不同的层,DXF中的每个层就表示FME中的一个要素类。
DGN格式的文件使用“Level”代替层的概念。
文件夹形式的数据集
这种逻辑关系可能让你有些困惑。
在这种形式的数据集中,数据集是以文件夹或目录的形式来保存数据。
例如,“C:
\FMEData\Data\Properties”中,数据集的名字就是“Properties”。
ESRIShape,MapInfoTAB和CSVformat都是相关的例子。
文件夹形式数据集内的要素类
数据被保存为一系列的文件。
通常,不同名的文件就表示数据集内的一个要素类
例如,在下面的MapInfo数据结构中,数据集被叫做“EastA”.要素类则是“BoundaryArea”,“HydrographyLine”和“RoadLine”
C:
\FMEData\Data\DemoData\MultiDataset\EastA\BoundaryArea.mif
C:
\FMEData\Data\DemoData\MultiDataset\EastA\HydrographyLine.mif
C:
\FMEData\Data\DemoData\MultiDataset\EastA\RoadLine.mif
提示:
FME用户通常会将所有的单独文件都当做数据集,这是错误的。
当在文件中不能对数据进行再划分时,通常FME就会将这个文件当做文件夹形式数据内的一个要素类。
数据库/数据集
正如名字所描述的一样,数据库数据集指的是数据库中储存的一组数据。
通常来说,每个不同的数据库就是一个不同的数据集(虽然严格上来说,数据库中的每个不同的用户/模式,应当被认为是一个不同的数据集)。
Oracle数据库就是一个最显然的例子;数据集用同样的方式处理无论是空间,或是非空间数据。
数据库数据集中的要素类
数据库中的每个表都被当做一个要素类。
例如,一个名为“资源”的数据库有“用户”,“交通”和“设备”三个表。
“资源”就是数据集,“用户”,“交通”和“设备”则是要素类。
网站数据集
它指的是在一个网站上保存数据,例如,WFS(WebFeatureService),这种情况下,数据集名和URL(UniversalResourceLocator)名是一样的。
网站数据集内的要素类
网站数据集通常都会有许多层,而每一层表示一个不同的要素类,例如,WFS是一个这种类型数据集的例子。
结构关系
下面这个图示很好地显示了工作空间,读模块,写模块,数据集要素类以及要素之间的关系。
上面:
这个图标显示了一个单独的工作空间是怎样包含多个读模块和写模块的。
每个读模块包含了许多数据集,而每个数据集包括许多要素类,而每个要素类显然也包含了多个要素。
奇怪的是,每个目标写模块通常都只会写入一个数据集,唯一的例外情况是,当进行DatasetFanout操作时,则会有多个数据集,在第8章中会有详细的讲解。
文件和文件夹形式的数据集
因为文件和文件夹形式的数据集是最常见的,也因为它们是最容易弄混的,所以用一个图标来表示它们之间的区别是非常有必要的,如图:
左上图:
所有的要素类都被保存在一个文件中,那它一定就是文件形式的数据集。
右上图:
所有要素类都有各自的文件,那它一定就是文件夹形式的数据集。
Example1:
将CAD转换为GIS格式
将CAD转换为GIS是对空间数据进行的比较常见的处理。
这个例子中,按照要求你要将CAD格式的数据集转换为GIS格式。
1)启动Workbench.
打开一个新的工作空间对话框,使用以下参数创建一个工作空间:
SourceFormatBentleyMicroStationDesign(V8)
SourceDatasetC:
\FMEData\Data\Roads\MajorRoads.dgn
DestinationFormatAutodeskMapGuideEnterpriseSDF
确定,将源设置“GroupElementsBy”设置成“LevelNames”,按照提示,将Roads和Labels选择成添加到工作空间的要素类。
AutodeskMapGuideEnterpriseSDF是一个非常有趣的格式,虽然它是文件形式的数据集,但是却按照数据库的方法运行,事实上,它是以SQLite数据库为基础的。
2)运行工作空间
选择工具条中DestinationData>RedirecttoVisualizer,对转换结果进行预览,运行工作空间。
按照提示,选择一个输出文件。
DestinationDatasetC:
\FMEData\Output\TrainingModule4\Roads.sdf
检查输出
观察在交叉点,马路是怎样分叉的,也就是说,一条马路(例如,USHWY290E)是有多个部分组成的。
在下面的例子中,我们会对它进行调整。
保存工作空间,方便以后使用。
转换控制
不同格式之间的正确转换需要正确使用一些参数,来控制这个转换过程。
转换过程中不同组成部分的分层关系就需要不同的参数来控制相应的层次。
基本上说,高层次的参数会影响低层次的参数。
数据库写入模式就是一个很好的例子,因为它会贯穿整个转换过程。
首先,数据库写入模式(插入,更新或删除)可以在写模块级别被设置,它将应用到所有要素和表格。
例如,如果将写模块模式设置成插入,那么就会插入所有的要素。
其次,数据库写入模式也可以被设置成要素类级别,它仅仅使用于要写入到表格中的要素,所以不同的表格就要求不同的写入模式。
最后,数据库写入模式也可以被设置成要素属性级别,它仅仅适用于要素。
我们可以对在同一个表中不同的要素中来同时分别进行插入,更新或删除记录。
但是有趣的是,这种情况下,一般低层次模式设置具有优先性。
例如,如果将要素属性操作模式被设置成“删除”,那么写模块级别的设置”更新”将不起作用。
只要当没有设置较低层的参数时,才会应用到较高层的参数。
工作空间设置
工作空间的设置指的是与整个工作空间相关的。
什么是工作空间设置?
它指的是整个工作空间的所有参数,这些参数仅仅适用于正在使用的工作空间,并且可能因不同的工作空间而发生变化。
下图:
Workbench导航方框中显示的工作空间设置。
并不是所有的工作空间设置都会影响转换,有一些仅仅是因为操作的方便,例如,工作空间名称的设置和相关描述.其它设置则直接影响到转换方式。
基本的工作空间设置
有许多基本的工作空间设置。
WorkspaceTitle
在Workbench的显示条中会出现workspacetitle。
默认title包含有关源格式和目标格式的信息,但是可以根据需求改变这个设置。
下图:
使用工作空间参数的一个title.
工作空间描述
这个设置允许用户输入有关工作空间的描述。
当通过FMEServer来使用工作空间时,这个设置就非常重要,因为它为网页提供了一种机制来描述准备进行的转换。
日志文件
当进行转换时,这个参数指的是创建日志文件的位置。
SourceRedirect
sourceredirect会取代FME从工作空间定义的源数据集读取数据的方式,并且促使FME从其它的源数据集中读取数据。
唯一的sourceredirect选项就是‘ReadfromFFSfile’。
DestinationRedirect
这个参数会取代工作空间所定义的目标数据集,并且促使FME发送输出数据到其它位置,而且不会写入数据到目标数据集。
为了重新写入输出数据,就要选择NoRedirect设置来删除这个参数。
destinationredirect选项如下:
RedirecttoVisualizer,直接将输出数据发送到FMEUniversalViewer。
RedirecttoFFSFile:
将输出数据发送到FFS(FMEFeatureStore)文件
DisableOutput:
忽略输出数据
提示:
上图:
工作空间参数s–DestinationRedirect选项。
你也可以在工具条下的目标数据集菜单中找到RedirecttoVisualizer’
高级工作空间设置
在Workbench中也有许多高级的工作空间设置,如下…
GeometryHandling
这个设置判断是否要使用基本的或是增强的处理功能来进行几何属性转换。
虽然高级功能可能会产生更好的结果,但是这些结果可能与之前的转换结果有所不同,所以这就需要用户自己判断是要使用原来的方法,还是使用新的(增强的)工具。
IgnoreFailedReaders
当读取数据集失败时,YES/NO设置会告诉FME是否要继续这个转换过程,例如,如果输入了错误的密码,FME就不能从数据库中读取数据,那么FME是否要从其它数据库中读取数据,然后继续转换过程呢?
MaxFeaturestoLog
“MaxFeaturestoLog”限定了最多能写入多少要素到日志文件
MaxLoggedFeaturestoRecord
任何记录在日志窗口(或文件)中要素都会写入到空间日志数据集,这个数据集与日志文件具有相同的名字,但是要添加“_log”,它是FFS格式。
这个设置决定要写入到日志数据集中的要素数量。
提示:
我们一定要清楚,限定日志要素数量能对多个,例如,三个Logger函数,每个函数都限定只能写入10个要素,这样从理论上说,能编辑30个要素。
但是,“MaxFeaturestoLog”设置会限定总的数量,例如,如果设置成10,那么从理论上说,限定的要素数量为30到10。
你也要注意到,这些设置不仅仅会影响到手动写入的要素,例如,使用Logger参数,而且还会影响到要其它的要素,例如,对AreaBuilder滤去的文本要素进行写入,要素数量是有限定的。
ReprojectionEngine
不同的GIS应用程序稍微不同的算法来将数据投影到不同的坐标系中。
为了确保FME写入的数据与已有的数据完全符合,用户就要使用这个设置,从另一个应用程序中获取ReprojectionEngine。
左图:
安装了ArcGIS的用户选择使用页面提供的引擎来重新投射空间数据。
密码
通常会将工作空间传送个用户,这样FME用户就能运行这个工作空间了,但是并不希望对其进行编辑。
通过设置密码,如果没有密码就不能打开工作空间对workbench进行编辑,虽然如此,你也可以从FMEUniversalTranslator,或者口令栏中,对工作空间进行编辑。
并且,开发人员或咨询人员更倾向于向FME用户传送工作空间,但是不展示空间的内容。
用密码来保护工作空间,这样用户就不能使用标准的文本编辑器来读取空间内容。
启动,关闭脚本
使用这些参数就能在FME转换之前或之后,运行TCL或Python脚本。
右图:
工作空间设置对话款中的脚本参数。
可能会用到以下这些脚本:
在进行转换之前,检查数据库连接.
在转换之前或之后,移动数据
写入转换结果到一个自定义日志,或将结果email给管理者
从其它程序中使用脚本(例如,ESRIArcObjectsPythonscripts)
sEnTacLaus说过…
“现在好了!
作为一个特殊的礼物,FME现在安装了FME2009aPythoninterpreter,这样就不需要再单独安装一个Python了”
Example2:
继续将CAD转换为GIS格式
1)启动Workbench.
如果有需要,就启动Workbench,打开例1的工作空间,或者重新创建一个。
你也可以在C:
\FMEData\Workspaces\TrainingWorkspaces\S4-Example2-Begin.fmw中找到一个副本。
2)CleanUpLinework
例1中已经提到了,在交汇点所有的马路要素就会被拆分成多个要素,而目标要素要求将这些要素合并成一个单一的要素。
将函数LineJoiner放置到马路数据流中,要连接的输出端口就应该是LINE(而不是INVALID)。
对于这个例子,就只需要使用默认的函数参数。
3)检查工作空间设置
在Navigator方框中,检查工作空间设置“GeometryHandling”.,确保将它设置成Classic。
运行工作空间,检查数据输出。
对比下面的两幅图,你会发现,LineJoiner已经将一些线连接在一起,注意,左边那幅图中线之间的空白是为了便于更加清楚的查看。
但是,也要注意,在左图中,两条线之间的连接在交汇点就终止了。
你知道这是为什么吗?
4)更改工作空间设置
奇怪的是,在下图中,在交汇点仍然能够将两条线连接起来。
其实很简单,只需要将geometryhandling改为“Enhanced”,就可以了。
所得到的结果是一样的吗?
为什么?
NB:
之后我们会找到问题所在,并修补LineJoiner函数,给出正确的结果。
读取和写入参数
每个写入到工作空间的读模块或写模块都是由大量设置和参数所控制的,而用户可以自己获取这些参数。
参数用来控制读取或写入数据的方式,并且它适用于所有的读模块/写模块,也适用于某一个要素类。
下图:
在Navigator中很容易中获取读模块参数。
下图:
同样地,也很容易获取写模块参数,同样的目标要素类参数并不是那么明显
下图:
在FeatureTypeProperties对话框就能访问到要素类参数,注意“Parameters”方框。
并非所有的要素类都有参数,所以这个标签页并不总是存在。
读取和写入参数
在分层关系结构表中,读模块属于较高层次的,它们的参数适用于其它要素类,例如,要读取所有的数据集,就会包含所有要素类。
同样地,写入参数也满足所有的数据集,以及那些要写入的要素类。
在WorkbenchNavigator方框中就会显示Reader/Writer参数。
双击参数,就能对它进行编辑,然后就会打开一个对话框,输入参数值。
下图:
在navigator方框中显示OracleSpatial的写模块参数。
Password(上图中红色标记的)就是有关写模块级别的参数的一个例子。
显然,一个密码使用于所有要读取的表格,也就是说,并没有为每个表都设置一个密码。
因为读写模块参数指的是某个特定格式的组成部分和特征,所有没有两种格式会有相同的参数。
并且,可能会需要不同的参数,甚至同一种格式的读写模块可能都会要求不同的参数。
为了方便使用,我们将参数划分为两部分:
基本的和高级的。
Example3:
继续将GAD转换为GIS格式
1)启动Workbench.
如果有需要就启动Workbench,打开例2中的工作空间,或重新创建一个。
当然,你也可以在C:
\FMEData\Workspaces\TrainingWorkspaces\S4-Example3-Begin.fmw中找到它。
2)更改输出数据集
我们知道,已经有了一个SDF数据集,它能够进行一般的转换。
因为FME能够支持SDF格式,所有我们能够添加道路数据。
在Navigator方框中找到写模块参数—“DestinationSDF3File”。
双击它,让后将它改为C:
\FMEData\Data\Transit\Transit.sdf。
3)更改写模块参数
检查已有的SDF数据集,注意,这个数据集中已经储存了数据。
我们并不打算覆盖这个数据集中的一些数据,所以就必须要将写模块参数设置为附加模式。
在Navigator方框中,找到写模块参数—“OverwriteFile”。
将它设置为NO
下图:
新的Navigator窗口看上去就是这样的。
4)运行工作空间
关闭DestinationRedirect,然后运行工作空间(仅仅运行一次!
)。
检查SDF数据集,确保已经保存了原来的数据,并且成功地添加了道路数据。
下图:
SDF数据(FMEViewer中显示的)看起来就是现在这个样子的。
要素类参数
在分层结构图中,要素类属于较低层次。
所以,要素类参数并不影响于整个数据集,仅仅适用于某个要素类。
它们分别对读取和写入时不同的要素类进行控制。
下图:
针对Oracle目标要素类的参数。
“CreateSpatialIndex”(红色标记的)就是一个很好的例子。
我们通过表来决定是否需要使用一个索引;一些表可能需要,而一些可能不需要索引。
因为每个表指的是一个不同的要素类,所以FME通过要素类参数来控制这些索引。
这样就使参数变得非常灵活了。
如果是一个写模块级别的参数,所有的表都会获取到一个索引,但这个索引并非就是用户想得到的。
相反地,没有将密码参数列出,这是因为它适用于整个数据库,而并非仅仅适用于某个表。
下图:
在Navigator方框中的要素类参数—Oracle。
并且也只能在Navigator方框中发布要素类参数(在下一节中我们会看到)。
因为我们已经在一个单独的对话框中将所有参数都列了出来,所以在FeatureTypeProperties对话框中更方便做大量的修改。
Example4:
继续将CAD转换为GIS格式
1)启动Workbench.
如果有需要就启动Workbench,打开例3中的工作空间,或者重新创建一个,你也可以在C:
\FMEData\Workspaces\TrainingWorkspaces\S4-Example4-Begin.fmw中找到它。
2)重新运行工作空间
重新运行例3中的工作空间
检查输出数据
可能很难看到工作空间,但是我们是要将更多的数据写入到同一个文件中,而不是覆盖原有文件,所以我们实际上将马路数据保留了多个副本。
下图:
这里给出了提示,某处出现了错误。
查询一个要素会返回它的多个实例。