4.2.2 与数据库连接
在靠界面的右边解决方案资源管理器上下面,对map点右键出现“新添加(D)”选择新建“新建项(W)”在其中选择“类”,取名“db.vb”。选择添加,完成。在工程中找到“db.vb”输入连接数据库的代码,即可与数据库连接。
代码如下:
Public Class db
Private connStr As String
751com.cn
Public Sub New()
connStr = "Data Source=(local);Initial Catalog=map;Integrated Security=True"
End Sub
4.2.3 系统界面的实现
在建立map项目时,已经生成了一个Windows窗体,将其命名为地图查询。即为我们所作系统的界面。添加4个Button ,4个Label,4个TextBox。
4个Button分别为查询 清除 查询最短路径 清除。
4个Label分别是输入经度 输入纬度 输入起点街道名 输入站点街道名。
在输入经纬度时,限制用户只能输入阿拉伯数字0~9和小数点,具体代码如下:
Private Sub txtJingdu_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtJingdu.KeyPress
If e.KeyChar >= "0" And e.KeyChar <= "9" Or e.KeyChar = Chr(Keys.Back) Or e.KeyChar = Chr(46) Then
e.Handled = False
Else
e.Handled = True
End If
End Sub
4个TexBox分别输入4个Label对应值的对话框。
设计完成时,界面如图4.5示。
图 4.5
4.2.4 系统程序的实现
系统主要是分2个大部分,一个是确定通过输入点的经度和纬度,来确定该点在哪条街道上。另一部分,是通过输入起点街道和终点街道,来通过迪杰斯特拉(Dijkstra)算法来查询出最短路径,并显示。
首先介绍下第一部分。通过输入点的经度和纬度来判断该点在哪条街道上。算法流程图如图4.6所示
图4.6
在此算法中,判断点是否在街道上的思想如下:
首先,在存储街道的时候,我们将有弯道的街道分成若干直到存储,拐点就变成了了路口。在视图street_crossing中,将街道和它所属的2个端点联系了起来。在判断该点是否在某条街道上时,就成了判断一个点是否在一条直线上。这里采取了比斜率的方法。将输入的该点的经度和纬度,以及道路2个端点的经度和纬度看成3个点的坐标,利用jing1 * wei2否等于jing2 * wei1判断该点是否在当前所取得街道上(其中jing1,jing2分别表示该点的经度值与2个端点经度值的差值,wei1,wei2分别表示该点的纬度值与2个端点纬度值的差值)jing1 * jing2 >= 0是保证该点是在此直线街道上,而不是在该街道的直线延长线上。代码如下:
Private Sub btnSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearch.Click
Dim strSql As String = "select * from street_crossing "
Dim strSql1 As String
Dim jing1 As Single
Dim wei1 As Single
Dim jing2 As Single
Dim wei2 As Single
Dim ds As New DataSet
Dim dbobj As New ConnSqlServer.db
Dim dr As System.Data.SqlClient.SqlDataReader
If txtJingdu.Text = "" Or txtWeidu.Text = "" Then
MessageBox.Show("经度或纬度不能为空!")
Exit Sub
End If
dr = dbobj.DataReader(strSql)
While (dr.Read)
jing1 = dr("j1") - txtJingdu.Text
wei1 = dr("w1") - txtWeidu.Text
jing2 = txtJingdu.Text - dr("j2")
wei2 = txtWeidu.Text - dr("w2")
If (jing1 * wei2 = jing2 * wei1 And jing1 * jing2 >= 0) Then
strSql1 = "select street_name from street_crossing where id =" & dr("id") & ""
'dbobj.ReturnDataSet(strSql1, ds)
dr = dbobj.DataReader(strSql1)
dr.Read()
labStreet.Text = dr("street_name")
'Me.DataGridView1.DataSource = ds.Tables(0)
Exit Sub
End If
End While
MessageBox.Show("此处不在任何街道上!")
<< 上一页 [11] [12] [13] [14] [15] [16] [17] [18] 下一页