基于SVG格式进行MapGIS图形转换
1.
2.
The graphics conversion of MapGIS format based on SVG
1.
2.
收稿日期: 2017-12-13 修回日期: 2018-05-22 网络出版日期: 2018-10-05
Received: 2017-12-13 Revised: 2018-05-22 Online: 2018-10-05
作者简介 About authors
杨金政(1982-),男,硕士,工程师,主要从事航空、地面物探数据处理与解释工作。Email:149120592@qq.com 。
图件绘制是开展多学科、多途径的地质科学研究的重要手段之一。文中提出利用SVG作为纽带,进行不同成图软件间的图形转换的解决方案;介绍了SVG图元要素的构成与属性,并与MapGis图元进行了比对,着重对不同颜色空间的转换与对比方法和SVG与MapGis格式之间的相互转换过程进行了详细阐述,并提供了Python部分实现代码。实践表明,基于SVG格式进行图形转换,具有通用性强、效率高等优点。
关键词:
Map drawing is one of the important means for researching geological science with multidisciplinary and multipurpose.It has drawn up a solution that the graphics exchange is carried out between the different kinds of mapping software used by SVG.Structures and attributes of graphic entities are described in comparison with MapGIS.Conversion and comparison between various color spaces and processing between SVG and MapGis are described in detail.The related codes of Python are partly presented.Practice shows that the conversion method has the advantages of higher precision,strong commonality and higher efficiency.
Keywords:
本文引用格式
杨金政, 邱崇涛, 陈鹏.
YANG Jin-Zheng, QIU Chong-Tao, CHEN Peng.
0 引言
在地质与物化探研究工作中,图件绘制是有机组成部分,在开展多学科、多途径的地质科学研究中,都要运用地图表达研究成果[1]。随着计算机技术的迅猛发展,各种商业绘图软件迅速面世,计算机绘图已在地质领域得到了广泛应用。国外较著名的数据处理与成图软件包括Montaj Oasis、MapInfo、Surfer和Grapher等,而国内最为常用的是MapGis地理信息系统。
MapGis是武汉中地信息工程有限公司研制的具有自主版权的大型基础地理信息系统软件平台,包括数据采集、编辑整饰、图像配准、图库管理、空间分析、图形输出等内容的国土资源行业的通用软件[2],是国内地质、物探领域中应用最广泛的软件之一。MapGis虽然对AutoCAD、MapInfo和ArcGIS等软件提供了的DXF、MIF和SHAPE等格式的导入、输出,但对Surfer、Grapher等许多软件并未提供专门的转换模块。MapGis格式转换方法大多使用DXF、MIF和SHP 格式[3,4,5,6],以手工操作为主,也有利用MIF格式进行编程处理[7]。笔者从工作实践中发现,上述方法操作对于图面单一、图元数量较少的文件效果较好,但对于大文件且内容复杂等图形或图元则无法进行有效转换,甚至无法识别,如字符串会以图形形式出现并有丢失现象、转换的颜色偏差明显致使后期编辑工作量较大。笔者以SVG格式作为纽带,利用Python语言编写格式转换程序,从根本上解决了文字、颜色等问题,不受文件大小、内容的限制,简化了转换环节,减少后期编辑工作,适用于多个不同软件间的图形转换。
1 SVG简介
由Surfer、Montaj Oasis软件中导出的SVG格式,图元要素并未涉及所有的SVG图元,但文件结构是类似的,主要包括三部分:文件头、默认参数和图元信息。图元要素主要类型包括:path(路径)、polygon(区)、polyline(线)、text(注释)和pattern(图案)等,以<g>和 </g>标示;其中,Surfer绘制面元时,使用的是path图元,而Montaj Oasis使用的是polygon图元。此处列举了与MapGis转换有关的部分SVG图元属性(表1)。
表1 SVG中的部分图元属性示例表
属性 | path(路径) | polygon(区) | polyline(线) | text(注释) | ||
---|---|---|---|---|---|---|
stroke颜色 | none(默认值) “Hex颜色值” | none(默认值) “Hex颜色值” | none(默认值) “Hex颜色值” | none(默认值) | ||
fill填充色 | “Hex颜色值” | “Hex颜色值” | none | none“Hex颜色值” | ||
stroke-width宽度 | “数值” | “数值” | “数值” | |||
位置坐标 | d=“x,y坐标值” | points=“x,y坐标值” | points=“x,y坐标值” | x=“x坐标值” y=“y坐标值” | ||
stroke-dasharray虚线 | “数值, 数值” | |||||
font-family注释字体 | 字体名称,如:“Arial” “宋体” | |||||
font-size注释大小 | “数值” | |||||
rotate注释角度 | 角度值(°) |
注:“数值”、“坐标值”单位为Surfer中设置的单位(厘米或英寸)
从表1可看出:SVG颜色系统、线型、注释字体、计量单位与MapGis的属性设置存有差异,而颜色可通过RGB颜色空间进行转换处理。
2 Python简介
Python是一种面向对象的解释性的跨平台高级计算机语言,具有语法简单、可移植性强的特点,所以程序编写具有耗时少、程序短、易于阅读的优点。同时,它还是一种通用性语言并具有极为丰富的类库,可应用于数据库、多媒体、科学计算、网络、游戏等诸多领域。正因为Python具有强大的科学计算、绘图功能以及具有丰富的地图绘制、地理空间数据的处理与转换类库[10],最著名arcGIS地理信息系统也以它作为其脚本语言,本程序中就引用了NumPy(数值计算)、Shapely(二维图形处理)、colorMath(颜色计算)、SVGWrite(SVG的写入)等第三方类库。
3 图元要素分析
Surfer是美国Golden Software公司出品的一套功能强大的2D、3D成图软件,拥有多达12种数据网格化方法,可识别多达30种图文件格式,另外还可完成多种形式滤波和自定义滤波,以及相关的数据统计、数据分析等工作[3],具有成图迅速,图面美观,细节丰富的特点,广泛应用于地质、物探等工作中。本节以Surfer为例,进行图元要素的分析。
由于MapGis和Surfer之间的线型库、图案库、颜色值、字体等存有一系列差异,所以在图形转换时,使二者相互对应,尽可能地保持原貌或者利于编辑。
3.1 颜色
色彩是地图学中最基本的图形要素之一,是图形设计中需要特别注意的一种视觉变量,一方面是由于它具有美学上的优点,更重要的是它具有增加清晰性的效果[11]。
3.1.1 MapGis颜色值的输出
SVG采用的是16进制Hex颜色值,Surfer采用的RGB颜色值,而MapGis则以CMYK颜色值为基础,建立自己的专用颜色库。为了解决色彩统一的问题,必须建一个颜色值索引表,记录MapGis颜色值对应的Hex、RGB颜色值(表2)。大多数情况下,MapGis颜色库中颜色值均有重复现象,可通过Hex颜色值的比对去除重复项,提高颜色配比速度。
表2 不同格式颜色值的对比
MapGis专用颜色值 | Hex颜色值 | RGB颜色值 |
---|---|---|
1 | #000000 | (0,0,0) |
2 | #00ffff | (0,255,255) |
3 | #ff00ff | (255,0,255) |
4 | #ffff00 | (255,255,0) |
5 | #0000ff | (0,0,255) |
6 | #ff0000 | (255,0,0) |
7 | #00ff00 | (0,255,0) |
9 | #ffffff | (255,255,255) |
… | … | … |
3.1.2 MapGis色库的定义
CMYK是印刷油墨形成的颜色空间,色彩不如RGB色丰富饱满;从理论上讲,当RGB与CMYK颜色空间转换时,无法做到绝对的一一对应,不同方法间往往存有一定的色彩差异。设置MapGis的色库首先要求得CMYK值,可采用以下两种方法:① 公式法;② 借助PhotoShop软件。
RGB与CMYK转换方法和计算公式参照文献[11]。Python程序代码如下:
def rgbtocmyk(myRGB):
#myRGB 类型为tuple 或list
r1,g1,b1=(x/255.0 for x in myRGB)
K=1-max(r1,g1,b1)
C=(1-r1-K)/(1-K)
M=(1-g1-K)/(1-K)
Y=(1-b1-K)/(1-K)
return (C,M,Y,K)
通过PhotoShop软件进行RGB与CMYK值的转换,可参见秦林江“Surfer与MapGis图件相互转换的几个问题”[4]。经计算验证,无论何种方法,当K值贡献较大时,转换结果与MapGis提供的值都将会存有一定色彩偏差。
3.2 图形尺寸
由于在Surfer中数据采用的单位是英寸或厘米,而在MapGis中默认单位是毫米, 所以在SVG图形中的坐标值、注释尺寸、线宽等数值注意单位换算,保证输出图形、图元尺寸与原图一致。
3.3 注释字体
MapGis中分为中文字体和西文字体,只包括宋体、仿宋、黑体、楷体等,分别用“1”、“2”、“3”、“4”数字表示;Surfer字体很丰富,也基本上可以原样将注释导出到SVG图形中。在MapGis转换时必须字体进行调整,并修改注释字体编号,如SVG图形的“宋体”改为“1”,“黑体”、“Arial”为“3”。MapGis、Surfer中注释角度单位为度,逆时针旋转为正;而SVG图形同样以度为单位,但顺时针旋转为正,转换时乘以-1即可。
3.4 填充图案、线型、符号
Surfer中导出SVG图形时若存有填充图案,大多为base64编码格式,在Python中有专门的模块可以解析,但在MapGis6.7中仍无法利用。由于MapGis花纹库大多由用户自定义产生,不同库间差别较大,而Surfer、SVG、Coredraw等中也未预设地质类花纹,所以笔者认为花纹应在格式转换后,再进行手工填充、编辑。
由Surfer中导出线型只有实线和虚线(包括颜色、线宽等)均可以很好的识别(虚线为一条整线),并可以导入MapGis中,而其他特殊线型,如铁路、公路,导出效果不佳。
符号在Surfer中称作“点(point)”,在MapGis中称作“子图”。由于二者使用的“图库”不同,所以无法直接转换。所以,需要建立一个子图对应表。
3.5 坐标系统
SVG的坐标系统的坐标原点位于左上角,X轴和笛卡尔坐标系的X轴相同,但是Y轴则与之相反[12],即SVG中的图形数值增加时其位置往下延伸,转换时可使用transform=“scale(1,-1)”参数进行变换。
4 由SVG转为MapGis格式
在我国,地质资料管理部门大多要求提交MapGis格式文件,各种标准、规范都是针对此格式制定的,因此需要把其他软件所制图件转换为MapGis格式进行归档。
4.1 计算流程及说明
以Surfer软件为例,SVG格式转换程序分为两个模块(图1)。
图1
4.1.1 颜色对应表的建立
MapGis启动时,需调用MapGis系统库(Slib);不同系统库对颜色、子图、线型的编号、样式均不同,所以在数据转换时,首先建立相应的对应表。由于不同软件中的线型、子图、花纹无法直接引用,所以此处只能建立颜色间的对应关系。具体操作步骤如下:
1)按顺序生成色表,仅保存面文件(wap格式);由于MapGis中“输出色表”未按颜色编号顺序生成,所以此时需要编写相应代码。
2)MapGis中图形处理—文件转换,加载面文件,导出MIF格式。
3)提取MIF格式文件的颜色值并换算RGB值,与MapGis颜色值对应。
MIF格式文件为24位10进制的RGB值,而SVG使用的是24位16进制的RGB值。此处需要两次转换,一是将10进制RGB数据转换为16进制RGB数据,二是将24位RGB数据转换为RGB值。代码如下:
def hex2rgb2(hexColor):
#24位RGB数据转换为RGB值
rgb=((hexColor>>16) & 0xff,
(hexColor>>8) & 0xff,
hexColor & 0xff)
return rgb
MapGis颜色库建立好后,重新生成颜色值索引表。
4.1.2 格式转换
MapGis软件提供了点、线、面的明码格式,在随机帮助中有详细说明,不再赘述。格式转换就是提取SVG文件中的图元信息,进行分类并改写为MapGis 的数据格式(wat、wal和wap)。
系统间颜色比对是程序的关键。HSV颜色空间由色调、饱和度、亮度三个分量构成;相对于RGB空间,能够非常直观的表达色彩的明暗、色调及鲜艳度,方便进行颜色对比。可通过两种HSV颜色值之间的欧几里得距离(欧式距离)判定其相似度。也就是说,将给定的SVG图元颜色在MapGis颜色库中搜索最近的颜色值,并给出相应的MapGis颜色编号,Python的实现代码如下:
def color_dist(c1,c2):
a2=rgb_to_hsv(*[x/255.0 for x in c2]) #将RGB颜色空间转换为HSV颜色空间
a1=rgb_to_hsv(*[x/255.0 for x in c1])
return sum((a-b)**2 for a, b in zip (a1, a2)) #返回两个颜色值的距离(的平方)
def min_color_diff (color_to_match, colorLibs):
# colorLibs为MapGis中的颜色集合(数组),color_to_match为目标颜色值
#返回最近的颜色值
return min((color_dist(color_to_match,test),colorLibs[test]) for test in colorLibs)
表3 颜色间对比及参数修改参照表(示例)
偏差值(diffVaule)/10-4 | MapGisCode | RGB | CMYK | 备注 |
---|---|---|---|---|
0.244283 | 3245 | (151,255,69) | (40.784,0.0,72.941,0.0) | |
0.0 | 1810 | (255,203,0) | (0.0,20.392,100.0,0.0) | |
0.207552 | 3235 | (87,146,255) | (65.882,42.745,0.0,0.0) | |
0.427186 | 1014 | (147,255,102) | (42.353,0.0,60.0,0.0) | |
20.0170 | 1301 | (255,79,0) | (0.0,69.02,100.0,0.0) | 需添加色值 |
4.2 转换效果
以江西省某地区音频大地电磁测量剖面及地质解释结果[13]为例来进行说明。
图2
图3是由程序直接转换的MagGis图件,图面未经任何修改。视觉上,两幅图的色彩差别完全可以忽略,渐进色的过渡也十分清晰、自然,未存在信息“缺失”现象。同时,也可看出推测断裂和构造裂隙带(虚线)以及部分字体存有一定差异。在MagGis编辑模块中,注释、虚线为一整体形式存在,均无字符、线段“拆解”现象,此时只需统改点、线参数等简单操作,便可获取一幅美观的MagGis最终图。
图3
5 由MapGis格式转为SVG
1) CoreldRAW 文件格式:cdr、位图;操作:打开填充工具(Fill Tool)→图样填充(Pattern Fill)→全色(Full color)或位图(Bitmap)→装入(Browse)→加载cdr或位图文件→编辑参数。
2) Surfer 文件格式:srf、位图等;操作①Surfer中拷贝图案→Fill→Clipboard→编辑参数;②打开Fill→File…→加载位图文件→编辑参数。
图4
由MapGis格式转为SVG的过程与上述转换类似。不同的是,为了保证MapGis点文件中子图的正确转换,还需建立相应的子图对照表,可由SVGWrite直接绘出。例如,“〇”子图用Circle图元给出,“◎”子图用两个同心Circle图元。
6 结论
由于不同软件在处理数据、绘图功能上有其各自的优势,在实际制图工作中,数据处理人员往往使用多种软件,保证高效地绘制出能真实反映出实际地质情况且图面美观的图件,但同时也因资料归档、印刷出版等要求,需提供相应的文件格式。而SVG图形作为一种通用的矢量格式,可以有效地进行这些软件的相互链接,并尽可能保持了图件原貌。当然,由于不同软件中含有特有的图元属性,给图形数据的转换造成了一定的困难。从生产实践来看,只有结合各自工作情况,利用编程手段,才能有针对性地进行图形转换。笔者借鉴了同行们大量的宝贵经验,编写了此转换程序,目的是尽可能地保持图件的原始面貌,以降低数据处理和制图工作量。当然,此程序虽在诸多项目中取得较好的效果,但仍需不断改进完善,例如子图库的完善、复杂线型识别与绘制等。
参考文献
VBA和MapGis在化探异常解释评价中的应用
[J].<p>化探异常下限的确定和图件的编制是化探异常解释评价工作最基础也是最关键的。笔者通过多年的探讨和实践,将VBA与MapGIS结合起来运用到化探异常解释评价工作中,取得了一些成效。文中,笔者以均值加2倍离差方法为例,探讨了运用VBA编程计算确定化探异常下限的基本思路和一般方法,详细介绍了离散点位数据图在MapGIS中直接成图的方法,指出了VBA与MapGIS在地矿行业中具有广阔的应用前景。</p>
Surfer与MapGis图件相互转换的几个问题
[J].<p>随着计算机技术在地质与地球物理工作中的广泛应用,计算机绘图也显得越发重要。为了提高制图质量和效率,在实际工作中经常需要结合使用几种软件。笔者从地质绘图的角度出发,阐述了Surfer与MapGIS的一些基本特点及其在地质领域中的应用,由此引出Surfer与MapGIS转换的必要,详述了Surfer中srf图形与MapGIS格式图件之间相互转换的基本方法及步骤,着重讨论了在转换过程中需要注意的问题,并提出了相应的解决方法。</p>
/
〈 |
|
〉 |
