基于MapGIS实现图件自动裁剪与图例生成
贺海扬1,2, 沈正新1,2, 安政伟1,2, 邱崇涛1,2
1.核工业航测遥感中心,河北 石家庄 050002
2.中核集团公司 铀资源地球物理勘查技术中心(重点实验室),河北 石家庄 050002

作者简介: 贺海扬(1984-),男,工程师,毕业于成都理工大学,主要从事物化探工作。Email:hhy8297@163.com

摘要

国产MapGIS软件是国内应用范围较广的地理信息系统之一,不仅绘图功能强大,而且向用户提供了二次开发库。笔者简要介绍了物探图件表现形式和图例制作要求;针对航空物探项目中的图件绘制特点,利用MapGIS组件,以C#语言为平台提出了一个解决方案,可快速实现大批量图件裁剪、图例制作以及图面配置等工作,有效地减少了人为误差的引入,大大地提高了工作效率。文中对程序设计中的关键点和涉及MapGIS组件开发的主要代码进行了较详尽地阐述。

关键词: MapGIS二次开发; C#; 航空物探; 图件裁剪; 图例制作
中图分类号:P631 文献标志码:A 文章编号:1000-8918(2017)03-0550-06
Automatic clipping of maps and producing of legends based on secondary development of MapGIS
HE Hai-Yang1,2, SHEN Zheng-Xin1,2, AN Zheng-Wei1,2, QIU Chong-Tao1,2
1.Airborne Survey and Remote Sensing Center of Nuclear Industry,Shijiazhuang 050002,China
2.CNNC Key Laboratory for Geophysical Exploration Technology Center of Uranium Resource,Shijiazhuang 050002,China
Abstract

As one of geographic information systems, MapGIS software has been widely applied in geological field in China, which not only has powerful function in map drawing but also provides the secondary development library for users. The forms of expression in geological map and the requirements of legend producing are introduced briefly in this paper. On the basis of components of MapGIS software and according to the map's features of airborne geophysics survey, the authors present the new solutions using C Sharp programming language for rapid maps clipping, legends producing and design and some other work. As a result, the artificial errors are reduced effectively and then the drawing efficiency is raised by multi-times. The key techniques and the codes about components of MapGIS are described in detail.

Keyword: secondary development of MapGIS; C Sharp; airborne geophysical exploration; map clipping; legend producing
0 引言

地质制图是地质工作的重要组成部分, 在开展多学科、多途径的地质科研、生产工作中, 自始至终都应用地质图表现研究成果[1]; 同时, 地质制图也是一项繁琐而又细致的工作。在图件设计、绘制过程中, 也常因人为误操作出现遗漏或错误, 导致后期修改工作量成倍增加。解决此类问题的唯一方法就是实现计算机自动化, 避免误操作的引入。

航空物探项目作业面积大, 需提交的图件种类、数量繁多。除全区图件外, 还需提交分幅图件及各种专题图件[2], 图件裁剪、图例制作是制图工作中必不可少的工作环节。国产MapGIS软件是目前国内应用范围最广的软件之一, 不仅绘图功能强大, 而且向用户提供了二次开发库[1]。但是MapGIS软件中提供“ 图形裁剪” 的模块, 功能单一, 无法拾取地图符号要素; 图例绘制同样较为繁琐, 尤其是面对数量巨大的图件, 工作量可想而知。因此, 只有利用MapGIS软件的二次开发, 实现图件批量绘制, 才能较好地解决此类问题。笔者针对航测项目的制图特点与工作流程, 基于MapGIS软件所提供的组件[3, 4], 使用C#语言编写了相应程序, 可自动实现图件批量裁剪、图例绘制及图面配置、地图修饰等工作; 同时在每个环节均有运行检查记录生成, 及时发现错误, 随时修改, 保证快速、准确地绘制图件。

1 地图类别与自动化制图
1.1 地图类别

航空物探项目中主要涉及的图件有地势图、地质图、地球物理图、成果解释图等, 基本表现手法主要有定点符号法、线状符号法、范围法、质底法、等值线法、剖面法等[5]。地质图是表示地壳表层的地质组成和构造特征的地图; 地球物理图是显示某种地球物理现象的地图[5, 6]; 成果解释图是在某个主题要求下, 表示一个或多个各自独立地质要素或物理现象的地图。一般情况下, 物探图中的底图除地理要素外, 还配有地质、矿产等要素。显然, 对于内容复杂、表现手法多样的地图, 图例设计与制作的工作量也将相应增加。笔者基于“ 黑龙江小兴安岭成矿带1:5万航空物探调查” 项目[7], 以内容较复杂的推断岩性构造图为例, 详述图件裁剪和图例生成的制作过程。

