基于MapObjects油藏动态分析图绘制方法(图文)_第1页
基于MapObjects油藏动态分析图绘制方法(图文)_第2页
基于MapObjects油藏动态分析图绘制方法(图文)_第3页
基于MapObjects油藏动态分析图绘制方法(图文)_第4页
基于MapObjects油藏动态分析图绘制方法(图文)_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于MapObjects油藏动态分析图绘制方法(图文)论文导读:在此根底上以MapObjects为平台将地质图各图层读取并转换为ESRI的Shape格式予以显示。进而关联生产数据库数据绘制柱状图、饼状图、综合柱状图等动态分析图。当地质底图为位图格式时,通过矢量化方式绘制相应的地质要素Shape文件同样可以实现井点图层渲染。关键词:综合柱状图,MapObjects,渲染,WindowsAPI1. 引言油田生产动态数据是一个油藏地下状况的真实反映,在油田勘探开发过程中,应用动态分析软件充分挖掘动态数据蕴含信息,可以有效提高油气田动态分析研究水平优化油气生产监控管理【1】。目前,Peoffice、O

2、FM等主流软件都涵盖了油藏动态分析功能。但他们多数通过在列表中选择单元或单井方式进行查询、分析、计算、预测,并以各种曲线和表格显示结果。其缺点是没有很好地将油田动态和油藏静态结合起来,导致动态分析结果缺乏地质信息或地面信息,如井位、断层等。而带有地质底图的平面动态图对油藏工程师来说是十分重要的,目前这局部工作仍然依靠技术人员手工完成。他们因需在地质图上绘制油藏平面生产现状图、水淹图而消耗了大量的时间和精力【3】。为了充分利用现有的地质成果图ChartRenderer对象提供的属性和方法,可以利用饼图GroupRenderer并不是一种独立的渲染方式,它实现了上述几种渲染方式组合渲染。使用时先定

3、义一个组渲染对象GroupRend,再定义前面介绍的方法某种渲染方式RenderI,用如下语句实现向组内添加渲染方式并完成组渲染。GroupRend.AddRenderIMapLayer.Renderer=GroupRendMap1.Refresh3. 自定义绘图接口上一局部介绍了用到的Mapobjects的两种渲染方式,下面我们着力介绍图表渲染中自定义绘图接口。要实现自定义图表渲染方式,首先需要定义如同柱状图或饼状图的渲染类。如在vb6.0中定义一个名为clsBar的柱状图渲染类,那么该类使用方法如下:Dim ChartSymAs New clsBarDim pChartRendererAs

4、 New MapObjects2.ChartRendererWithpChartRenderer.FieldCount = 1 渲染的字段个数据为1.Field(0) = LJCYL 渲染的字段名称为LJCYL.Color(0) = moBlue 颜色为蓝色.ChartType = moCustom 渲染类型为自定义的End WithpChartRenderer.CustomChart= ChartSymSetMapLayer.Renderer = pChartRendererMap1.Refresh上述代码展示了如何用自定义方式实现图表渲染,其前提是实现了clsBar类。下面我们就重点讲述如

5、何实现渲染类clsBar。在mapobjects中为自定义渲染类预留三个成员函数作为接口,分别为SetupDC、Draw和ResetDC。如果使用自定义方式实现了图层渲染,当刷新该图层时,即在BeforeLayerDraw事件之后,在AfterLayerDraw事件之前系统渲染图层。渲染对象的SetupDC方法首先被调用。用来改写设备描述表,选定画笔、画刷。之后,系统调用渲染对象的Draw方法,采用选定设备依次绘制当前渲染图层各个图元的渲染图形。当所有对象绘制完成之后,ResetDC方法被调用,用来恢复设备描述表。这三个函数的命名及参数都是mapobjects规定的,不能更改。SetupDC函

6、数原型为: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函数。代码如下:Dim newBrush AsLong, oldBrush As Longn

7、ewBrush =CreateSolidBrush(Color)oldBrush =SelectObject(hdc, newBrush)DeleteObjectoldBrush上述代码中参数Color为画刷颜色值。Draw 函数原型为:Private SubICustomChart_Draw(ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, values()As Double, ByVal normValue As Double, ByVal sizeValue As Double),系统按Shape文件记录集顺序依次调用此函数绘制各图

