用VB怎么画等值线图

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

用VB怎么画等值线图都是气象同仁,气象部门的vb高手很多的,不知道是太忙还是有点保守,这个东西气象上用的很多,现有的程序也很多,都是气象同仁自己编的,不妨共享以下,我给你提供几个样本,你自己研究,我还没弄懂呢,你研究好了,给我讲讲用VB绘制自己的矢量地图来源:作者:国学发布时间:1970-01-01在信息系统开发中,偶尔需要用图示的方式将信息、数据等按地理分布显示出来,如果为此而专门购买一个GIS系统成本太高了。基于上述原因,我们自行开发了一个矢量地图绘制程序。本文介绍如何利用VB6.0制作自己的矢量地图,实现矢量地图的绘制、缩放、漫游等功能。1、地图数据的采集采集地图的矢量数据可以使用数字化仪等工具,也可以用人工的方法读取。笔者使用人工的方法读取了广西边界的轮廓图,方法是:对于闭合的广西边界先任意地定一个起点(如果是非闭合线如河流,取一个端点为起点),沿广西边界,按顺时针方向,大约每隔0.1个经距或纬距(比较粗藻,但是对于示意图来说就足够了),读出边界上一个点的经度和纬度值作为矢量地图的坐标,直到回到起点(对于非闭合线,则读到另外一个端点)。同样地我们也可以读出河流、地区边界、城市点等数据。本文示例中所绘的广西地图边界就是通过这种方法读出来的,共有311个点。2、地图矢量数据的存储我们采用ACCESS数据库mapdata.mdb表mdata来存储采集到的地图边界数据。表MDATA结构如下(本文示例绘制地图的外边界,只用到fx,fy,ftype字段,其余字段对于一个完整的矢量地图包含外边界、河流、城市点等,是很有用的):字段名称类型说明fx单精度经度,横坐标fy单精度纬度,纵坐标ftype整型当前记录坐标类型(边界或是城市),值为1表示外边界,2表示内分界,3表示河流,4表城市fgroup整型分组,该字段值相同表示属于同一边界或同一区域的城市fdata字符串型数据点的说明3、描绘地图我们可以把地图描绘在支持line方法的对象上(比如窗体或图片框)。本例中,我们将地图描绘在一个名为picdrawmap的pictruebox(图片框)控件上。我们利用图片框的line方法:picdrawmap.line(x1,y1)-(x2,y2)把地图边界的点一个一个依次连接起来而构成一条地图边界线,如图1。(1)在窗体中加入图片框和命令按钮中国*地理网图片框名为picdrawmap,命令按钮“显示地图”名为:cmdshowmap,命令按钮“放大”名为:cmdzoomout,命令按钮“缩小”名为:cmdzoomin。然后调整好它们的大小、位置。(2)picdrawmap图片框中输出线条外观、样式、粗细的设置通过设置图片框的属性:drawmode(线条外观)、drawstyle(线条样式)、drawwidth(线条粗细)等来设置在图片框上描绘线条的外观、样式和粗细。本文示例中我们把picdrawmap的drawmode和drawstyle属性保持缺省值,drawwidth属性设置为3。(3)picdrawmap图片框的坐标系统的设定通过设定Scaleleft(左边界的水平坐标)、scaletop(上边界的垂直坐标)、scalemode(坐标的度量单位)、scalewidth、scaleheight等属性值,我们可以确定在picdrawmap图片框绘图的坐标系统。本文示例中,我们把scaleleft、scaletop、scalemode保持缺省值,即scaleleft=0,scaletop=0,scalemode=1—twip。这时在picdrawmap图片框上绘图的坐标原点(0,0)定位在该图片框的左上顶点,水平坐标(x坐标)从左向右增大,垂直坐标(y坐标)从上往下增大(如图2)。在这个坐标系统中,picdrawmap可以显示的点的范围是:x=0andx=scalewidthy=0andy=scaleheight因此,为了能描点连线到picdrawmap图片框上,必须保证点的横坐标在区间[0,scalewidth]内,纵坐标在区间[0,scaleheight]内。(4)地图的经纬度值转换为picdrawmap上的坐标值的公式由于地图边界点的坐标为经纬度值,其度量单位与picdrawmap图片框上的不同,同时其纵坐标轴的方向(经向,原点在赤道,纬度值往北增大)与图片框的纵坐标轴方向相反,因此地图边界点的经纬度坐标必须经过转换才能在图片框上正确地描点连线。转换公式为:x=(tmpx-fxmin)*okxy=(fymax-tmpy)*okx其中x,y分别为图片框上点的横、纵坐标,tmpx,tmpy分别地图边界点的经度、纬度,okx与picdrawmap.ScaleWidth/(fxmax-fxmin)和picdrawmap.ScaleHeight/(fymax-fymin))两者中值小的一个相等,fxmin、fxmax,fymin,fymax分别为所有地图边界点中最小的经度值、最大的经度值、最小的纬度值、最大的纬度值。chinageog/com(5)编写绘制地图边界的程序代码OptionExplicitDimconnmapdatAsADODB.ConnectionDimrsmapdatAsADODB.RecordsetDimiAsInteger,jAsInteger'定义模块级的绘图颜色变量DimmcolorAsSingle'定义模块级的绘图放大倍数DimmzoomAsSingle'创建动态数组,保存地图坐标值Dimgridx()AsSingle,gridy()AsSingle'漫游位移的模块级变量DimmxmoveAsSingle,mymoveAsSingle'漫游开始点,记录鼠标第一次按下的点位置DimmweiyistartxAsSingle,mweiyistartyAsSingleFunctiondrawmap(drawpicAsPictureBox,lcolorAsSingle,_zoomAsSingle,xmoveAsSingle,ymoveAsSingle,manyouAsBoolean)'drawmap为绘制地图边界的函数'drawpic为绘图的图片框,'lcolor为描线的颜色'zoom为放大倍数'xmove,ymove分别为漫游x和y方向的位移'manyou为漫游标志DimtmpxAsSingle,tmpyAsSingleDimfxmaxAsSingle,fxminAsSingle,fymaxAsSingle,fyminAsSingleDimfxwidthAsSingle,fyheightAsSingleDimtmpAsStringDimokxAsSingle,okyAsSingleIfNotmanyouThen'不是漫游则重新读取地图数据并转换ReDimgridx(1)ReDimgridy(1)Setconnmapdat=NewADODB.ConnectionSetrsmapdat=NewADODB.Recordsetconnmapdat.Provider=MicrosoftJet3.51OLEDBProviderconnmapdat.Connecti*****tring=datasource=&App.Path&\mapdata.mdbconnmapdat.Open'取出地图横纵坐标的极值tmp=selectmax(fx)asfxmax,max(fy)asfymax,min(fx)asfxmin,min(fy)asfyminfrommdatawhereftype=1rsmapdat.Opentmp,connmapdat,adOpenForwardOnly,adLockReadOnlyWithrsmapdatfxmax=.Fields(fxmax)fxmin=.Fields(fxmin)fymax=.Fields(fymax)fymin=.Fields(fymin)EndWith'求出转换公式的参数fxwidth=fxmax-fxminfyheight=fymax-fyminokx=drawpic.ScaleWidth/fxwidthoky=drawpic.ScaleHeight/fyheightIfokxokyThenoky=okxElseokx=okyEndIfrsmapdat.Close'读出地图坐标,并转换为图片框上点的坐标rsmapdat.Openselectfx,fy,ftypefrommdatawhereftype=1,connmapdat,adOpenForwardOnly,adLockReadOnlyi=1chinageog.comWithrsmapdatDoWhilei312tmpx=.Fields(fx)tmpy=.Fields(fy)ReDimPreservegridx(UBound(gridx)1)ReDimPreservegridy(UBound(gridy)1)gridx(i)=zoom*((tmpx-fxmin)*okx)gridy(i)=zoom*((fymax-tmpy)*oky)i=i1.MoveNextLoopEndWithrsmapdat.CloseElse'漫游时,地图各个点作相同的位移Forj=1Toi-1gridx(j)=gridx(j)xmovegridy(j)=gridy(j)ymoveNextEndIf'绘地图边界中国地理网drawpic.Clsdrawpic.DrawWidth=3Forj=1Toi-2drawpic.Line(gridx(j),gridy(j))-(gridx(j1),gridy(j1)),lcolorNext'把最后一点与开始的第一点连接起来,以便构成闭合的边界drawpic.Line(gridx(i-1),gridy(i-1))-(gridx(1),gridy(1)),lcolormcolor=lcolormzoom=zoommxmove=xmovemymove=ymoveEndFunction4、显示地图PrivateSubCmdshowMap_Click()'显示地图Calldrawmap(Picdrawmap,RGB(255,255,0),1,0,0,False)EndSub5、地图的放大与缩小地图的放大:用鼠标单击“放大”按钮,每次加大0.2倍。PrivateSubCmdZoomOut_Click()Calldrawmap(Picdrawmap,mcolor,mzoom*1.2,0,0,False)EndSub地图的缩小:用鼠标单击“缩小”按钮,每次缩小0.2倍。PrivateSubCmdzoomIn_Click()Calldrawmap(Picdrawmap,mcolor,mzoom*0.8,0,0,False)EndSubvb等值线图的绘制方法一如既往,我们首先介绍实用程序开发中所遇到的以前没有涉及过的VB方法。1.鼠标拖放图形和图题都放在图片框内(图片框无边界),可以用鼠标拖放的方式在窗体上移动图片框。下面对VB所具有的控件对象移动功能作简单介绍。除Timer、Line、Shape等少数控件外,其余大多数控件都可以用鼠标拖放。鼠标拖放只有在控件没有取得焦点的情况下实现,为防止控件取得焦点,可以将其TabStop属性设置为False。(1)鼠标拖放的属性定义拖放的操作方式。可以有:•DragMode=0:手动拖放,缺省设置;•DragMode=1:自动拖放。还有一个定义拖动控件时图标的DragIcon属性。(2)鼠标拖放的事件•DragOver•DragDrop(3)鼠标拖放的方法使用的格式是:[对象.]Dragactionaction的取值有:•vbCancel(0):取消拖放操作;•vbBeginDrag(1):开始拖放操作;•vbEndDrag(2):结束拖放操作。(4)自动鼠标拖放假定窗体上放置一个标签,在属性窗口将标签的DragMode属性设置为1,并设置其TabStop属性为False。在窗体上添加如下代

1 / 37
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功