1.2 自动化制图

程序主要包括图件批量裁剪与地图符号提取、信息比对、图例预生成、图例检查与图例生成、图面配置等部分。

1)图件裁剪与地图符号提取在同一模块中实现。图件裁剪就是一次加载多个裁剪框, 对图件进行逐一裁剪; 地图符号提取就是提取裁剪结果图件中出现的地图符号、标志, 并记录裁剪框的位置信息。图例符号提取是按逻辑顺序逐一提取图例文件中的所有符号、标志及其释义, 并将其分类、存储。

2)将源图例信息和裁剪结果图件中出现的符号进行比对、筛选, 生成初始图例(MapGIS格式)和运行记录表(文本格式); 然后, 参照上述两个文件, 针对性的修改原始图件或图例文件。

3)重复执行图形裁剪、信息比对等步骤, 再次生成图例; 检查无误后, 依图式要求, 生成最终图例。

2 图形裁剪与地图符号提取

按符号所表示制图对象的空间分布状态分类, 地图符号可分为点状符号、线状符号和面状符号[5, 6, 7]。程序中, 地图符号提取就是针对上述分类在MapGIS文件中的点、线和区文件中, 利用图元参数差异进行识别、提取。此处包括图件符号提取和图例符号提取两部分, 工作流程见图1。

图1 图形和图例裁剪流程

2.1 图件地图符号提取

图件地图符号提取是指利用裁剪框进行图形批量裁剪, 同时记录、整理图件中的所有内容要素(点、线、区参数)、裁剪框位置(范围、裁剪框角度)和结果文件列表等。

MapGIS的二次开发环境、组件注册与引用等技术, 国内诸多文献已有详尽介绍[8, 9], 限于篇幅, 不再赘述。

1)文件压缩与存盘: MapGIS文件裁剪后, 结果文件内容变少, 但文件占用的物理空间和图元逻辑空间依然不变, 所以必须进行文件压缩存盘, “ 净化” 文件。以线文件为例, 代码如下:

if (pLinArea.Compact == false)

{

pLinArea.Compact = true;

pLinArea.Save(inLineFile);

}

2)图形裁剪:MapGIS软件中的图形裁剪包括两种:制图裁剪和拓扑裁剪[3, 10]。使用拓扑裁剪, 可保留图元属性。以区文件为例, 代码如下:

pClip.ClipReg(ClipLinArea, sRegArea, dRegArea, mRad, Enum_Clip_Type.gisOVLY_INCLIP); //拓扑裁剪

pClip.ClipRegGraph(ClipLinArea, sRegArea, dRegArea, mRad, Enum_Clip_Type.gisOVLY_INCLIP); //制图裁剪

3)符号提取:符号提取就是遍历MapGIS文件中的所有图元, 逐一拾取点、线、区文件中图元参数, 依照各自参数差异确定图中内容要素(表1)。最后筛选删除重复项, 将点、线、区信息分类标示、合并。

以区文件为例, 符号提取的主要代码如下:

for (int intK = 1; intK < pDesRegArea.count; intK++)

{

pDesRegArea.GetInfo(intK, out RegInfo); //获取区参数

myColor = RegInfo.clr; //区颜色

myPattern = RegInfo.patno; //填充图案

……

outInfo = myColor + "-" + myPattern + "-" + PatternHeight + "-" + PatternWidth + "-" + PatternColor;

ColorArray.Add(outInfo);

}

表1 图件中的符号要素示例

4)图件位置:图图面配置是指合理、恰当地安排地图平面构成的各项内容位置和大小。为此, 需要获取地图位置, 即坐标信息。位置信息包括两方面:①裁剪框在MapGIS软件中的范围; ②图件(裁剪框)水平夹角。