8、元渲染图形。如果渲染字段为多个,那么我们需要在此函数中依次绘制各字段的渲染图形。在该函数参数中,X、Y是当前图元的横纵坐标;values()是各渲染字段的值,value(i)即为该图元所对记录第i+1个渲染字段值,此值将被作为柱条高度或饼图的半径的参考。ResetDC 函数原型为:rivate Sub ICustomChart_ResetDC(ByValhdc As Long),用来恢复设备描述表设置,SelectObject和DeleteObject Windows API函数将被调用来实现上述功能。在以上三个函数的实现中,我们使用了Windows API函数,下面对其做简要介绍。API是A

9、pplication Programming Interface应用程序编程接口的缩写,API函数可分为窗口管理、图形设备接口函数、系统效劳函数、国际特性、网络效劳等几类,存放在DLLDynamic Link Library,动态链接库中。在VB中,不能直接调用API函数,必须遵循先声明后使用;的原那么,否那么会提示子程序或函数未定义;的错误信息。1 API函数的声明要用到Declare语句,如果该API函数有返回值,那么其声明为Function,如果没有返回值,可以将其声明为Sub;2在Declare语句中,Lib关键字用来指明该API函数属于哪个DLL;3VB以地址方式传递参数,而许多AP

10、I要求以值传递方式传递参数。如果调用的API函数以值传递,那么需在参数声明前加上ByVal关键字。遵循如上原那么,我们使用到的API函数声明如下:Private DeclareFunction CreatePen Lib gdi32 (ByVal nPenStyle As Long, nWidthAs Long, ByVal crColor As Long)Private DeclareFunction SelectObject Lib gdi32 (ByVal hdc As Long, ByValhObject As Long)Private DeclareFunction DeleteOb

11、ject Lib gdi32 (ByVal hObject As Long)Private DeclareFunction CreateSolidBrush Lib gdi32 (ByVal crColor As Long)4. 自定义图形绘制方法4.1 绘制柱状图绘制柱状图实现于Draw函数之内,系统为图层中每一个图元绘制渲染图形时都调用一次Draw函数,如果地多个字段同时渲染,那么在Draw函数体内一次绘制完成。Draw函数的X、Y参数即为当前图元的坐标位置。首先定义一个MapObjects的矩形对象pRect,设用户设定其宽度为iBarWidth,高度为iBarHeight,通过如下语句

12、设置:pRect.left = XpRect.bottom = YpRect.top =pRect.bottom - iBarHeightpRect.right =pRect.left + m_dblBarWidth需要注意的是,此时图上坐标系,纵轴方向是竖直向下的,因此计算矩形对象各顶点坐标时,需考虑与正常坐标系统的差异。如果我们对多个字段进行柱状图渲染,可能需要对各柱条的排列位置予以设置,此时考虑柱条个数并使其排列于当前图元适当位置即可。最终采用Windows API函数中FillRect函数实现矩形的填充,FrameRect函数绘制矩形边框。该函数的调用方式为 :FillRect hdc

13、,pRect, newBrushFrameRect hdc,pRect, newBrush其中,hdc为DC的句柄也是Draw函数的参数,newBrush为我们自定义的画刷。FillRect 与FrameRect函数同样需要声明,方式如下:Private DeclareFunction FillRect Lib user32 (ByVal hdc As Long, lpRect AsRectangle, ByVal hBrush As Long)Private DeclareFunction FrameRect Lib user32 (ByVal hdc As Long, lpRect AsR

14、ectangle, ByVal hBrush As Long)4.2 绘制饼状图与柱条图相同,每绘制一个图元饼图系统调用一次Draw函数,并且函数中X,Y参数即是该图元坐标位置。发表论文。假定需要绘制的饼图半径设定为Radius,在油井综合柱状图的饼图中,根据累积产油量及累积产水量数值所占的总和比例来确定其在饼图是所占的比例大小。我们首先介绍一下绘制饼图的API函数Pie。该函数用来绘制椭圆或其一局部,函数原型如下:Pie hdc, X1, Y1,X2, Y2, x3, y3, x4, y4如图1所示,(X1, Y1),( X2, Y2) 为椭圆外接矩形的左上点和右下点的坐标。以椭圆中心为起点

