已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
用VB绘制自己的矢量地图 本人有vb+AO AE MO MAPX SO |vc+ao 工程源代码,和资料需要这些代码的朋友请加我qq:527602799,代码优惠转让,并随盘有接近3个多G的gis系列资料.在信息系统开发中,偶尔需要用图示的方式将信息、数据等按地理分布显示出来,如果为此而专门购买一个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) *okxy = (fymax - tmpy) *okx其中x,y分别为图片框上点的横、纵坐标,tmpx,tmpy分别地图边界点的经度、纬度,okx与picdrawmap.ScaleWidth / (fxmax-fxmin)和picdrawmap.ScaleHeight / (fymax-fymin)两者中值小的一个相等, fxmin、fxmax,fymin,fymax分别为所有地图边界点中最小的经度值、最大的经度值、最小的纬度值、最大的纬度值。(5)编写绘制地图边界的程序代码Option ExplicitDim connmapdat As ADODB.ConnectionDim rsmapdat As ADODB.RecordsetDim 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 SingleFunction 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 SingleDim fxwidth As Single, fyheight As SingleDim tmp As StringDim okx As Single, oky As SingleIf Not manyou Then 不是漫游则重新读取地图数据并转换ReDim gridx(1)ReDim gridy(1)Set connmapdat = New ADODB.ConnectionSet rsmapdat = New ADODB.Recordsetconnmapdat.Provider = Microsoft Jet 3.51 OLE DB Providerconnmapdat.ConnectionString = data source= & App.Path & mapdata.mdbconnmapdat.Open取出地图横纵坐标的极值tmp = select max(fx) as fxmax, max(fy) as fymax,min(fx) as fxmin,min(fy) as fymin from mdata where ftype=1rsmapdat.Open tmp, connmapdat, adOpenForwardOnly, adLockReadOnlyWith rsmapdatfxmax = .Fields(fxmax)fxmin = .Fields(fxmin)fymax = .Fields(fymax)fymin = .Fields(fymin)End With求出转换公式的参数fxwidth = fxmax - fxminfyheight = fymax - fyminokx = drawpic.ScaleWidth / fxwidthoky = drawpic.ScaleHeight / fyheightIf okx oky Thenoky = okxElseokx = okyEnd Ifrsmapdat.Close读出地图坐标,并转换为图片框上点的坐标rsmapdat.Open select fx,fy,ftype from mdata where ftype=1, connmapdat, adOpenForwardOnly, adLockReadOnlyi = 1With rsmapdatDo While i 312tmpx = .Fields(fx)tmpy = .Fields(fy)ReDim Preserve gridx(UBound(gridx) + 1)ReDim Preserve gridy(UBound(gridy) + 1)gridx(i) = zoom * (tmpx - fxmin) * okx)gridy(i) = zoom * (fymax - tmpy) * oky)i = i + 1.MoveNextLoopEnd Withrsmapdat.CloseElse漫游时,地图各个点作相同的位移For j = 1 To i - 1gridx(j) = gridx(j) + xmovegridy(j) = gridy(j) + ymoveNextEnd If绘地图边界drawpic.Clsdrawpic.DrawWidth = 3For j = 1 To i - 2drawpic.Line (gridx(j), gridy(j)-(gridx(j + 1), gridy(j + 1), lcolorNext把最后一点与开始的第一点连接起来,以便构成闭合的边界drawpic.Line (gridx(i - 1), gridy(i - 1)-(gridx(1), gridy(1), lcolormcolor = lcolormzoom = zoommxmove = xmovemymove = ymoveEnd Function4、显示地图Private Sub CmdshowMap_Click() 显示地图Call drawmap(Picdrawmap, RGB(255, 255, 0), 1, 0, 0, False)End Sub5、地图的放大与缩小地图的放大:用鼠标单击“放大”按钮,每次加大0.2 倍。Private Sub CmdZoomOut_Click()Call drawmap(Picdrawmap, mcolor, mzoom * 1.2, 0, 0, False)End Sub地图的缩小:用鼠标单击“缩小”按钮,每次缩小0.2倍。Private Sub CmdzoomIn_Click()Call drawmap(Picdrawmap, mcolor, mzoom * 0.8, 0, 0, False)End Sub6、地图的漫游按住鼠标键,移动鼠标,放开鼠标键,地图即沿鼠标移动方向移动,并移动相同的距离,实现地图的漫游。Private Sub Picdrawmap_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)mweiyistartx = Xmweiyistarty = YEnd SubPrivate
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 园林景观合同工程质量(3篇)
- 业法律法规与综合能力押题密卷(附答案及解析)
- 2025年无人机监测服务平台项目可行性研究报告及总结分析
- 2025年新型人力资源管理系统可行性研究报告及总结分析
- 高压线路带电检修工考试题含答案
- 2025年生态旅游项目设计与可行性研究报告及总结分析
- 2025年 四川省平昌县职业中学招聘考试笔试试题附答案
- 2025年农业行业智慧农业技术在农业生产中的应用效果评估与数据分析案例研究报告及未来发展趋势
- 2025年春季方剂学经典名方解析及运用试卷
- 2025年灵活畜禽养殖场地租赁合同
- 数控铣削加工实训报告
- 《工会基础知识》考试题库300题(含答案)
- 青海省地图含市县地图矢量分层地图模板
- 水炮维修合同范例
- 艺术项目合作提成方案
- 《跨境电商基础与实务》全套教学课件
- 2024年广西高考物理试卷(含答案解析)
- 中国国际大学生创新大赛与“挑战杯”大学生创业计划竞赛(第十一章)大学生创新创业教程
- 叶片层铺褶皱缺陷的初步探讨 - 副本
- 红外光谱的产生
- 市场风险分析与防范方案
评论
0/150
提交评论