唐桂彬,周 波,刘 帅

(1.杨凌职业技术学院,陕西 杨凌712100;2.红河学院 工学院,云南 蒙自 661100)

MapGIS是面向国土、地质、水利水电、岩土、测绘等行业的国产地理信息系统优选平台。但是MapGIS在拓扑造区时对区块的处理采取随机赋色的方式,想要将区块分类显示,需要给每个区块逐一修改图形参数,这样使得操作过程繁琐而且容易出错[1-5]。作者经过实践,摸索出一种快速分类赋色的新方法,这种方法主要是通过修改MapGIS明码文件,同时结合Excel的VLOOKUP函数及VBA编程语言来实现。

1 MapGIS区明码文件结构

用MapGIS软件的文件转换功能可生成一种交换文件,可以通过Excel或是记事本对它进行数据读取[6-7],这种文件就是 MapGIS的明码文件。点、线、区的明码文件都是由文件头和数据区组成。而区明码文件的结构最为复杂,除去文件头之外,它总体上划分成3部分,分别为弧段数据、节点数据和区数据[8-9]。表1给出了区明码文件中弧段、节点和区的文件结构。

从表1中可知,各区块的填充颜色由区参数信息行的首行第1个数据项决定,其数值代表着具体的颜色号。而这个值则是由软件在拓扑造区的时候随机赋给的,所以各个区块的填充颜色基本上不一样,要使得属性值一样的区块能够按照同一种颜色填充,就必须先将各区的属性信息引入到区明码文件中,建立区图形参数与其属性值的一一对应关系。

2 自动分类赋色的实现

图1为某区域1∶1万土地利用现状图,且已经完成了拓扑造区、图斑注记、属性录入和属性检查等,其已经包含一个“地类码”属性项。由图1可以看出地类码相同(如52)的区块显示不同的随机颜色。

表1 MapGIS的区明码文件结构

图1 生成随机色的土地利用现状图

2.1 建色表及生成Label点

1)在“区颜色”表中建立地类码与颜色号的关系,即一个地类码只与一个的颜色值匹配,且分别将地类码和颜色号置于表内第1列和第2列,其中,地类码字段将会起到一个分类索引的作用。

2)在 MapGIS的区明码文件中,除了区块的ID、面积和周长外,没有记录其他的属性信息,同样地,经过分类赋色处理后新生成的明码文件里面也只有默认的3个属性项。所以在编辑明码文件之前,必须用原区文件来创建一个Label点,把已经录好的属性数据提取并保存下来,方便后面给新的区文件赋属性。

2.2 获取明码文件和属性表

1)导出区明码文件。进入MAPGIS的“文件转换”子系统,利用其中的“MapGIS明码格式”功能项,输出后缀名为WAP的区明码文件。

2)导出属性表文件。再进入MapGIS的“属性库管理”子系统,输出以“区属性.DBF”命名的区属性表文件。用Excel打开该文件,表中应包含ID、面积、周长和用于分类的属性字段(此例中分类字段为地类码)。

3)用Excel以逗号为分隔符号打开区明码文件。跳转至区参数信息的首行,即第一个区的起始记录位置,文件中A、I、J、K列分别表示区颜色、区ID号、面积和周长(见图2)。

2.3 VLOOKUP函数修改区颜色号

在区明码表中,选中第2行,并以K列(周长)为关键字进行数据的自动筛选,筛选条件为K列值非空,筛选出来的数据行将会以I列(ID号)升序排列,数据行数与原区文件中的图斑个数一致,即一行数据代表对一个区块的记录(见图3)。再将区明码表和区属性表对照,表内关于区块ID号、面积和周长的各条记录均相同。

图2 Excel中打开的区明码文件

图3 Excel中筛选出的数据

Excel中的VLOOKUP函数能够在表格或数组首列进行纵向查找,并且返回当前行中指定列序的数值。函数语法:VLOOKUP(查找值,查找区域,返回列序号,逻辑值)[8],具体参看表2。VLOOKUP函数可以将明码表分别与属性表和颜色表进行关联,先后引入地类码值和颜色值到明码表中,同时确保地类码与ID号、地类码与颜色号的对应。

先于表中找一列空白位置,比如L列,在此列被筛选出来的各个单元格内编写公式"=VLOOKUP(I∶I,区属性 .DBF!$A∶$D,4,0)",其中,第1项查找值为一整列数值,即区明码表中的I列(区ID号)值;第2项指定搜索范围控制在属性表的A、B、C、D 4列中,即在这个区域内寻找与I列匹配的同行数值;第3项给定列序号4,即取同行第4列值,这列值正好指代的是地类码;第4项设定逻辑值0。执行VLOOKUP函数后,地类码值即可被引入到区明码表中,如图4所示。