航测图件绘制一般采用大地坐标系和平面直角坐标系, 所以裁剪框也分为两种:①水平矩形框, 可利用MapGIS软件提供的GetRect方法直接提取坐标值, 水平夹角为0; ②国家标准图幅, 一般情况下, 图框呈扇形, 受中央经线设置的影响, 在MapGIS中的位置并不处于水平状态, 水平夹角(α )大小各异(图2)。由于MapGIS软件提供的方法只能获取裁剪框范围(图2中虚线), 此时需通过遍历线节点坐标集合, 计算出所有节点xy坐标值和, 极大值为裁剪框右上角点的实际坐标值, 极小值为裁剪框左下角点。然后, 转换为经纬度坐标, 推算出另外两个角点坐标值, 从而得到图框的水平夹角, 为下一步图饰整理提供依据。获取裁剪框范围坐标和节点坐标集合的代码如下:

D_Rect myRange = new D_Rect();

LinArea.GetRect(1, out myRange); //获取范围坐标

D_DotSet myXY = new D_DotSet(); //线节点坐标集合

myLinArea.Get(1, out myXY, out LinInfo23, out dimA); //获取线信息

int dotCount = myXY.count;

DataXY[] PosXYInfo23= new DataXY[dotCount];

for (int intI = 0; intI < myXY.count; intI++)// D_DotSet格式转换

{

PosXYInfo23[intI].x = Convert.ToDouble(myXY[intI].x.ToString("0.000"));

PosXYInfo23[intI].y = Convert.ToDouble(myXY[intI].y.ToString("0.000"));

}

最后, 将获取的图件位置信息以文本文件格式保存(表2)。

图2 裁剪框位置示意

表2 图件的位置信息示例
2.2 图例信息提取

原则上, 图例应包括地图中使用的所有符号或标志及其说明。图例中的符号、颜色、大小等要素必须与图内所代表的内容完全一致[5]。所以, 图例信息提取的目的是获取整幅图件的全部内容信息并保持其逻辑顺序。

为了完整地获取图中每一个内容要素, 图例在MapGIS中编辑完成后, 对每个图例单元要素进行逐一裁剪, 提取内容信息(图3)。裁剪结果(MapGIS的点、线、面)依照图例要素的逻辑顺序分别编号、存储; 提取内容信息则保存到文本文件中。图例裁剪结果和图例内容可视为全图数据库, 为分幅图件提供数据源。

图3 图例裁剪框示例

图例信息提取和上述图件信息提取的工作流程较为相似, 在此仅对其差异进行阐述。

1)裁剪框制作:在MapGIS软件中, 加载图例点、线、区文件, 新建线文件, 利用“ 阵列复制” 功能, 绘制系列矩形框, 确保一个矩形框包含一个图例要素单元(图3)。此文件可作为裁剪框文件。

2)分离裁剪框:在MapGIS中生成的系列矩形框, 处于同一个WL.线文件中。为提取图例单元信息, 必须依照位置按顺序分离矩形框, 分别存储。

3)图例信息提取:图例信息提取首先依照先后顺序给每个图例单元编号, 再提取各自内容信息, 此处除点、线、区的参数外, 还要提取地图符号、说明等文字(字符串)信息, 并记录图例要素的名称、文件路径等信息(表3)。

表3 图例信息要素示例
3 图例制作与图面配置

理论上, 图例设计需遵循以下4个原则:图例内容的完备性、图例符号的一致性、图例解释的明确性和图例排列的逻辑性[5]。在实际操作中, 图例绘制是根据获取图件、图例内容信息, 自动绘制图例, 然后根据图幅位置、角度, 将绘制或筛选的图例经旋转、平移至相应位置。

图例生成可分为两个阶段:图例预生成与检查、图例最终生成与图面配置。

3.1 图例预生成

图例预生成就是利用裁剪后的图幅内容信息与图例内容信息进行比对, 分别筛选、记录各图件内容(文本格式), 并转换为MapGIS格式点、线、面的过程(图4)。图例预生成的初始图例主要用于错误检查。共生成两个文件:一是MapGIS文件格式的初始图例, 可直观地检查错误; 二是运行记录表, 确定错误缘由、数量和所处位置。检查目的是修正源图件中的错误, 而不是单纯修改图例。

图4 图例预生成流程

3.2 图例检查

在图幅与图例之间的内容信息进行比对、筛选时, 主要有3种情况可能导致不能正确生成图例:①图例与图件间地图符号不统一, 如填充花纹尺寸会因填充面积做了适当调整; ②图中的同种符号具有不同含义, 如地质图中, 脉岩经常会用同种颜色表示; ③图件中的人为错误。

实践证明, 只要规范制图过程, 避免上述问题发生, 正确率可以达到100%。

