MapGIS文件快速转换Shapefile文件的研究.pdf
第1期 文章编号 1672 - 82622008 01 - 53 - 03 中图分类号 P208 文献标识码B MapGIS文件快速转换Shapefile文件的研究 陈小虎 3 ,董竹,陈凯 3 收稿日期 20070530 作者简介陈小虎1980 , 男,助理工程师,从事GIS系统开发与地图编绘技术工作。 成都市勘察测绘研究院,四川 成都 610081 摘 要分析了传统的从MapGIS文件到Shapefile文件转换的方法并加以改进,解决了大量MapGIS文件和Shapefile 文件快速转换的问题。经过用户实践证明,该方法简单有效。 关键词MapGIS文件; Shapefile;快速转换 1 引 言 实际生产过程中常常利用MapGIS完成数据生产 及加工,然后转换到Shapefile文件格式,利用ArcGIS 建立数据库,进行GIS分析与应用。这就涉及了Map2 GIS文件转换Shapefile文件的问题。MapGIS早期版 本就具有将Shapefile文件批量转换为MapGIS文件的 功能,并且MapGIS 615以后已经具备将单个文件转换 为Shapefile文件的功能。但MapGIS转换为Shapefile 文件时,有如下的几个问题一直没有得到很好解决。 影响了MapGIS与ArcGIS的数据共享。 1MapGIS没有批量将文件转换为Shapefile文 件的功能。当有大量MapGIS文件需要转换到Shape2 file文件时,若用人工一个文件一个文件进行转换不仅 效率低,而且很容易出错。 2MapGIS文件本身带有颜色和符号信息,可是 转换为Shapefile文件时,这些信息将全部丢失。在 ArcGIS里没有任何MapGIS的原始符号信息如子图 号,颜色 , 要重新赋颜色符号将是非常困难的事情。 3 MapGIS文件里文字作为注释类型存在,而在 Shapefile文件没有注释类型,只有点point文件,通过 对字符类型字段的标注来实现文本的显示。 2 传统的处理方法 在MapGIS 615以前,通常是将MapGIS文件转换 为第三方文件格式,然后再转换为Shapefile文件; MapGIS 615以后,可以单个文件单个文件转换为 Shapefile文件,但是转换后失去了所有的符号信息。 将单个MapGIS文件转换为Shapefile文件的流程如图 1所示。 为了方便在ArcGIS里重新给Shapefile文件赋上 颜色符号,通常手工增加一些字段如“ 图层 ” 、 “ 颜色 ” 、 “ 子图号 ” ⋯⋯;然后使用MapGIS编辑模块的“ 根据参 数赋属性 ” 将参数赋到属性字段里。然后将文件转换 为Shapefile文件。 图1 单个MapGIS文件转Shapefile流程 传统方法转换MapGIS的点文件,是首先将点文 件分离为子图文件和注释文件,然后分别增加参数属 性字段,注释文件还要增加一个文本字段,使用“ 注释 赋为属性 ”,将文本内容保存到属性字段里。最后将文 件转换为Shapefile文件。 传统的转换方法烦琐复杂而且容易出错,幸好, MapGIS提供了完整的二次开发函数库。用户完全可以 在MapGIS平台上开发面向各自领域的应用系统。本文 介绍了利用Visual C 610与MapGIS二次开发函数库 实现MapGIS文件快速转换Shapefile文件的研究。 3 程序设计与实现 程序分成两个模块,第一个是“ 图元参数赋属性 ” 模块;第二个是“ 批量转换Shapefile” 模块。考虑到图 元参数赋给属性后,用户可以将带有新属性的MapGIS 文件转换为其他格式,以增加灵活性。 311 图元参数赋属性模块 MapGIS类型文件拥有不同的后缀点文件. wt ; 线文件. wl ;面文件. wp。不同类型的文件需要添 35陈小虎等 1MapGIS文件快速转换Shapefile文件的研究 1994-2009 China Academic Journal Electronic Publishing House. All rights reserved. 2008年 加不同的图元参数属性字段;如子图文件需增加“ 子图 号 ”,“ 子图高 ” ⋯⋯;线文件则增加“ 线型 ”,“ 线宽 ” ⋯⋯。该模块首先根据文件后缀判断是否是MapGIS 文件,同时判断出文件类型,再根据不同的文件类别加 不同的参数属性字段,并将图元参数作为属性赋给参 数属性字段。现以点文件为例说明该模块的实现。 1将点文件分离为子图与注释 Shapefile文件通过标注属性字段来实现文件显 示,所以MapGIS的点文件必须将子图与注释分离成 不同的文件,分别转换为Shapefile文件。 ① 子图参数赋属性 打开MapGIS点文件并装入点工作区,新建“ 子图 号 ” 、 “ 子图高 ” 、 “ 子图角度 ” 、 “ 颜色 ” 、 “ 图层 ” 共5个 字段,依次遍历文件中的每个图元并判断图元类型,如 果是子图则获取子图参数并将参数值赋给对应的属性 字段;如果是注释则删除。当遍历结束后另存一个新 的点文件即得到一个有图元参数的子图文件。主要代 码如下 PNT_I NFO pntInfo; CFIELD_HEAD t[5]; char3att; / /获取点文件的属性结构 _GetAttStruai, PNT, / /定义新增加的字段集 lstrcpy t[0 ]. fieldname, “子图号“ ; t[0 ]. fieldtype STR_ TYPE; t[0]. msk_leng 20; lstrcpy t[1 ]. fieldname, “子图高“ ; t[1 ]. fieldtype STR_ TYPE; t[1]. msk_leng 20; lstrcpy t[2]. fieldname, “子图角度“ ; t[2 ]. fieldtype STR _TYPE; t[2]. msk_leng 20; lstrcpy t[ 3 ]. fieldname, “颜色“ ; t[ 3 ]. fieldtype STR _ TYPE; t[3]. msk_leng 20; lstrcpy t[ 4 ]. fieldname, “图层“ ; t[ 4 ]. fieldtype STR _ TYPE; t[4]. msk_leng 20; / /将新定义的字段集插入点文件的属性结构 c _InsertStruFldai, PNT, 5, t, 1 ; / /获取点文件图元个数 if_GetPnt Num ai, / /遍历所有图元 for i 1; i n; i { if_GetPntInfoai, i, / /若获取失败眺出本次循环 if_GetAttai, PNT, i, if pntInfo. type PNT_NOTE / /如果点类型是注释 { _DelPnt ai, i ; / /删除点图元 continue; } / /若图元类型是子图,则获取图元参数并存入属性 if pntInfo. type PNT_SUB { sTem. at “ ld“ , pntInfo. info. sub. subno ; _SetFld2 FromStratt, stru, “子图号“ ,LPSTR LPCTSTR sTem ; sTem. For mat“ f“ ,pntInfo. info. sub. height ; _SetFldFrom2 Stratt, stru, “子图高“ ,LPSTR LPCTSTR sTem ; sTem. For mat“ f“ , pntInfo. info. sub. angle ; _SetFldFrom2 Stratt, stru, “子图角度“ ,LPSTR LPCTSTR sTem ; sTem. For mat“ hd“ , pntInfo. iclr ; _SetFldFromStratt, st2 ru, “颜色“ ,LPSTR LPCTSTR sTem ; sTem. For mat “ hd“ , pntInfo. layer ; _SetFldFromStr att, stru, “图层“ ,LPSTR LPCTSTR sTem ; _W ritePntAttai, i, stru, att ; / /写入点图元属性 } ② 注释参数赋属性 再次打开同一个点文件并装入点工作区,新建“ 内 容 ” 、 “ 字符高 ” 、 “ 字符宽 ” 、 “ 字符间距 ” 、 “ 字符角度 ” 、 “ 中文字体 ” 、 “ 颜色 ” 、 “ 图层 ” 共5个字段。依次遍历 文件中的每个图元并判断图元类型,如果是注释则获 取注释参数并将参数值赋给对应的属性字段,并将注 释的文本内容赋给“ 内容 ” 字段;如果是子图则删除该 图元。当遍历结束后另存一个新的点文件得到一个有 图元参数和文本内容的注释文件。 2线文件与面文件的处理 线文件需增加“ 线型 ” 、 “ 颜色 ” 、 “ 线宽 ” 、 “X系 数 ” 、 “Y系数 ” 、 “ 图层 ”6个字段。面文件需增加“ 填 充颜色 ” 、 “ 填充图案 ” 、 “ 图案高度 ” 、 “ 图案宽度 ” 、 “ 图 案颜色 ” 、 “ 图层 ”6个字段。MapGIS的线文件与面文 件处理相对点文件处理要简单一些,只需打开文件遍 历所有图元一次并将获取的图元参数值赋给对应的属 性字段即可。 312 批量转换Shapefile模块 MapGIS文件与Shapefile内部文件结构完全不同, 并且存在一些特殊的文件结构。比如在Shapefile文件 中,对象I D属性具有唯一性,在MapGIS文件里,图元 I D属性却是可以重复的,另外MapGIS文件里,图元被 删除后,仅仅是逻辑上的删除,只有压缩存盘后,被删 除的图元才真正的被物理删除。为了避免转换出错, 在转换前需要对MapGIS文件进行一些特殊的处理。 1遍历指定文件夹内MapGIS文件 打开指定文件夹,开始遍历文件夹里所有的Map2 GIS文件点文件. wt、 线文件. wl、 面文件. wp / /进行循环读取,对每个文件进行转换 HANDLE hFind; 45城 市 勘 测 1994-2009 China Academic Journal Electronic Publishing House. All rights reserved. 第1期 W I N32_FI ND_DATA dataFile; BOOL bMoreFiles TRUE; hFind FindFirstFile strDir, while hFind I NVAL I D _HANDLE_VALUE } } 2对打开的文件进行压缩存盘 MapGIS文件进行删除图元操作后,图元仅仅是被 逻辑删除,在缺省情况下,保存工作区内容时,不清除被 删掉的图元。重新装入文件时,被删掉的图元依然存 在。只有将工作区的压缩标志设置为1,在保存工作区 内容时,才能将被删除的图元将从物理上被清除掉。 strFile0 m_strSourceFolder “ \ \“ strFile; / /打开指定的数据文件对应的工作区,并将数据装入到新 工作区中 Pai _OpenFileAreaahinst, strFile0. GetBuffer strFile0. Get2 Length ; strFile strFile. Left strFile. Get Length - 3 ; strFile m_strFolder “ \ \“ strFile; / /将工作区压缩标志设为1 _SetPackFlagPai, 1 ; / /保存工作区内容 _ SaveAFile Pai, strFile0.Get Buffer strFile0.GetLength ; 3对文件进行重置缺省I D处理 重置缺省I D实质上就是把图元唯一的图元号赋 给它的I D属性。 MapGis文件的图元I D属性不是唯一的,可以重 复, Shapefile的对象I D属性ObjectI D却是唯一的。 在转换前对文件进行重置缺省I D操作有助于提高文 件转换的成功率。以下是点文件. wt的重置缺省I D 源代码 / /取图元个数 if_GetPntNum Pai, / /循环取所有记录 for i 1; i n; i { / /取第i条记录 if_GetAttPai, PNT, i, / /根据字段名称设置字段值 _SetFldatt, stru, “ I D“ , char3 / /写点定类型图元属性 _W ritePntAttPai, i, stru, att ; } 4将文件转换为Shapefile文件 MapGIS文件用后缀名来区分点. wt、 线. wl、 面 . wp文件,而Shapefile文件后缀没有点、 线、 面的区 别。批量转换时,为避免转换后出现同名文件相互覆盖 的情况,使转换后的点文件名加 ”p”,线文件名加 ”l”,面 文件名加 ”r” 以示区别。调用转换shape函数 / /将点文件转换为shapefile文件 _ShapeOutPai,LPTSTR LPCTSTR strFile ; 4 结 论 该程序在生产实践中的应用表明它能最大限度地 减少MapGIS文件转换到Shapefile文件过程中出错的 可能性,极大地提高了生产效率,程序实现的方法简 单,有效而且可靠。 参考文献 [1] 武汉中地信息工程有限公司. MapgGIS地理信息系统使 用手册 [2] David J. Kruglindki, Scot W ingo, George Shepherd.Visual C 610技术内幕.北京希望电子出版社, 2001 [3] MapGIS开发手册 Research of Rapid ConvertingMapGis file to Shapefile Chen XiaoHu,Dong Zhu, Chen Kai Chengdu Institute of Survey and Investigation, Chengdu 610081, China AbstractThis analyses the traditional of translatingMapGis file into ShapeFile and improves the to solve the problem of a lot ofMapgis files rapid translating Shapefile. It has been confir med that the means is efficient, through the author’s practice. Key wordsMapGis file; Shapefile; rapid translating 55陈小虎等 1MapGIS文件快速转换Shapefile文件的研究 1994-2009 China Academic Journal Electronic Publishing House. All rights reserved.