19.FME在福建电信数据项目中的应用

李 莉
(福州市勘测院,福建省福州市湖东路188号,350003)

摘 要:
  本文提出了空间数据处理的几个关键点,针对我院承接的福建电信数据项目,引入了FME基于语义的数据转换处理软件,介绍了如何在FME中实现各种空间数据处理,利用FME Plug-in(SDK)开发新的数据格式插件,及利用FME Object调用管道来开发集成的数据批处理程序,为空间数据处理提供了一个很好的思路。

关键词
FME 语义转换 MAPGIS明码格式 坐标系 管道

  信息化建设发展迅速,使得空间数据的应用越来越广泛,随之的数据加工也变得多样和复杂,比如数据的格式转换、坐标系转换、拓扑处理、图层叠加、要素及图层的提取、属性操作、数据的转移、数据整合等,各项繁杂的数据加工常常会使空间数据中的一些信息丢失,或者加工后必须在目标 CAD 或 GIS 系统中对数据进行再处理,才能得以应用。怎样在数据加工过程中减少信息的丢失,提高空间数据处理的速度和质量,减少空间数据处理的工作量,是数据加工的关键点。本文针对福建省电信数据项目的特点,具体介绍了如何利用FME及附带的开发组件,高效地进行一系列的数据转换处理。


项目简介

  我院承接了福建电信本地网资源管理系统工程中的电子地图数据项目,数据范围覆盖全省,数据按地区组织,各地区的市、县城区地图数据为大比例尺1:500、1:2000,地区以外的地区为1:1万、1:5万的小比例尺数据,数据的提供时间为6个月。此项目数据加工的特点及难点简述如下:
  数据多源:大比例尺数据源多来自各县市的基础测绘单位,由于各地的测绘状况不同,数据源表现出多样性,数据格式不同、坐标系不同、数据质量参次不齐,有的地方没有作地图的数字化,需要根据测绘底图数字化,再作深加工。
  坐标系多样:各县市的大比例尺地图一般都是各地的地方坐标系,投影中央经线不同,平移量不同,最终我们要把同一个地区的数据统一到同样的坐标系中,要作多种的坐标系变换。
  目的数据格式是MAPGIS:在由多源的数据转换到MAPGIS中时,要防止空间数据信息的丢失,以及保留要素的制图符号表现,各类要素重新分层。
  数据组织方式:地图要素分层分幅分几何类型,数据文件按分层放置在不同目录下,最终以地图库方式在MAPGIS下调用。由于各地区大比例尺数据分幅规则不同,图号命名规则不同,地图数据还要作坐标转换处理,所以要整合不同地区的数据要统一分幅统一图号命名规则。
  拓扑要求:电信数据要求对水系、居民地、绿地进行拓扑处理,如果按分幅方式建拓扑,数据重分幅后分幅线与以前不同图幅间接边的地方会显示出来,所以我们把拓扑层合并统一构面,再作分幅处理。
  多比例尺数据结构:电信系统中,各县市城区是大比例尺数据1:500、1:1000、1:2000,周边是小比例尺数据1:10000、1:50000,多种比例尺的数据要放在一个DBS地图数据库中,所以不同比例尺的数据要有个很好的文件命名规则。

FME优势
  FME(Feature Manipulate Engineering) Suite是加拿大Safe Software公司推出的空间数据转换处理系统,该系统基于OpenGIS组织提出的新的数据转换理念“语义转换”,通过提供在转换过程中重新构造数据的功能,实现了超过100种不同空间数据格式(模型)之间的转换,为进行快速、高质量、多需求的数据转换应用提供了高效、可靠的手段。FME在空间数据转换处理中具体有如下

优势:
  ◇数据转换:实现了超过100种不同空间数据格式(模型)之间的转换,及在不同的坐标系统间转换数据。
  ◇数据处理:流线型数据准备阶段,通过让 FME 在数据输入阶段执行多个任务,提供了一套可以以不同方式进行组合的构建模块。
  ◇数据整合:在单个数据转换过程中合并多个数据集,所输入的数据集可以是一个或多个不同的输入格式。
  ◇数据确认:使用 FME 来验证并确认空间数据。
  ◇数据引擎:语义转换提供有可重新定义输入或输出数据的引擎(带有一种语言)。

