论文导读:在此基础上以MapObjects为平台将地质图各图层读取并转换为ESRI的Shape格式予以显示。进而关联生产数据库数据绘制柱状图、饼状图、综合柱状图等动态分析图。当地质底图为位图格式时,通过矢量化方式绘制相应的地质要素Shape文件同样可以实现井点图层渲染。
关键词:综合柱状图,MapObjects,渲染,WindowsAPI
1. 引言
油田生产动态数据是一个油藏地下状况的真实反映,在油田勘探开发过程中,应用动态分析软件充分挖掘动态数据蕴含信息,可以有效提高油气田动态分析研究水平优化油气生产监控管理[1]。目前,Peoffice、OFM等主流软件都涵盖了油藏动态分析功能。但他们多数通过在列表中选择单元或单井方式进行查询、分析、计算、预测,并以各种曲线和表格显示结果。其缺点是没有很好地将油田动态和油藏静态结合起来,导致动态分析结果缺乏地质信息或地面信息,如井位、断层等。而带有地质底图的平面动态图对油藏工程师来说是十分重要的,目前这部分工作仍然依靠技术人员手工完成。他们因需在地质图上绘制油藏平面生产现状图、水淹图而耗费了大量的时间和精力[3]。
为了充分利用现有的地质成果图(如构造井位图、小层平面图、沉积相带图),实现基于地质信息的油藏动态分析,我们做了如下设计。首先制定了AutoCaD地质图绘制规范(绝大多数地质图由AutoCaD绘制并以DXF格式存储),将各地质要素分图层绘制,即分别存储为油井、水井、断层、尖灭线、油水分界线等图层并以相应的地质要素名称命名。在此基础上以MapObjects为平台将地质图各图层读取并转换为ESRI的Shape格式予以显示。进而关联生产数据库数据绘制柱状图、饼状图、综合柱状图等动态分析图。发表论文。当地质底图为位图格式时,通过矢量化方式绘制相应的地质要素Shape文件同样可以实现井点图层渲染。动态分析图中综合柱状图是一种较为特殊的图形组合,在MapObjects提供的渲染方式中虽不能直接实现,但其图表自定义渲染接口为实现这一功能提供了可能,这也是本文讨论的重点。
2. MapObjdects简介
MapObjects是ESRI公司提供的一组供应用开发人员使用的制图与GIS功能组件,由一个OLE控件和超过45个可编程OLE对象组成。它不是面向最终用户而是专门为开发人员提供的。利用MapObjects,开发人员可以实现图层的操作和管理、图层渲染、数据查询功能、简单空间分析及空间数据库访问等功能。下面讨论MapObjects提供的图表渲染及组渲染方式[2],如下:
(1)图表渲染(ChartRenderer)
ChartRenderer对象提供的属性和方法,可以利用饼图(Pie Chart)或柱图(Bar Chart)来描述特征的多个参数。还可以用显示图表的大小来表示特征值的多少。
表2 属性及意义说明
属性 |
说明 |
ChartType |
类型为饼图或柱图或自定图形(MOCustom) |
ShowOutline |
是否显示图表的轮廓线 |
Field属性数组 |
图表来源字段 |
Color属性数组 |
采用的颜色 |
FieldCount |
数组的维数。 |
BarHeight、BarWidth |
图表的行和列 |
NormalizationField |
使图表标准化 |
SizeField、MinPieSize、MaxPieSize |
控制图表的大小 |
NullValue、NoNullValue |
处理空值 |
(2)组渲染(GroupRenderer)
GroupRenderer并不是一种独立的渲染方式,它实现了上述几种渲染方式组合渲染。使用时先定义一个组渲染对象(GroupRend),再定义前面介绍的方法某种渲染方式(RenderI),用如下语句实现向组内添加渲染方式并完成组渲染。
GroupRend.AddRenderI
MapLayer.Renderer=GroupRend
Map1.Refresh
3. 自定义绘图接口
上一部分介绍了用到的Mapobjects的两种渲染方式,下面我们着力介绍图表渲染中自定义绘图接口。要实现自定义图表渲染方式,首先需要定义如同柱状图或饼状图的渲染类。如在vb6.0中定义一个名为clsBar的柱状图渲染类,则该类使用方法如下:
Dim ChartSymAs New clsBar
Dim pChartRendererAs New MapObjects2.ChartRenderer
WithpChartRenderer
.FieldCount = 1 渲染的字段个数据为1
.Field(0) = 'LJCYL' 渲染的字段名称为LJCYL
.Color(0) = moBlue 颜色为蓝色
.ChartType = moCustom 渲染类型为自定义的
End With
pChartRenderer.CustomChart= ChartSym
SetMapLayer.Renderer = pChartRenderer
Map1.Refresh
上述代码展示了如何用自定义方式实现图表渲染,其前提是实现了clsBar类。下面我们就重点讲述如何实现渲染类clsBar。在mapobjects中为自定义渲染类预留三个成员函数作为接口,分别为SetupDC、Draw和ResetDC。如果使用自定义方式实现了图层渲染,当刷新该图层时,即在BeforeLayerDraw事件之后,在AfterLayerDraw事件之前系统渲染图层。渲染对象的SetupDC方法首先被调用。用来改写设备描述表,选定画笔、画刷。之后,系统调用渲染对象的Draw方法,采用选定设备依次绘制当前渲染图层各个图元的渲染图形。当所有对象绘制完成之后,ResetDC方法被调用,用来恢复设备描述表。这三个函数的命名及参数都是mapobjects规定的,不能更改。
SetupDC函数原型为:Private SubICustomChart_SetupDC(ByVal Map As Object, ByVal MapLayer As Object, ByValChartRenderer As Object, ByVal hdc As Long, ByVal dpi As Double) 其功能是设置设备描述表并保存系统原有设置,以便在绘图完毕予以恢复设备描述表。因此函数中我们需要使用CreatePen、CreateSolidBrush、SelectObject等Windows API函数。代码如下:
1/3 1 2 3 下一页 尾页 |