表2 VLOOKUP函数

接下来在区明码表的A列位置引入区颜色表中与地类码匹配的颜色号,因为A列值控制的是各个区块的填充颜色。类似地,在A列被筛选出来的各个单元格内编写另一公式"=VLOOKUP(L∶L,[区颜色.xls]Sheet1!$A∶$B,2,0)",这时各区块原来的颜色值被修改掉,取而代之的是从区颜色表中引进来的与地类码匹配的颜色号,而不同的区块有可能被赋上相同的颜色,这是由其地类码是否具有同一性决定的(见图5)。此处,第1项查找值也是一列数值,即区明码表中的L列(地类码)值;第2项指定搜索范围控制在颜色表的A、B列,即在这个区域内寻找与L列匹配的同行数值;第3项给定列序号2,即取同行第2列值,这列值正好指代的是颜色值;第4项仍然设定逻辑值0。

图4 地类码的引入

图5 区块颜色的修改

区块颜色修改完毕后,取消掉明码表中的自动筛选,使所有数据行全部展开,将颜色号所在的A列内容由公式转换为数值形式,并清空L列(地类码),将文件以CSV格式另存后再转换为DAT数据格式。

图6 VBA程序实现流程图

2.4 利用VBA程序实现自动区分类填色

为了进一步提高工作效率,在明确了手动分类填色基本方法后,可将整个过程编写成VBA程序代码,整个程序流程如图6所示。

程序先从区属性表中关联地类码,再从颜色表中引入与地类码对应的颜色号,实现区的自动赋色。下面给出了部分实现代码:

完成程序编写后,可创建Excel的个人宏工作簿,多次执行可对不同的区明码文件进行操作。图7给出了程序执行结果。

图7 程序运行结果

2.5 区明码文件的恢复

1)前述操作得到的是一个由CSV格式转换而来的DAT数据文件,区块分类赋色的结果仅保存在这个文件当中,而区明码文件的结构内容和导出时一样,没有发生改变,仍是标准的MapGIS区明码文件格式,其中的区块颜色也仍然是随机色。因此,用记事本同时打开区明码文件和DAT数据文件,用DAT文件中的区数据部分替换掉明码文件中的区数据部分,再删除与明码文件格式不符的多余逗号,保存并退出程序,这时得到才是进行过分类赋色处理的、格式标准的区明码文件。

2)在“文件转换”子系统中将区明码文件转换成区文件,导入到编辑子系统中后可以看到分类赋色的效果,如图8所示,同类型的地块显示的是同一种颜色。然而,在这个区文件中没有除默认字段外的其他任何属性,这就需要找到之前备份的Label点,通过合并Label点的方式来恢复属性数据。

3 结 论

1)该操作方法既能够达到图形对象分类符号化的目的,又能够保持原始区文件的完整性,使它不会因为连串的编辑处理而受到破坏。

图8 分类赋色后的土地利用现状图

2)该方法以MapGIS的交换文件作为编辑处理的对象,结合Excel的VLOOKUP函数及VBA编程语言,能达到使区块快速分类赋色的效果,不仅效率较高,而且不会出现遗漏图斑的情况,在某种程度上保证了作图的质量。特别是图幅数量较大,图件复杂程度较高时,利用VBA程序来实现自动分类填色更显得方便、准确。

3)MapGIS明码文件还可以应用于其他方面,比如面积的量算和统计、图形数据的提取及飞点的清除等,这对于解决一些实际问题是非常有帮助的。

[1]孙中原,李永树.基于MapGIS的土地储备信息系统的设计与实现[J].测绘工程,2012,21(4):78-81.

[2]刘美松,吴新林,王满春.充分利用MAPGIS的分析功能提高作图效率[J].贵州地质,1998,15(4):377-380.

[3]汪玉琼,赵传明.MAPGIS制图经验二则[J].地矿测绘,2003,19(2):39-40.

[4]孙国庆,温迎庆.基于 MAPGIS明码文件实现区域自动填充的实践[J].西部探矿工程,2007(7):97-98.

[5]张印廷,何苗,张晓棠,等.MAPGIS明码文件的研究与应用[J].科技资讯,2009(16):9.

[6]段青梅,龙文华,丁天才,等.基于 MAPGIS明码文件的绘图转换系统开发及应用[J].物探与化探,2005,29(1):50-52.

[7]王荣亮,曹代勇,戈连柱.基于 MAPGIS明码文件的CBM组件开发与应用[J].中国矿业大学学报,2002,31(4):392-395.

[8]王星捷.MapGIS点文件数据分析与读取实验[J].测绘科学,2013,38(1):112-115.

[9]叶志荣.MAPGIS点文件数据自动导入CARIS的研究[J].海洋测绘,2007,27(6):68-70.