就是采用某种编程语言首先读取源数据文件,提取源文件中的图形信息和属性信息,然后再写入目标文件中去。这种方法需要同时非常熟悉两种数据文件的格式,因此给数据转换带来了不小的难度。
2、利用数据格式转换工具这种方法简单方便,但是通用数据格式转换器难以避免的会丢失一些图形信息,转换出来的图形一般还需要一些特别的处理,如图形颜色设置,符号设置,区域填充设置。3、利用第三方数据文件访问工具进行数据格式转换这种方法灵活简单,也具有很强的灵活性,开发难度小,代价就是需要第三方的数据访问组件。随着GIS组件式开发技术的逐渐成熟,各种GIS组件都具有访问其本身的GIS数据的功能,如MapObject可以访问ESRI Shape Files、ArcInfo Coverage 和VPF等矢量数据格式。利用GIS组件的这种特点可以灵活的自己编写与其他数据格式转换的程序,或者在GIS系统的二次开发中集成数据格式转换的功能,实现 GIS数据共享。本文研究的内容就是利用GIS组件(MapObject)进行由Shape到Dxf的格式转换。二、基于ComGIS的从Shape文件到Dxf文件格式转换的方法1、 Shape文件结构ESRI的Shape文件是二进制文件,能够同时存储空间图形数据和属性数据。一个Shape文件包括三个文件:一个主文件(*.shp),一个索引文件(*.shx),和一个dBASE(*.dbf)表。主文件是一个直接存取变量记录长度文件,其中每个记录描述一个有它自己的vertices列表的shape。在索引文件中,每个记录包含对应主文件记录离主文件头开始的偏移,dBASE表包含了实体的属性数据。图形数据和属性数据通过索引号建立一一对应的关系。Shape文件是按照地物类型来组织的。地物类型可以分为简单的分为点(Point)、线(Line)、面(Polygon)三种类型,一个Shape文件中只能包括一种类型的地物,即只能包括点、线或者面状地物中的一种。点状地物存储的是一组坐标(X,Y),线包括简单线和多段线,存储的是一系列的坐标串(X1,Y1,X2,Y2…),面状地物存储的是一系列封闭的坐标串(X1,Y1,X2,Y2, …, X1,Y1)。2、DXF文件结构 DXF文件有两种格式ASC码文本格式和二进制格式。前者可以用记事本打开,简单易读,后者存储效率高。DXF文件最小组成单位是组(GROUP),一个DXF文件由多个组组成。每个组在DXF文件中占两行。第一行是组码(GROUP CODE),它是一个整数;第二行是组值(GROUP VALUE),它的数据类型取决于组码的数值。例如X坐标的组码为10,Y坐标的组码为20,Z坐标的组码为30。一个DXF文件分为多个节(SECTION),每个节均由多个组(GROUP)组成。每个节均由一个组值为字符串“SECTION”的0组开始,后跟组值为表示段名的字符串的2组,其后为组成该节的各个组,最后以组值为字符串“ENDSEC”的0组表示该节结束。所有节都结束后,在DXF文件的最后是组值为字符串EOF(END OF FILE)的0组作为文件的结束标志。一个完整的DXF文件由以下七个节(SECTION)组成A. 标题(HEADER)节:包括与图形相关联的变量的设置,例如图形节最大、最小X坐标和最大、最小Y坐标($LIMMIN,$LIMMAX),点显示模式($PDMODE),点尺寸($PDSIZE)等。其中的每一个变量都通过组码 9 给出变量名,并由其后的组码提供变量值。B. 类(CLASSES)节:类节保存由应用程序定义的类,而该类的实例则出现在块节(BLOCKS)、实体节(ENTITIES)和对象节(OBJECTS)中。C. 表(TABLE)节:包含命名项的定义,存放一系列表。包括线型(LTYPE)表、层(LAYER)表、文本字样(STYLE)表、视(VIEW)表、用户坐标系统(USC)表、视窗配制(VPORT)表、尺寸标注式样(DIMSTYLE)表、应用标识(APPID)表。D. 块(BLOCK)节:存放块定义的实体。对图形中每个块引用,在块节中都必需有一个条目与之对应。E. 实体(ENTITIES)节:存放图形实体,其中包括块插入实体。DXF图形文件中的所有图元(包括点、线、面、插入块,注记文字等实体)都将在ENTITIES节定义。F. 实体(OBJECTS)节:存储非图形对象。G. 预览图像(THUMBNAILIMAGE)节:只有当预览图像被保存在DXF文件中时该节才存在。编写一个构造完备的DXF文件的程序是比较困难且烦琐的,因为必须保持图形的一致性,以使AutoCAD能够接受它,同时还必须保持信息的完整性。值得庆幸是一个DXF文件可以只包含以上七个节中的若干个节,而不是全部节。以上七个节中,最重要的是实体(ENTITIES)节,实体节存储了DXF文件所有的图形对象。一个最简单的DXF文件可以只包含实体(ENTITIES)节,而不需要包含其他任何节。这样就大大降低了DXF文件编写的难度。3、 Shape文件到DXF文件转化的实现由于Shape文件是二进制文件,且文件格式复杂,直接使用编程语言读取Shape文件具有一定的困难,由此作者使用第三方开发组件MapObject提供的对Shape文件的数据访问接口来读取Shape文件内容,大大降低了Shape文件到DXF文件格式转化的编程工作量。MapObject是目前最优秀的GIS二次开发组件之一,他提供了一系列的GIS制图功能和访问ESRI Shape Files的数据访问接口[1]。利用MapObject对Shape文件的数据访问功能来提取Shape的图形信息,具有不丢失图形信息、数据访问简单等优点。下面是Shape文件类型与DXF图元类型对照表地物类型 | Shape文件地物类型 | DXF图元类型 |
点 | MoShapeTypePoint | Point,Block |
线 | MoShapeTypeLine | Line |
面 | MoShapeTypePolygon | Polygon |
文字 | 注记(不属于Shape文件类型) | TEXT 图1. Shape文件地物类型与DXF文件图元类型对照表作者以某市地下管线Shape文件为例,实现了将管线Shape文件转化为Auto CAD系统DXF文件,并将数据转化功能集成到某市地下管线管理信息系统中,很好的解决了地下管线管理系统与Auto CAD制图系统之间的数据格式共享问题。转化过程中没有丢失图形信息。下面以地下管点Shape文件为例,简单介绍如何将点图元写入DXF文件。 点状地物对应DXF文件的点图元,但是由于Shape文件中点状地物通常表示地图上的一个独立地物,如电线杆等,他具有某些特殊的符号,因此往往需要把Shape文件的点状地物作为一个块(Block)插入到DXF文件中,这也是通用的文件格式转换工具所不能做到的。下面是一个插入图块的通用函数
Public Sub InsertBlock(lyrName As String, blkName As String, X As Double, Y As Double) Print #fnum, 0 Print #fnum, "INSERT" ‘插入图块组码 Print #fnum, 8 Print #fnum, lyrName ‘插入图块的图层名 Print #fnum, 100 Print #fnum, "AcDbBlockReference" Print #fnum, 2 Print #fnum, blkName ‘插入的图块名 Print #fnum, 10 Print #fnum, X ‘插入图块点X坐标 Print #fnum, 20 Print #fnum, Y ‘插入图块点Y坐标End Sub3、结束语作者结合在系统开发过程中的实践经验,提出了一种新的数据格式转化方法,使用GIS二次开发组件MapObject进行Shape文件到DXF文件的数据格式转化,转化后的图形没有信息丢失,在GIS二次开发中得到了很好的应用。参考文献[1] http://www.esrichina-bj.cn/ http://mjtd.com/ 地理信息系统-原理、方法和应用,邬伦等,科学出版社,2002
学术参考网 · 手机版
https://m.lw881.com/ |