




已阅读5页,还剩32页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
用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=1twip。这时在picdrawmap图片框上绘图的坐标原点(0,0)定位在该图片框的左上顶点,水平坐标(x坐标)从左向右增大,垂直坐标(y坐标)从上往下增大(如图2)。在这个坐标系统中,picdrawmap可以显示的点的范围是: x=0 and x=0 and y=scaleheight 因此,为了能描点连线到picdrawmap图片框上,必须保证点的横坐标在区间0,scalewidth内,纵坐标在区间0,scaleheight内。 (4)地图的经纬度值转换为picdrawmap上的坐标值的公式 由于地图边界点的坐标为经纬度值,其度量单位与picdrawmap图片框上的不同,同时其纵坐标轴的方向(经向,原点在赤道,纬度值往北增大)与图片框的纵坐标轴方向相反,因此地图边界点的经纬度坐标必须经过转换才能在图片框上正确地描点连线。转换公式为: x =(tmpx - fxmin) *okx y = (fymax - tmpy) *okx 其中x,y分别为图片框上点的横、纵坐标,tmpx,tmpy分别地图边界点的经度、纬度,okx与picdrawmap.ScaleWidth / (fxmax-fxmin)和picdrawmap.ScaleHeight / (fymax-fymin)两者中值小的一个相等, fxmin、fxmax,fymin,fymax分别为所有地图边界点中最小的经度值、最大的经度值、最小的纬度值、最大的纬度值。 chinageog/com (5)编写绘制地图边界的程序代码 Option Explicit Dim connmapdat As ADODB.Connection Dim rsmapdat As ADODB.Recordset Dim i As Integer, j As Integer 定义模块级的绘图颜色变量 Dim mcolor As Single 定义模块级的绘图放大倍数 Dim mzoom As Single 创建动态数组,保存地图坐标值 Dim gridx() As Single, gridy() As Single漫游位移的模块级变量 Dim mxmove As Single, mymove As Single 漫游开始点,记录鼠标第一次按下的点位置 Dim mweiyistartx As Single, mweiyistarty As Single Function drawmap(drawpic As PictureBox, lcolor As Single, _ zoom As Single, xmove As Single, ymove As Single, manyou As Boolean) drawmap为绘制地图边界的函数 drawpic为绘图的图片框, lcolor为描线的颜色 zoom为放大倍数 xmove,ymove分别为漫游x和y方向的位移 manyou为漫游标志 Dim tmpx As Single, tmpy As Single Dim fxmax As Single, fxmin As Single, fymax As Single, fymin As Single Dim fxwidth As Single, fyheight As Single Dim tmp As String Dim okx As Single, oky As Single If Not manyou Then 不是漫游则重新读取地图数据并转换 ReDim gridx(1) ReDim gridy(1) Set connmapdat = New ADODB.Connection Set rsmapdat = New ADODB.Recordset connmapdat.Provider = Microsoft Jet 3.51 OLE DB Provider connmapdat.Connecti*tring = data source= & App.Path & mapdata.mdb connmapdat.Open 取出地图横纵坐标的极值 tmp = select max(fx) as fxmax, max(fy) as fymax,min(fx) as fxmin,min(fy) as fymin from mdata where ftype=1 rsmapdat.Open tmp, connmapdat, adOpenForwardOnly, adLockReadOnly With rsmapdat fxmax = .Fields(fxmax) fxmin = .Fields(fxmin) fymax = .Fields(fymax) fymin = .Fields(fymin) End With 求出转换公式的参数 fxwidth = fxmax - fxmin fyheight = fymax - fymin okx = drawpic.ScaleWidth / fxwidth oky = drawpic.ScaleHeight / fyheight If okx oky Then oky = okx Else okx = oky End If rsmapdat.Close 读出地图坐标,并转换为图片框上点的坐标 rsmapdat.Open select fx,fy,ftype from mdata where ftype=1, connmapdat, adOpenForwardOnly, adLockReadOnly i = 1 With rsmapdat Do While i = 2 ThenFor intI = 2 To intCol 空转,读*Input #intFileNumber, strDataNext intIEnd IfInput #intFileNumber, strData 读行数intRow = Val(strData) 取得行数If intCol = 2 ThenFor intI = 2 To intCol 空转,读*Input #intFileNumber, strDataNext intIEnd If重新定义图形数据数组ReDim dblData(1 To intRow, 1 To intCol) 原始数据ReDim sngData(1 To intRow, 1 To intCol) 变换成坐标后的数据重新定义每行的极值数组ReDim dblDatMin(1 To intRow), dblDatMax(1 To intRow)确定曲线高度行数=曲线条数sngH是自定义高度单位所相当的Twips数If intRow = 3 ThensngCH = 3 曲线高度为3单位ElseIf intRow = 6 ThensngCH = 1.5 曲线高度为1.5单位ElseIf intRow = 9 ThensngCH = 1 曲线高度为1个单位ElseIf intRow = 2 ThenFor intI = 2 To intCol 空转,读*Input #intFileNumber, strDataNext intIEnd IfblnTitle = False: blnRowLabel = False: blnColLabel = False优先考虑图题If intRowAll intRow + 3 Then blnTitle = True 有图题其次考虑行标If intRowAll 2 * intRow + 3 ThenblnRowLabel = True 有行标ReDim strRowLabel(1 To intRow) 重新定义行标数组End If最后考虑列标If intRowAll 2 * intRow + 4 ThenblnColLabel = True 有列标ReDim strColLabel(1 To intCol) 重新定义列标数组End IfIf blnTitle ThenlblTitle.Visible = TrueInput #intFileNumber, strData 读图形标题lblTitle.Caption = strData 在图题标签中显示图形标题lblTitle.Visible = TrueIf intCol = 2 ThenFor intI = 2 To intCol 空转,读*号Input #intFileNumber, strDataNext intIEnd IfEnd IfIf blnRowLabel ThenFor intI = 1 To intRowInput #intFileNumber, strData 读行标题strRowLabel(intI) = strData 在行标标签中显示行标题If intCol = 2 ThenFor intJ = 2 To intCol 空转,读*号Input #intFileNumber, strDataNext intJEnd IfNext intIEnd IfIf blnColLabel ThenFor intI = 1 To intCol 读列标题Input #intFileNumber, strDatastrColLabel(intI) = strDataNext intIEnd IfFor intI = 1 To intRowFor intJ = 1 To intColInput #intFileNumber, strData 读图形数据dblData(intI, intJ) = Val(strData)Next intJNext intIClose列数=数据点个数sngXInc为水平方向的刻度间距If intCol 1 ThensngXInc = 15 / (intCol - 1)ElseMsgBox 列数不能小于等于1Unload MeEndEnd If求出每行数据的极值For intI = 1 To intRowdblDatMin(intI) = 100000dblDatMax(intI) = -100000For intJ = 1 To intColIf dblData(intI, intJ) dblDatMax(intI) Then _dblDatMax(intI) = dblData(intI, intJ)Next intJIf dblDatMax(intI) - dblDatMin(intI) 9 Then GoTo PP 超过9条曲线不绘X、Y轴For intI = 1 To intRowPSet绘起始点,起始点的X坐标是 1.5Me.PSet (1.5, intI * (sngCH + 0.5) + 1)For intJ = 2 To intCol绘曲线Me.Line -(1.5 + sngXInc * (intJ - 1), intI * (sngCH + 0.5) + 1)绘刻度线Me.Line -(1.5 + sngXInc * (intJ - 1), intI * (sngCH + 0.5) + 1.1)Me.Line -(1.5 + sngXInc * (intJ - 1), intI * (sngCH + 0.5) + 1)Next intJNext intI在横坐标轴刻度上写列标For intI = 1 To intRowIf intCol 9 Then GoTo PP 超过9条曲线不绘X、Y轴For intI = 1 To intRowPSet绘起始点,起始点的X坐标是 1.5Printer.PSet (1.5, intI * (sngCH + 0.5) + 1 - DY)For intJ = 2 To intCol绘曲线Printer.Line -(1.5 + sngXInc * (intJ - 1), intI * _(sngCH + 0.5) + 1 - DY)绘刻度线Printer.Line -(1.5 + sngXInc * (intJ - 1), intI * _(sngCH + 0.5) + 1.1 - DY)Printer.Line -(1.5 + sngXInc * (intJ - 1), intI * _(sngCH + 0.5) + 1 - DY)Next intJNext intI在横坐标轴刻度上写列标For intI = 1 To intRowIf intCol = 40 ThenFor intJ = 1 To intColPrinter.CurrentX = 1.5 + sngXInc * (intJ - 1)Printer.CurrentY = intI * (sngCH + 0.5) + 1.1 - DYPrinter.Print strColLabel(intJ)Next intJEnd IfNext intI绘纵坐标轴For intI = 1 To intRowPrinter.PSet (1.5, intI * (sngCH + 0.5) + 1 - DY)Printer.Line -(1.5, intI * (sngCH + 0.5) + 1 - sngCH - DY)Next intI在纵坐标轴上画刻度线及写刻度值sngCH是曲线的高度For intI = 1 To intRowdblMaxMin = dblDatMax(intI) - dblDatMin(intI)For intJ = 1 To 4sngYScale为刻度的位置sngYScale(intJ) = intI * (sngCH + 0.5) + 1 - sngCH / 4 * intJintYScale为取整后的刻度值intYScale(intJ) = dblDatMin(intI) + dblMaxMin / 4 * intJNext intJ在纵坐标轴上画刻度线及写刻度值For intJ = 1 To 4Printer.PSet (1.5, sngYScale(intJ) - DY)Printer.Line -(1.4, sngYScale(intJ) - DY)只有极差是4的整数倍才都写刻度值,这样作是为了确保刻度是整数If intS = 0 Then GoTo SS 缩小图形时不写纵轴刻度If (dblMaxMin 4) * 4 = dblMaxMin ThenPrinter.CurrentX = 0.8Printer.CurrentY = sngYScale(intJ) - DY - 0.1Printer.Print intYScale(intJ)如果极差是2的整数倍,只写第2条和第4条刻度的刻度值ElseIf (intJ = 2 Or intJ = 4) And _(dblMaxMin 2) * 2 = dblMaxMin ThenPrinter.CurrentX = 0.8Printer.CurrentY = sngYScale(intJ) - DY - 0.1Printer.Print intYScale(intJ)End IfSS:Next intJNext intIPP:Printer.EndDocEnd Sub退出Private Sub cmdExit_Click()Unload MefrmFileName.Visible = TrueEnd Sub4运行在本章文件夹内有一个子文件夹“曲线数据”(见图5-1),包括6个曲线文件,可以用来作示例图形。(1)提供作图数据文件名启动后,进入数据文件名窗体,见图5-1。图5-1 确定作曲线的数据文件全名(2)作图确定文件名后,单击“确定”,进入作图窗体。单击“1/2”按钮,所有命令按钮下移,再单击“作图”,所绘制的图形相当于原图的一半,见图5-2。已经完成作图,“作图”按钮不再可视。图5-2 曲线程序所绘制的曲线图形(3)打印在完成屏幕图形之后,如果单击“打印”则可以从打印机输出曲线。5.3 等值线图凡属于关系Z=f(X,Y),不管是连续函数,还是离散数据,都可以用二维标量场的等值线图来表达。以区域为背景的观测值常常需要用等值线图表示观测值和处理结果。人们所熟悉的等高线图就是描绘区域地形高度的等值线图。人口密
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025劳动合同转让协议范本
- 2025劳动合同书电子版
- 葡萄农业植保知识培训课件
- 物体测试题及答案
- 营销电气知识培训课件
- 物流考试试卷及答案
- 2025设备租赁合同书
- 物联网题库及答案
- 2025关于电子商务平台的合作协议
- 2025年液环真空泵项目建议书
- “匠心杯”班组长管理创新技能竞赛(决赛)考试题库500题(含答案)
- 幼儿居家饮食安全
- 沙滩承包合同范例
- GB/T 44841-2024非合金及低合金铸铁焊接工艺评定试验
- 教师资格认定申请表
- DB11T 1620-2019 建筑消防设施维修保养规程
- 监控机房管理制度
- 舞蹈学导论课件
- XX镇村级光伏扶贫电站运维管理考核方案
- 植物病虫害防治技能大赛理论题及答案
- 《财产独立性专项审计报告》框架模板
评论
0/150
提交评论