周剑敏
摘 要 文章继续讲解蓝牙GPS实验导航系统设计与制作,详细介绍系统中运行轨迹的记录、标记和测距等功能的设计方案及编程实现。
关键词 蓝牙,GPS,测距,轨迹
一、定位车辆位置的标示
首先在Picture2控件中添加一个Image1控件,设置其Width和Height属性分别都是250,Stretch属性为True,即该控件所加载图形可按所设置大小伸缩固定大小。为这个控件加载一个简单而显眼的图片如宝马或奔驰的标志,用来在地图上标示所在位置。
然后根据定位数据计算出Image1控件在Picture2中的相对位置,以标示出当前所在地理位置,计算方法在第三讲中已经介绍。为了使得显示位置更显眼,可以通过移动Picture2控件使得Image1控件出现在屏幕正中,然后推导一下计算公式来理解其中的原理,如图1所示。
图1 计算Picture2显示位置
根据图1可以看出,若让当前位置置于显示区域的正中,则
X - Picture2.Left = Picture1.Width / 2
求得: Picture2.Left = X - Picture1.Width / 2
同样 Y - Picture2.Top = Picture1.Height / 2
求得: Picture2.Top = Y - Picture1.Height / 2
修改定时器控件代码,定时获取定位信息并在地图上标示当前位置:
Private Sub Timer1_Timer()
On Error Resume Next
Lod = ""
Positioning Lod, LodStr, Lat, LatStr, Spd, Ang, Dat, Tme, Fs
Text3 = Tme
ShowState Val(Fs)
Text1 = Lat
Label3.Caption = LatStr
Text2 = Lod
Label4.Caption = LodStr
Text4 = Spd
Text5 = Ang
Form1.Caption = "实验卫星导航系统-" & Dat
If Combo1.Text = "" Then Exit Sub ' 地图没有加载则退出
' 以下为新加代码
ShowPos ' 标示位置
End Sub
再来看一下标示位置代码的实现
Sub ShowPos()
Dim CurrLog, CurrLat
' 取得当前经度
k = InStr(Text2.Text, "°")
d = Val(Left(Text2.Text, Len(Text2.Text) - k))
l = InStr(Text2.Text, "′")
f = Val(Mid(Text2.Text, k + 1, l - k - 1))
m = Val(Mid(Text2.Text, l + 1, Len(Text2.Text) - l - 1))
CurrLog = d + f * 60 + m * 3600
' 取得当前纬度
k = InStr(Text1.Text, "°")
d = Val(Left(Text1.Text, Len(Text1.Text) - k))
l = InStr(Text1.Text, "′")
f = Val(Mid(Text1.Text, k + 1, l - k - 1))
m = Val(Mid(Text1.Text, l + 1, Len(Text1.Text) - l - 1))
CurrLat = d + f * 60 + m * 3600
' 计算当前位置在Picture2控件中的坐标
X = (LogL - CurrLog) * picutre2.Width / (LogL - LogR)
Y = (LatB - CurrLat) * Picture2.Height / (LatB - LatT)
' 将当前位置标示图标移到坐标所在处
Image1.Left = X
Image1.Top = Y
' 移动地图位置,使位置标示图标位于显示区域正中
Picture2.Left = X - Picture1.Width / 2
Picture2.Top = Y - Picture1.Height / 2
' 调画轨迹、记录轨迹模块
RecordTrack CurrLog, CurrLat, X, Y, Combo1.Text
End Sub
|