FME应用
编写MAPGIS明码格式插件
  FME虽已支持上百种的格式,但是还没有加入国产的各GIS软件的数据格式,我们利用FME提供的FME Plug-in(SDK)开发包,用C++语言编写了MAPGIS明码格式插件,这样MAPGIS明码格式就可以与FME提供的其它格式相互转换,并且可以在转换过程中执行FME所提供的处理功能,图1所示的是我们在加入了MAPGIS明码格式后,在FME的Formats Gallery对话框中可以看到我们加入的格式及其相关的信息。



自定义坐标系转换

  根据FME坐标系定义的格式,可以添加定义自己的地球椭球、投影坐标系,我们的大比例尺数据源都是各地区的地方坐标系,在FME的自定义坐标文件中,加入新的坐标系,这样在FME的转换过程中可以实现不同坐标系之间的转换,这个转换可以用管道的形式实现,也可以直接配置源数据及目标数据的坐标系来实现。如下是我们定义的漳州地区的统一的自定义投影坐标系,它采用Gauss Kruge投影方式,Krasovsky 1940椭球,投影中央经线117.5度,投影中央纬线0度,东平移500000米,北平移0米,定义格式如下:
COORDINATE_SYSTEM_DEF BeiJing_漳州地区统一投影_117.5 \
DESC_NM "BeiJing 漳州地区统一投影_117.5" \
EL_NAME KRASOV \
PROJ GAUSSK \
UNIT METER \
PARM1 117.5 \
ORG_LAT 0.0 \
MAP_SCL 1.0 \
SCL_RED 0.9996 \
X_OFF 500000.000 \
Y_OFF 0.00
  我们把上面定义的坐标写在FME目录下的MyCoordSysDefs.fme文件里,就可以使用了。图2显示的是在数据处理过程中我们调用Reprojector转换功能,在Reprojector中配置源坐标系及目标坐标系,在配置时可以在Coordinate System Gallery对话框中选择已定义过的坐标系,可以看到我们定义的漳州地区的坐标系已经在列表中了。



连接数据库
  某一编码的要素在MAPGIS中对应它的符号、颜色,我们把要素编码与它在MAPGIS中的符号、附带的符号参数据、颜色等作成数据库的一个对应关系,通过Joiner转换功能来关联数据库,将关联到的符号信息传递给目标格式MAPGIS明码的固定所有字段,来控制生成的要素的符号,例如图3中我们将要素关联到数据库表中的“主线型”字段信息传递给属性“MapgisAscii_linetype”,转出的要素线型就是符号库中相应的线型,经过这样转换的数据其符号表现信息会保留,不需要再到MAPGIS中进行修改,大大减少了工作量。

数据重新分幅
  对数据作完坐标转换后,需要按分幅的规则重新分幅,可以利用Tiler转换功能,它从数据的最小坐标处开始,以用户设置的行高度(Row Height)、列宽度(Column Width)将数据切割成分片的数据,并将切割后的要素所在的行列号分别放在属性row、column中,例如1:2000比例尺5*5分幅的地图分幅间距是1000米,我们设置它的行、列间距为1000,由于数据的边界不是刚好在分幅线处,所以要加入一个数据原点共同参与切割;再用FeatureTypeExtractor来提取要素所在的要素类,存在字段FeatureType里,在这里它的值就是我们的数据分层名称了;然后利用AttributeCreator创建一个名为filename的字段,并赋值“I@Value(row)@Value(column)_ @Value(FeatureType)”,这样就可以根据要素的filename属性值来确定它所在的图幅号和它所在的数据层;电信要求点、线、面分在不同的层,这样可以再加一个几何类型的分类GEOMETRYFILTER,在filname赋值中也加入相应的几何信息。


文件命名规则
  由于电信数据项目中,一个地区的数据涉及到多个比例尺的数据,数据按分类及几何特征分为20个层,所有这些数据又要在同一个地图库中整合,文件命名规则变得很重要了,我们针对电信项目的数据要求规定了文件命名规则:
文件名称构成:①比例尺代码+②图号+“_”+③图层名+文件格式后缀
①比例尺代码:由一位大写字符标识,如1:2000标识为“I”,1:10000标识为“G”
②图号构成:由六位数字表示,前三位为图幅所在的行号标识,后三位为列号标识
③图层名:为数据要求的分层名称
我们在3.4中按这个规则来给要素设置其文件名属性字段filename,对于基于目录的数据输出格式,可以直接按这个字段分类,并将它作为输出文件的名称。如图5在目标要素类型属性对话框中,将Fanout Feature Type选中,Fanout attribute 选择字段filename,输出将按filename值进行分类,并生成到一批文件中。

转换批处理
  由于前面我们写的MAPGIS明码格式的插件是基于文件的,3.5中所提到的批量转换方法不能使用,我们利用FME提供的FME Object,在Visual Studio .NET中用C#语言按电信的数据要求开发了数据转换的批处理程序,在批处理程序中针对电信数据的要求作专项处理,其中许多功能都在FME Workbench里作好相应的fme管道文件,在程序中直接调用相应的管道文件,调用管道的语句如下:
IFMEOPipeline fmePipeLine = mSession.CreatePipeline("test",null);
fmePipeLine.AddFactories(pipeFileName); // pipeFileName是我们写好的管道文件
IFMEOFeature fmeFeature = mSession.CreateFeature();
IFMEOFeatureVector fmeFeaVector= mSession.CreatFeatureVector();
while (fmeReader.Read(fmeFeature))
{
fmePipeLine.ProcessFeature(fmeFeature);
}
fmePipeLine.AllDone();
while(fmePipeLine.GetOutputFeature(fmeFeature))
{
//将处理后的要素写出到要素集fmeFeaVector
fmeFeaVector.Append(fmeFeature);
}
管道处理过的要素有filename属性,程序中按这个属性字段将要素分类,将各类要素分别写到各MAPGIS明码格式文件中,写出语句如下:
IFMEOWriter fmeWriter = mSession.CreateWriter(“MAPGISASCII”,initDirectives);
StringCollection SWriterDefs = new StringCollection();
fmeWriter.Open(WriteFileName,SWriterDefs);
for (int i=0;i<InFeatureVector.Count;i++)
{
// InFeatureVector为一类要素集
fmeWriter.Write(InFeatureVector.GetAt(i));
}
  我们作好每个层的数据的处理管道文件,并要求在批处理之前的数据要作一定的整理,这样一个城区的数据可以经过一个批处理程序转换完成。同时在程序中设定不同层的数据放在不同的文件夹中,转出的MAPGIS明码格式文件如图7所示,是自动按层分目录组织的,省去了手工组织的工作。



其它应用
  以上提到的只是FME应用中的一部分,实际操作中还遇到一些其它情况,在FME中也能得到很好的解决,FME提供了很多实用的常用的功能,如Tester属性信息的判断,AttributeFilter属性信息的筛选,LengthCalculator要素长度计算,CoordinateFetcher坐标提取,Clipper数据裁切,Dissolve面要素合并,CenterPointReplacer用中心点替换原要素,GeometryCoercer改变要素的几何类型等,这些处理很难在一个软件中通过一步操作来实现,有的或许还要作程序开发才能达到,可是在FME几乎可以完成我们所需的所有处理,而且只是通过点击拖拉就可以了。

总 结
  FME软件提供了很多的数据格式转换、丰富的空间数据处理功能,可以有效地进行各种空间数据处理工作(包括图形和属性的),并在一些特殊处理中具有其优越性,也可以根据特定的项目开发数据格式的插件,编写更为灵活的应用程序。福建电信数据项目,工期很紧,技术难度大,通过应用FME软件,基于语义的转换减少了信息的丢失,可以在FME中完成几乎所有的数据处理,数据处理后不需要在目标软件MAPGIS中作额外的修改,从而大大提高了空间数据处理、转换的效率,减少了工作量,保证了项目顺利进行。

参考文献
  [1]FME Suite 帮助系统,FMEObjectsDevGuide,fme技术白皮书;
  [2]MAPGIS地理信息系统使用手册数字制图篇,2004.4;
  [3]张瑞菊,陶华学,GIS与空间数据通挖掘技术集成问题的研究,勘察科学技术,2003.2;
  [4]刘春,刘大杰,GIS的应用及研究热点探讨,现代测绘,2003.6;
  [5]Kurt Buehler.OpenGIS? Reference Model.Version 0.1.2.