15、的向(X3,Y3)、(X4,Y4)方向延伸分别构成射线L1和射线L2,以椭圆中以为圆点,以L1起以逆时针方向旋转至L2,在椭圆上扫过的面即为当前绘绘制的图形,即图1中的红色区域。图1 椭圆绘制区示意由于累积产油和累积产水两项指标总和绘制为半圆,圆半径为Radius,因此各自所占的比例由其数值比例决定。假设累油、累水分别为第一、二个渲染字段,那么在Draw函数中其值分别为Value(0)和Value(1),设其开始和终止绘制的角度BeginAngle和EndAngle分别为:BeginAngle =0EndAngle = Value(0)/( Value(0)+Value(1)*180同样由于纵

16、坐标轴方向是向下的,因此:x3 = X - radius *Cos(/180)*EndAngle)y3 = Y - radius *Sin(/180)*EndAngle)x4 = X - radius *Cos(/180)*BeginAngle)y4 = Y - radius *Sin(/180)*BeginAngle)当绘制累积产区水域时:BeginAngle = Value(0)/(Value(0)+ Value(1)*180EndAngle = 180 x3,x4,y3,y4计算方法与累积产油局部相同,上面使用到的API函数Pie声明如下:Private DeclareFunction

17、Pie Lib gdi32 (ByVal hdc As Long, ByVal X1 As Long, ByValY1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal x3 As Long, ByVal y3 AsLong, ByVal x4 As Long, ByVal y4 As Long) As Long4.3 图形尺寸设置渲染图层时,渲染图形的绘制尺寸如柱条高度、饼图半径是参考Draw函数传入的各渲染字段值确定的。但有时渲染字段值各记录之间相差数倍乃至数十倍,导致渲染表现困难。为了处理极端数据存在的情况,我们对于渲染图形尺寸设置采用

18、了特殊算法。以计算柱状图各柱条高度为例,用户可以自定义设置最大高度及柱条宽度,如分别为Max和iBarWidth。据此设置柱条的最小高度Min为:假设图层各记录某渲染字段值分别为V1、V2、V3Vn其中最大值为Vmax,那么各记录对应的柱条高度Hi分别为:特殊情况下,如果渲染字段数值为0时,柱条高度也为0。假设同一图层渲染多个字段,那么将各字段值之和作为依据设置各渲染图形尺寸。5. 专题图设置5.1 分组显示为了直观表达图层渲染结果,需要对其显示予以管理。如油井图层绘制综合柱状图之后,可以对月产油、月产水的柱状图及累积产油量、累积产水量的饼图分别单独显示。此功能的实现方法是定义两个MapObj

19、ects的组渲染对象,其中一个用来存储用户绘制的所有专题图,另一个用来存储用户当前设置显示的专题图。例如,当绘制综合柱状图时,定义一个pBarRenderer 和pPieRenderer两个图表渲染对像。pBarRenderer实现柱图渲染,pPieRenderer实现饼图渲染。绘图时将pBarRenderer,pPieRenderer参加到两个组渲染对象中,并使用显示组渲染对象渲染图层。不同图层的渲染结果同样可以采用上述方法管理显示。5.2 标注显示渲染图形能给人直观的量化概念,但如果用户需要了解其代表的真实数值,还需要对渲染结果予以标注。标注功能同样在Draw函数内实现,标注位置依据该函数

20、X,Y参数及绘图美观需要适当调整得到。实现方法:在clsBar与clsPie类中,添加一个标志标注是否显示的成员变量m_ShowLabel。在Draw函数中,判断m_ShowLabel是否为真,如是那么在当前图元的适当位置绘制数值。用到的Windows API函数为TextOut,其声明格式如下:Private DeclareFunction TextOut Lib gdi32 Alias TextOutA (ByVal hdc AsLong, ByVal X As Long, ByVal Y As Long, ByVal lpString As String, ByVal nCountAs Long

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论