第一作者简介: 曹昌磊(1987-),男,硕士,主要从事数学地质方面的研究。Email:caochangleiccl@126.com。
国土资源科学数据的共享工程迫切需要实现MapGIS数据格式向ArcGIS数据格式的转换。目前的转换方法往往需要对转换后的数据进行大量繁琐的图形编辑工作。通过对MapGIS和ArcGIS这2个平台的数据格式深入分析后,利用平台提供的开发包开发了简易的数据转换工具以及ArcGIS扩展插件,制定了一套高效率转换方案,并在“云南地质灾害详细调查”地图数据处理工作中进行实际应用,取得了很好的效果。
Land and resources sharing project urgently demands data conversion from MapGIS to ArcGIS. However, the current conversion methods often require a large quantity of tedious graphical editing work for the transformed data. Based on an in-depth analysis of MapGIS and ArcGIS data format and using two platform development packages, the authors developed simple data conversion tools and ArcGIS extension plug-in components and formulated a set of efficient conversion schemes. The application of the scheme to the map data of Yunnan geological disaster investigation has obtained very good effect.
我国国土资源领域多年来一直把MapGIS作为指定的GIS软件平台, 对各类数据进行采集、加工和管理等工作。该平台目前发布的共享数据仅有MapGIS一种格式[1, 2]。ArcGIS作为一款国际主流GIS软件, 在我国拥有相当庞大的用户群, 并且相比MapGIS而言, 在空间数据库一体化管理、空间分析等方面具有独到的优势[3, 4]。为此, 开展两平台间数据格式精确转换的研究显得非常迫切。
当下数据转换方法主要有以下几种: ①利用MapGIS自身提供的转换模块功能直接将数据转换成ArcGIS的shapefile格式, 或先转换成E00, dxf或mapinfo等中间格式, 然后再转入ArcGIS中; ②采用某种编程语言直接读取MapGIS明码格式源文件, 再写入ArcGIS目标文件中[5]; ③利用第三方软件如FME[6, 7]等进行转换。笔者曾对这些方法做过试验和比较, 觉得它们后期编辑工作量太大, 信息丢失太多。为此, 本文在深入分析二者数据结构及其制图表达方式后, 提出了利用MapGIS sdk调用接口读取点、线、面的空间信息(即几何信息和参数信息)和属性信息, 通过ArcEngine实现shapefile文件写入的研究新思路。应用实践表明, 这种参数信息写入的方法为ArcGIS扩展插件的开发提供了便利, 明显提高了效率, 减少了人为工作量。
MapGIS的标准数据格式是以点(wt)、线(wl)、面(wp)3种加密文件存储的。根据特征类型划分数据, 在工作区中统一管理, 每个特征要素都有唯一序号, 与其他格式交换的为其明码格式, 但是明码格式不提供属性信息的读取[8]。
ArcGIS软件有coverage, shapefile, geodatabase和E00共4种数据格式, E00作为与外部交换的格式存在诸多缺点, 转换后的信息常常丢失。实践表明, shapefile文件是ArcGIS与MapGIS数据转换的最佳途径[9, 10, 11, 12]。本文转换就是利用shapefile文件作为转换中间格式, 将MapGIS数据导入Geodatabase中的。shapefile是ArcGIS提供的公开数据格式, 通常由主文件、索引文件和dbf文件组成, 其数据结构相对简单, 只含有主要的信息, 即点、线、面的空间坐标和属性记录; 但不能表示有向点目标, 没有拓扑关系, 也缺少很多数据类型[13]。geodatabase是ArcGIS8以后引入的数据格式, 是建立在DBMS之上的统一的空间数据库。
MapGIS和ArcGIS的空间数据都是以点、线、面的形式存储, 线、面又是以一系列点数据组成, 所以空间数据实际上就是存储一系列坐标。二者对面的定义不同: MapGIS的面数据只存储了弧段号, 并以0弧段号来区别属于不同封闭边界的弧段, 其值的正负代表方向; 而ArcGIS的面是以环定义, 一个或多个环组成面, 并且ArcGIS中的每一段记录可以对应多个点或多个多边形等[14]。
在制图表达机制上, MapGIS将地图渲染信息存储在点、线、面中, 其颜色库和符号库分别将颜色和符号映射到一个唯一独立的值, 这些值即是颜色号和符号号[14]。ArcGIS的渲染信息全部存储在单独文件中, 如lyr图层文件和mxd文档文件, 而且与图形数据完全分离, 是依赖于属性表的动态渲染信息。二者的符号库也存在很大差异。渲染方式的差别为二者数据的转换加大了人工干预的工作量。
1)空间信息方面。二者空间数据都是存储了实际的一系列坐标, 但是二者存储坐标的方式有所不同, 点和线的转换并无问题, 只需读取坐标或是坐标数组写入, 将MapGIS点类型为注记的数据单独转为一个shapefile文件。转换难点在于面的转换, 针对二者面数据定义的差别, 本文方案见图1。
2)属性方面。将MapGIS各种类型文件的属性信息、重要参数均写入shp数据的属性表中, 以方便在ArcGIS中渲染。
投影定义了坐标系(参考椭球、基准面)和投影方式, 相同的投影保证了数据的正确显示。ArcGIS的投影信息单独存在prj文件中, 转换时只需通过MapGIS sdk读取提供的数据框相关类数据, 并将投影信息写入prj文件中即可。
MapGIS的注记全部存储在点文件里, 每个标注都有相应的参数, 属于静态注记。而ArcGIS中的标注是根据属性表中的字段来实现标注, 属动态标注, 每次的放大或缩小操作地图标注都会重绘。ArcGIS中依赖多字段的标注表达函数支持多种脚本语言编写, 当将MapGIS注记类点参数写入shapefile属性表的字段中(注记内容、角度、大小、字体、颜色、横竖排等)时, 需要表达的字段以参数形式传入脚本函数, 根据字段的记录差别标注, 此函数可以以文本形式存储, 以字符串路径形式读取赋给expression对象, 从而实现一键标注。对于特殊符号, ArcGIS无法识别上下标问题, 如T2gb转换后为T#-2#=g#+b, 采用读字符串遇#跳过, 遇-赋< sub> , 遇+赋< sup> ; 对于横竖排(MapGIS点参数中1是竖排, 0是横排), 由于ArcGIS的默认均为横排, 遇到竖排时则采用向每个字提供换行符。对于角度由于二者的角度机制不同, 在写入shp文件时需将角度换算成360-MapGIS中的角度, 但对于标注角度和子图角度在ArcGIS中分别用算术角度和地理角度对应。对于字体MapGIS也是以数字显示, 建立字体映射表(如参数1代表宋体等)即可。
由于2个软件平台的符号库有差异, 无法实现完美转换, 需要在ArcGIS中扩展符号库。制作新符号可以利用ArcGIS自带的符号拼凑, 也可以利用FontCreator软件绘出符号并生成字体文件, 被ArcGIS的character symbol识别而加载, 最终建成符号库。利用自带符号拼凑成的新符号在放大后会出现一定程度的连接缝隙从而影响美观。因此本次利用FontCreator绘制符号生成字体文件(图2为绘制的部分符号), 在ArcGIS中新建符号库, 加载绘制的符号字体文件建成符号库。
由于MapGIS只提供颜色号, 所以需要建立颜色映射表。每个颜色号对应的RGB值可以调用API函数GetColorRGBValue获取。读取MapGIS的slib库获取颜色号映射的RGB信息, 再将其输出为mdb形式。
线转换难点主要在线型、线宽特性方面。线型利用ArcGIS自带的线型制作符合要求的线型即可。制作时需注意线密度、方向等; MapGIS和ArcGIS的线宽表达并非一致, 将MapGIS的线宽乘以5倍左右可以基本保证二者数据的表达的一致。
据所分析难点制定一套可行性转换方案, 具体流程如图3所示。
1)准备阶段。此阶段需对源格式数据进行精确检查, 如拓扑检查, 投影信息检查, 并将MapGIS提供的数据压缩存盘, 以确保转换之前数据的完整性。同时还需根据项目中用到的颜色、符号等(一般MapGIS源文件中会单独以pdf形式保存用到的颜色、符号等信息)信息建立从MapGIS到ArcGIS颜色映射表、符号映射表、字体映射表等, 在ArcGIS中制作符号库。这些映射表和符号库的建立非常有用, 对于无论用何种方法实现二者平台数据的转换都有很好的通用性。
2)文件转换及入库。基于前文对转换难点以及解决方案的分析, 调用二者开发包读取MapGIS空间以及属性信息。为了方便更好地在ArcGIS中渲染, 需将MapGIS特征要素的参数信息根据映射表做一定修改(如角度、字体等), 再写入shapefile文件中, 投影单独生成prj文件。转换工作数据的完整性非常重要, 几何修复(data management)和拓扑检查可以很好地保证这一要求。转换的shapefile数据格式没有拓扑关系, 所以需新建geodatabase, 然后导入shapefile。这一方面由于数据成果本来就需要入库, 另一方面也保证了在渲染前需进行的拓扑规则检查。拓扑规则需根据专题数据要求具体而定, 如解决常规的线重叠、悬挂线、面不封闭、相邻面不能相交等问题的规则。如果地图未经拓扑检查就渲染入库, 则可能会将有错误拓扑关系的线和面也渲染了, 那么保存的mxd文档与实际入库图形数据间就会有差别。所以, 地图必须在进行了拓扑检查后再渲染入库, 并保存一份mxd文档, 才能保证渲染地图文档与图形数据的一致。
3)地图渲染。ArcGIS中渲染分为简单要素渲染、复杂要素渲染以及标注的渲染等。点(子图号, 子图颜色, 字体大小)、线(线型、线颜色、线宽)、面(颜色、填充图案)的每个类型要素都需要利用唯一值、多个字段以及映射表进行渲染。为此, 笔者本次开发了要素渲染扩展插件, 实现了各类要素及标注的完美渲染, 简化了人为编辑工作量。插件示意图见图4。其中第一个文本框为标注的渲染代码文本文件, 第二个文本框为制作的ArcGIS符号库, 第三个文本框为MapGIS颜色号— RGB映射表。
4)优化地图。这是为了让地图与源数据更加贴合, 更加美观。如在标注引擎上ArcGIS提供了二种引擎, 选择maplex label engine会让标注更加美观; MapGIS利用还原显示开关以及静态标注提高了地图显示效率(原本ArcGIS的数据显示一般都为动态, 显示效率不高, 在ArcGIS中将标注转为注记以及设置标注层的“ Scale Range” 会明显提高地图显示的效率, 并且可以微调注记位置。需要注意的是依赖属性的动态标注时偶尔会出现遗漏, 而在标注转为注记时可自行检查遗漏的标注)。由于ArcGIS只提供了至多根据3个字段属性值进行符号化, 从而限制了转换过后地图的美化, 本文利用ArcGIS提供的高级制图表达representation, 在geodatabase格式数据的支持下, 不只是根据属性而是针对每个要素进行渲染, 很好地解决了这个问题。
本文提出的转换方案是针对“ 云南地质灾害详细调查” 数据转换项目而设计的, 转换后的地图基本达到需求, 现截取部分图作示意。图5为2个软件平台标注以及部分子图的转换对比, 包括标注颜色、字体、大小以及子图的方向、颜色等基本符号要求。图6为线型以及填充图案的对比, 涵盖了线宽、颜色、线型的方向, 填充图案的密度、颜色等信息。图7为云南省安宁市地质灾害防治图的局部区域对比。
针对项目数据分析各种转换难点开发出一个简易的转换工具, 针对转换工具转换后的数据特性开发的ArcGIS扩展插件明显减少了人为工作量, 依据符号库及映射表实现了一键标注及点、线、面要素的自动渲染。由于开发的扩展插件是针对特定的地图数据开发, 有一定的局限性, 但是各种映射表的建立将方便了以后转换者的使用, 具有一定的通用性。
The authors have declared that no competing interests exist.
[1] |
|
[2] |
|
[3] |
|
[4] |
|
[5] |
|
[6] |
|
[7] |
|
[8] |
|
[9] |
|
[10] |
|
[11] |
|
[12] |
|
[13] |
|
[14] |
|