VB与MapInfo结合实现电子地图系统

5星 · 超过95%的资源 需积分: 9 12 下载量 55 浏览量 更新于2024-09-28 1 收藏 331KB PDF 举报
"基于VB和MapInfo的电子地图实现,主要探讨如何利用VB语言与MapInfo专业版构建电子地图系统,实现地图显示、操作及信息查询功能。" 电子地图是现代地理信息系统的重要组成部分,借助遥感、GPS和GIS技术的发展,电子地图在各个领域广泛应用。与传统的纸质地图相比,电子地图提供了更为直观、便捷的信息获取方式,尤其在查询功能上具有显著优势。 MapInfo Professional是一款强大的桌面GIS软件,能够处理地图显示、管理和编辑任务。它允许将地图对象与属性数据库关联,实现双向查询,同时提供MapBasic语言进行二次开发,便于定制特定的应用系统。 VB(Visual Basic)则是一种可视化的编程语言,它的优点在于能够快速创建用户界面,通过编写简单的代码即可实现复杂功能。将VB与MapInfo结合,可以充分利用两者的优点,开发出用户友好的电子地图应用。 系统设计方面,一般可以划分为地图管理、查询和输入输出三个子系统。在信息查询子系统中,涉及到的功能包括列车线路查询、列车到站时间查询、高速公路里程查询和城市信息查询等。这些功能的实现,依赖于合理构建的空间与属性数据库,通过VB调用MapInfo的API,完成地图的操作(如缩放、平移)和信息检索。 具体实现过程中,首先需要建立一个包含全国城市信息和道路交通数据的空间数据库。这个数据库需要有效地存储地理坐标、属性数据(如城市名、高速公里数等),并确保数据的准确性和完整性。接着,在VB环境中,利用控件和事件驱动编程,设计用户界面,集成MapInfo的地图显示功能,使用户能够直观地查看电子地图。 在查询功能上,VB编写查询逻辑,可以根据用户输入的关键字,通过MapBasic脚本在MapInfo中执行查询命令,获取相关地图对象及其属性信息,然后在界面上展示结果。例如,对于列车线路查询,系统会查找并显示相关的铁路线和站点;对于高速公路里程查询,系统会计算起点到终点的距离。 基于VB和MapInfo的电子地图实现,是通过集成GIS软件的强大地图处理能力与编程语言的灵活性,构建出满足用户需求的信息查询系统。这种系统不仅提高了地图数据的利用率,也为用户提供了一种高效的信息获取途径,具有很高的实用价值。
2008-10-26 上传
vb+mapinfo 实现最短路 'NoNode1 起始点编码 'NoNode2 结束点编码 'nNode 为网中最大的节点数 'NoNode(i) 节点编码 'LinkN(i) 与i点相连Line个数 'LinkNi(i) 与i点相连Line端点存放序号 'iLL=LinkNi(LL) - i + 1 'LinkNo(iLL) 与i点相连Line端点顺序编号 'LinkList(iLL) 与i点相连Line端点距离 'nNodeShortPath 最短路径节点数 'NodeShortPath 最短路径节点序号 Public Sub ShortPathSearch(NoNode1 As Integer, NoNode2 As Integer, nNode As Integer, NoNode() As Integer, LinkN() As Integer, LinkNi() As Integer, LinkNo() As Integer, LinkDis() As Double, nNodeShortPath As Integer, NodeShortPath() As Integer, ShortPath As Double) Dim II As Integer, I As Integer, J As Integer, LL As Integer, iLL As Integer Dim iNode As Integer Dim S As Single, MinS As Single, MinPoint As Integer Dim NodeCheck() As Boolean '标记已经查过的点 Dim NodeUse() As Boolean '标记已经作为结果点使用过的点 Dim RS() As Single '假设从起点到任一点的距离都为无穷大 Dim result() As Single '存放结果长度 Dim ResultNo() As Integer '存放结果节点编号 Dim iResult As Integer Dim No() As Integer Dim StartNo As Integer, EndNo As Integer 'Begin根据编码,搜索序号 StartNo = 0 EndNo = 0 For I = 1 To nNode If (NoNode(I) = NoNode1) Then StartNo = I End If If (NoNode(I) = NoNode2) Then EndNo = I End If If (StartNo > 0 And EndNo > 0) Then Exit For Next I 'End根据编码,搜索序号 ReDim NodeCheck(1 To nNode), NodeUse(1 To nNode) ReDim RS(1 To nNode), result(1 To nNode), ResultNo(1 To nNode) For I = 1 To nNode NodeCheck(I) = False '标记未经查过的点。 NodeUse(I) = False '标记未作为结果点使用过的点 RS(I) = 1E+38 '假设从起点到任一点的距离都为无穷大 Next I LL = StartNo '设置开始点。 NodeUse(LL) = True '标记开始点为真。即已经作为结果点使用过。 J = 0 For iNode = 1 To nNode '先从与开始点相连的起点寻找 For I = 1 To LinkN(LL) '以与LL点相连的起点的个数循环 iLL = LinkNi(LL) + I - 1 iResult = LinkNo(iLL) '找出与LL点相连的起点的点号 If NodeCheck(iResult) = False Then '如果没查过,则进行 S = LinkDis(iLL) + result(LL) '找出长度并求和 If NodeUse(iResult) = True Then '如果已经作为结果点,判断哪一个长 If S <= RS(iResult) Then '如果这一点到起点的长度比现在的路线长,替代 RS(iResult) = S result(iResult) = S '设置到这点的最短路径长度 ResultNo(iResult) = LL End If Else '如果上面的条件都不符合,则进行下面的语句 NodeCheck(iResult) = True RS(iResult) = S result(iResult) = S ResultNo(iResult) = LL J = J + 1 '每找到一个点加一,为了下面的判断 ReDim Preserve No(1 To J) '重新定义数组并使其值为当前的点号 No(J) = iResult End If End If Next I '设置最小为无穷大,最短路径点为空 MinS = 1E+38 MinPoint = 0 '找出已经查过点中长度最短的点 For I = iNode To J If RS(No(I)) < MinS Then II = I MinS = RS(No(I)) MinPoint = No(I) End If Next I '如果没有结果,即起点与终点没有通路,则退出程序 If MinS = 1E+38 Then MsgBox "即起点与终点没有通路!", vbOKOnly, "关于搜索最短路径" Exit Sub End If '将两点互换,减少循环。 No(II) = No(iNode) No(iNode) = MinPoint '标记已经作为结果点判断过 NodeUse(MinPoint) = True LL = MinPoint '判断结果点是否等于终点,如果等于则已经找到最短路径 If MinPoint = EndNo Then Exit For Next iNode 'Begin检索最短路径节点 ReDim NodeShortPath(1 To nNode) nNodeShortPath = 1 LL = MinPoint NodeShortPath(nNodeShortPath) = LL Do LL = ResultNo(LL) nNodeShortPath = nNodeShortPath + 1 NodeShortPath(nNodeShortPath) = LL If (LL = StartNo) Then Exit Do Loop 'End检索最短路径节点 ShortPath = result(EndNo) End Sub