3.3 最终图例生成

最终图例生成是依据修改后的各图件内容信息, 将事先裁剪好的图例单元(点、线、面)依顺序加载、合并, 依照图式要求[11]。移至合适位置上; 最后, 保存为MapGIS格式文件, 工作流程见图5。

图5 最终图例生成流程

1)图例单元合并

合并图例要素是此模块的核心。程序新建一个点、线、面文件, 然后将各图例单元(MapGIS格式)依照图例逻辑顺序依次加载, 合成最终的图例文件。以区文件为例, 主要代码如下:

RegArea GISRegArea = new RegArea(); //总图例文件-区

RegArea RegArea; //图例单元-区

……

// 读取图例单元文件列表

StreamReader sr4 = new StreamReader(workFileName);

while (!sr4.EndOfStream)

{

……

RegArea = new RegArea(); //区工作实例化

RegArea.Load(LegendFileName); //加载图例单元

RegArea.CopyAll(GISRegArea); //合并图例单元

RegArea.Clear(); //清除面工作区

RegArea = null;

……

}

GISRegArea.Transform(TransPara); //平移

GISRegArea.Save(outWPFile); //保存文件

2)图面配置

专题地图的图面配置, 不像普通地图, 尤其是地形图那样在很多方面执行规范要求, 必须由编图人员自行设计[6]。为使图面配置合理、视觉平衡, 设计图例时要充分考虑图例位置、大小、图例符号的逻辑顺序、密度和注记文字等[5], 图例形式一般分为横向排列和纵向排列两种。可通过旋转、平移, 将图例单元移至合适位置。代码如下:

workArea.Load(WorkLinFile); //加载点或线、面文件

Tran_Par TransPara = new Tran_Par(); //定义、实例化变换参数

TransPara.move_dx = moveXY.x;

TransPara.move_dy = moveXY.y;

TransPara.rotate_ang = Rotation;

TransPara.type[0] = Enum_Transform_Type.gisTRAN_ROTATE; //旋转

TransPara.type[1] = Enum_Transform_Type.gisTRAN_MOVE; //平移

TransPara.type[2] = Enum_Transform_Type.gisTRAN_NULL;

workArea.Transform(TransPara); //图形变换

workArea.Save(WorkLinFile); //保存文件

3)图例位置的定位

图例的位置、范围均以裁剪框位置作为参照。例如, 绘制纵向图例, 参考点为裁剪框右上点(图 6); 绘制横向图例, 参考点为裁剪框左下点。另外, 为了准确地进行图面配置, 还需精确计算图例框与裁剪框右边界的距离, 责任表、编图说明等内容所占的空间位置等等, 尽可能地减少手工操作。

图6 黑龙江省某幅岩性构造
1— 中— 新生界沉积岩; 2— 古生界沉积岩; 3— 酸性火山岩及其凝灰岩; 4— 中酸性火山岩及其凝灰岩; 5— 中基性火山岩及其凝灰岩; 6— 酸性侵入岩; 7— 中酸性侵入岩; 8— 中酸性侵入岩; 9— 酸性侵入岩; 10— 闪长岩; 11— 推断二级断裂及编号; 12— 推断三级断裂

至此, 自动化制图部分已基本完成。但从图6中还可看出, 图件四周边缘部分缺少岩性或断裂标注, 此时需人工检查, 进行标注的修补或位置调整。

4 地球物理图件的图例绘制

在航空物探测量项目中, 地球物理图常用表现手法有等值线法、剖面法等[11]。由于图例表现手法单一, 而且此类图件均为程序自动生成, 所以无需进行图例预生成、图例检查等步骤, 而其余步骤与上述图件大体相同, 可作为上述图例制作(地质图)的简化版。

4.1 等值线平面图的图例制作

等值线平面图的图例以色级的形式表现某个物理量的差异[6]。而MapGIS中也是依照物理量值的大小逻辑顺序生成图例色级。所以, 图例提取只要分别遍历区文件和点文件, 很容易获取颜色编码和标注。然后进行信息比对, 获取该图件物理量的变化范围, 重新设计一个大小适合的色级及注记, 根据裁剪框位置, 旋转、平移在图中指定位置。

4.2 剖面平面图的图例制作

