作者简介: 龚红蕾(1966-),女,大专,工程师,从事地质、地球物理、地球化学勘查工作。E-mail:ljunzhang@sina.com
利用MapGIS组件技术,通过可视化语言Visual Basic编程完成了多元素化探剖面图的制作。利用此程序绘制几十条多元素剖面的数百条曲线费时仅几分钟,每条剖面均形成一个点(.wt)和线(.wl)文件,效率大为提高。
On the basis of MapGIS component technology, the Visual Basic programming multielement geochemical profile map can be drawn quickly. With this program, hundreds of multielement profile curves are drawn in a few minutes, and each profile could form a point file and a line file. Therefore, the efficiency is greatly improved.
在矿产地质调查及各类物化探异常查证工作中, 化探剖面是最常用的技术手段之一。一个勘查项目往往要完成几十条化探剖面, 每个剖面上一般都有十几种元素, 因此需制作的元素剖面曲线多达数百条。以往工作中化探剖面图主要是利用美国Golden公司的Grapher绘图软件制作, 该软件是一款非常优秀的剖面图制作软件, 广泛应用于各个科技领域。一个地区的化探剖面很多参数是相同的, 比如同种元素每厘米代表的元素含量值、X和Y轴刻度、曲线颜色和线型等, 通常会将一组共生元素绘制在一条剖面上, 采用Grapher制作时都要一一输入, 影响工作效率。另外由于地勘单位在完成图件制作后, 为了进行资料汇交或与其他成果进行套合对比, 通常还要将Grapher格式的文件转换成MapGIS格式。而Grapher不能直接转换为MapGIS格式, 需先转换成AutoCAD的DXF文件, 再转换成MapGIS文件[1], 操作较繁琐。笔者利用MapGIS组件技术, 通过可视化语言Visual Basic编程完成了多元素化探剖面图的制作。生产实践表明, 利用此程序绘制几十条多元素剖面的数百条曲线费时仅几分钟, 效率大为提高。本程序也可应用于重磁、激电等物化探综合剖面图的制作。
考虑到目前化探样品试验室测试结果都以Excel电子表格形式提供给用户, 因此本程序将直接读取Excel电子表格。通过在Visual Basic中引用MapGIS的组件[2, 3, 4] MapGIS BasCom1 1.0 Type Library, 调用MapGIS制图功能, 实现Visual Basic编程使用Excel电子表格, 并绘制化探元素剖面图。步骤如下:
1) 从Visual Basic的Project(工程)菜单中选择References(引用), 选中复选框中的MapGIS BasCom1 1.0 Type Library和Microsoft Excel 11.0 Object Library类型库[5, 6, 7]。
2) 声明和创建对象, 如:
Dim appexcel As Object '声明Excel应用程序对象
Dim datebook As Object '声明原始数据工作簿对象
Dim datesheet As Object '声明原始数据工作表对象
Dim pntObj As New PntArea '声明和创建MapGIS点工作区
Dim PntInfo As New Pnt_Info '声明和创建MapGIS点信息对象
Dim linObj As New LinArea '声明和创建MapGIS线工作区
Dim LinInfo As New Lin_Info '声明和创建MapGIS线信息对象
Set appexcel = CreateObject(″excel.application″) '创建Excel应用程序对象
Set datebook = appexcel.Workbooks.Open(ysfile) '打开原始数据工作簿ysfile
Worksheets(1).Activate '设置当前表为第一张表
Set datesheet = ActiveCell.CurrentRegion.Cells '设置datesheet
3) 使用对象。如取点工作区中点对象的数目, 读Excel的一个单元:
Dim n As Long '声明一个长整型变量n
Dim x As Double '声明一个双精度型变量x
n=PntObj.count '取点工作区中点对象的数目
x=datesheet.Cells(i, j) '取Excel表中第i行j列的数据
首先读取原始数据及绘制参数文件, 然后分别绘制X、Y轴及刻度, 绘制曲线, 并通过两个循环实现多元素多剖面的绘制, 流程见图1。程序中根据给定的“ 分组” 值, 自动把曲线绘制在相应的元素组中。
将本程序的主要绘制参数保存在一个Excel电子表格中, 图2是存放格式的一个实例, 可根据具体情况进行调整。程序开始时将此表读入数组, 以供需要时自动调用相关的绘制参数。表中“ 单位” 是绘Y轴时标注的元素含量单位; “ 分组” 是根据元素的共生组合情况给每一个XY剖面内所包含元素的分组号, 一个组内包含元素一般不超过5个, 太多将影响观察效果。本表中14个元素共分3组:Au、Ag、Cu、Pb、Zn, Cd、As、Sb、Hg及Mn、Bi、W、Mo、Sn, 绘制时同一组元素共用一对XY轴, 其中第一组绘制在最下面, 第二组位于第一组之上, 以此类推。“ 数据间隔” 是Y轴方向每厘米代表的元素含量; “ 元素颜色” 是元素的曲线、Y轴刻度符号、Y轴顶部元素及单位符号的MapGIS颜色号; “ 线型” 是元素曲线的MapGIS线型号。
以(x0, y0)为起点, 按指定比例尺和剖面最大点号绘制水平轴线。
PntInfo.iclr = 1 'X轴刻度标注字符的颜色
posset.Append x0, y0 'posset为点集对象
x=x0+(pend-pstar)* xxishu 'xxishu为与比例尺有关的一个系数
posset.Append x, y0
linObj.Append posset, lininfo_zhou '绘制X轴, lininfo_zhou为轴线参数
绘制X轴时需要处理的是次刻度和主刻度, 程序中安排次刻度线长为1.5 mm、主刻度为2 mm, 在主刻度上标注刻度值。
以下是以次刻度间隔是4、主刻度间隔是20为例的代码。该代码自动处理了开始点号不在主、次刻度上的情况, 通用性强。
kd00 = pstar Mod 4 '刻度间隔为4
If kd00 < > 0 Then
kd00 = pstar + (4 - kd00) '使起始小刻度位置
End If
k = Int((pend - pstar) / 4) '刻度个数
For i = 0 To k
xkd = pstar + i * 4
x = (xkd - pstar) * xxishu + x0
posset.Append x, y0
If xkd Mod 20 = 0 Then '大刻度间隔为20
y = y0 - 2 '大刻度处理, 刻度长2mm
ppos.x = x - 4
ppos.y = y - 4
strkd = Str(xkd) '刻度符号
lRes = pntObj.Append(ppos, strkd, PntInfo) '标刻度符号
Else
y = y0 - 1.5 '小刻度处理, 刻度长1.5mm
End If
posset.Append x, y
linObj.Append posset, lininfo_zhou
posset.RemoveAll
Next i
以(x0, y0)为起点, 按指定高度绘制竖直轴线。
posset.Append x0, y0
y = 60 + y0 'y轴高度为6cm
posset.Append x0, y
linObj.Append posset, lininfo_zhou
Y轴刻度以0开始, 主、此刻度均按元素含量以固定间隔绘制, 处理较为简单, 代码可参考X轴。
由于每一个XY轴剖面内要绘制多个元素, 每一元素的含量间隔又不一致, 所以每绘制一个元素的曲线, 在Y轴位置左移1.2 cm标注该元素的主刻度值, 颜色与剖面曲线元素一致:
ppos.x = x0 - 12 * yuansu(cs(1, j)) '每一元素右偏移12mm写含量值
For i = 0 To 6 '6个数据间隔
ppos.y = 10 * i - 1 + y0
mak = i * yxishu * 10
strkd = Str(mak)
PntInfo.iclr = cs(3, j) '字符颜色
lRes = pntObj.Append(ppos, strkd, PntInfo)
Next i
ppos.y = ppos.y + 3 '元素符号及单位
strkd = csstr(1, j) + csstr(2, j) '元素符号及单位
lRes = pntObj.Append(ppos, strkd, PntInfo) '写元素符号及单位
按给定的X轴比例尺及Y轴数据间隔绘制:
LinInfo.lclr = llincol '设置曲线的MapGIS颜色
LinInfo.ltp = llintpy '设置曲线的MapGIS线型
LinInfo.layer = llinceng '设置曲线的MapGIS图层
For p = rrown To nn '从数据表第rrown行开始
xx = datesheet.Cells(p, llx) '第llx列为剖面的点号
yy = datesheet.Cells(p, lly) '第lly列为剖面的某元素的含量
xx = (xx - ppstar) * xxxishu + xx0
yy = yy / yyxishu + yy0
posset.Append xx, yy
Next p
linObj.Append posset, LinInfo
1) 参数:按图2的格式进行准备, 输入每个元素的单位、分组、数据间隔、颜色、线型。此表为Excel文件, 元素排列顺序要与原始数据文件一致。
2) 原始数据:原始数据存放在Excel工作薄的第一个工作表中, 数据格式如下:
第一行为字段名:剖面号、点号、元素1、元素2、……、元素m;
以下各行为相应字段的数据, 剖面号、点号均为整型数, 所有剖面数据放在一个Excel文件中。文件在使用前先对元素数据进行重新排序, 排序方式为主关键字为剖面号, 升序; 次关键字为点号, 升序。
图4是河北省北部坝上地区某工区的计算实例。该区为第四系覆盖, 地势平缓, 覆盖层厚度一般在几米至20 m之间。区内偶有露头为新太古界红旗营子群地层, 岩性主要有浅粒岩、黑云斜长片麻岩等。20世纪80年代1:20万区域化探发现Au、Ag、Pb、Zn、Bi等组合异常; 90年代用激电中梯方法进行检查发现低缓激电异常, 走向近东西, 东侧转为北西, 异常宽50~100 m, 长300 m, 视极化率2.5%~2.8%, 强度较低。2013年在该区进行找矿方法试验, 为确定激电异常的矿化特征, 在异常上布置一条南北向化探剖面, 点距40 m, 采用浅层钻取样方法采取基岩面上部风化残留物, 分析元素为Au、Ag、Cu、Pb、Zn、As、Hg、Sb、Cd、W、Sn、Bi、Mo、Mn共14种元素。由本程序绘制的多元素剖面(图4)可见在剖面204点至224点出现明显的Au、As、Cd、Hg、Bi、Mo等异常, 其中Au异常最为明显, 推断异常是以Au为主的矿化引起, 为今后找矿工作提供了依据。
利用MapGIS组件技术, 通过引用MapGIS BasCom1 1.0 Type Library, 在Visual Basic中搭建了MapGIS的二次开发环境。在Visual Basic中运用二重循环对每一个剖面每一种元素绘制曲线, 实现了多剖面、多元素地球化学剖面图的绘制。实践证明该程序实用性较强, 可大幅度提高工作效率, 并可有效减少人为因素带来的差错。该程序通过修改参数表也可实现对重、磁、电等多参数曲线的绘制。
The authors have declared that no competing interests exist.
[1] |
|
[2] |
|
[3] |
|
[4] |
|
[5] |
|
[6] |
|
[7] |
|
[8] |
|
[9] |
|
[10] |
|
[11] |
|
[12] |
|
[13] |
|
[14] |
|
[15] |
|
[16] |
|