剖面平面图的图例常用坐标轴形式表示某个物理量的垂向变化[5]。一般情况下, 除横、纵比例尺外, 图例形式相对固定, 一般不随图中的内容而发生变化。事先, 手工绘制一个大小合适的图例, 旋转、平移到合适位置上即可。

5 结束语

在地质、物探工作中, 提交一套美观、准确的图件, 需付出大量的辛勤劳动。为降低劳动强度, 提高制图的准确性, 设计了此程序, 可充分利用现有图例进行图件裁剪和图例快速制作。在“ 黑龙江小兴安岭成矿带1:5万航空物探调查” 和“ 内蒙古自治区鄂温克族自治旗— 莫力达瓦达斡尔族自治旗一带1:5万航空磁测、伽玛能谱测量” 等航空物探项目中得到广泛应用, 取得了较好的应用效果。该程序主要特点包括:①裁剪MapGIS文件的同时, 提取图中的地图符号; ②结合文本格式的运行记录表, 查找源MapGIS文件中的错误, 针对性较强, 更重要的是可检查、修改源图件中的错误; ③多模块设计, 分段运行, 实时监控可能出现的错误, 避免重复操作; ④根据项目设计需求, 可灵活、准确地进行图面配置。

The authors have declared that no competing interests exist.

参考文献
[1] 黎华, 崔振昂, 李方林. MapGIS在地质学中的应用[J]. 物化探计算技术, 2003, 25(1): 50-53. [本文引用:2]
[2] 吴高微, 闫红雨. 基于MapGIS K9航空物探图框绘制软件开发[J]. 物探与化探, 2016, 38(3): 607-609. [本文引用:1]
[3] 中地软件丛书编委会. MapGis组件开发手册[M]. 武汉: 武汉中地信息工程有限公司, 2002. [本文引用:2]
[4] 周顺平, 王海龙. 基于 MAPGIS 组件的二次开发[J]. 地球科学: 中国地质大学学报, 2002, 27(3): 285-288 [本文引用:1]
[5] 吴金华, 杨瑾. 地图学[M]. 北京: 地质出版社, 2011. [本文引用:7]
[6] 王琪, 奚大平, 林伟华, . 地图概论[M]. 武汉: 中国地质大学出版社, 2002. [本文引用:4]
[7] 李素岐, 沈正新, 王利民, . 黑龙江小兴安岭成矿带1: 5万航空物探调查成果报告[R]. 核工业航测遥感中心, 2015. [本文引用:2]
[8] 李海洋, 王丽英, 孙贵博. MAPGIS图形自动生成技术[J]. 矿山测量, 2009(3): 4-7. [本文引用:1]
[9] 中地软件丛书编委会. MapGis二次开发培训教程[M]. 武汉: 武汉中地信息工程有限公司, 2001. [本文引用:1]
[10] 吴信才. MAPGIS地理信息系统[M]. 北京: 电子工业出版社, 2004. [本文引用:1]
[11] 范正国, 黄旭钊、熊盛青, 等. 磁测资料应用技术要求[M]. 北京: 地质出版社, 2010. [本文引用:2]
[12] 沈正新, 蔡文军, 田宇, . 内蒙古自治区鄂温克族自治旗—莫力达瓦达斡尔族自治旗一带1: 5万航空磁法、伽玛能谱测量成果报告[R]. 核工业航测遥感中心, 2015. [本文引用:1]
[13] 王红梅. Mapgis 在数字地图制图方面的初步研究[J]. 测绘通报, 2000(6): 10-12, 19. [本文引用:1]
[14] 姜明丽, 鲁孟胜. Mapgis在水文地质制图中的应用[J]. 煤田地质与勘探, 1999, 27(s): 34-36. [本文引用:1]
[15] 郑贵洲. 地理信息系统(gis)在地质学中的应用[J]. 地球科学, 1998, 23(4): 28-31. [本文引用:1]
[16] 王丽瑛, 李秀玲, 陈文杰. Mapgis在地面沉降研究中的应用[J]. 中国地质灾害与防治学报, 1998, 9(2): 129-131. [本文引用:1]
[17] 高惠瑛, 冯启明. Mapgis在沈阳市地震影响信息系统中的应用[J]. 世界地震工程, 1999, 15(4): 5-7. [本文引用:1]
[18] 袁艳斌, 韩志军, 刘刚, . 基于gis的1: 5万区调野外空间数据快速采集技术[J]. 地球科学进展, 2000, 15(3): 348-350. [本文引用:1]