公交查询系统的设计与实现 下载本文

5.2.2换乘算法

当两个线路没有交叉部分的时候就必须换乘,有时候换乘一次就能够到达目的地,有时候需要换乘多次才能到达目的地。

根据出行者输入的起点和终点,确定出行要选择的起始公交站点A和目的公交站点B。搜索数据库,查询站点A和站点B之间是否有相同的车经过,如果有一条或几条直达线路,通过比较选择距离最短的公交线路推荐给出行者。如果没有,则计算站点A和站点B之间有没有一个公共站点C,从站点C可以换乘到达站点B。

这就有两种情况:(1)如果有,属于一次换乘。计算站点A和公共站点C之间有没有相同的公交车经过并存入集合X;同样,计算站点B和公共站点C之间有没有相同的公交车经过并存入集合Y。将这两个集合比较后就可以得到从站点A经过公共站点C到达站点B的公交线路,在这些线路中进行比较,选择距离最短的推荐给出行者。(2)如果没有公共站点C,就出现了要换乘两次的情况。将经过站点A的每条公交线路的所有站点存入集合O;同样,经过站点B的每条线路的所有站点存入集合P。比较这两个集合,先乘经过站点A的某一路车到达某一站点D,计算站点D与站点B之间有没有公共站点E,如果有则站点D、E为换乘站点。这种方案可能有多种,比较选择距离最短的推荐给出行者。如果不存在公共站点E,说明经过两次换乘无法从站点A到达站点B,停止搜索计算 ? 直达算法:

当两个站点之间有直达条件的时候是不需要进行换乘的,可以通过查询实现直达,直达算法为在起始站点和目的站点选择一条不用换乘的车次线路。在线路表中查找其实站点的车辆,形成线路A,在在线路表中查找目的站点,形成线路B,线路A和线路B进行比较,当线路A和线路B中有相交的部分时候说明有直达线路,否则无直达线路,需要换乘车次。

在SQl中的代码如下: select 站点 from

(select 站点 from 线路表) A, (select 站点 from 线路表) B where A.线路 = B.线路

? 一次换乘

根据直达算法,算出起始站的所有车辆信息A,同样的方式算出目的站点所有车辆信息B,然后通过A与B在线路经过站点表中进行比对,找出A与B相交的部分C,由于没有直达的车辆,所以C为A与B站点相交的信息。因此乘客若需要从其实站点到达目的站点需要在相交信息存在的站点下车,并再次乘坐B车辆信息所包含的车辆才能到达目的地。

select 站点 from (

select distinct 站点from 线路表 where线路号 in (select线路号 from 线路过站表where 站点 = 起始站点) )A, (

select distinct 站点from 线路表 where线路号 in (select线路号 from 线路过站表where 站点 = 起始站点) )B

where A.stop_id= B.stop_id

多次换乘主要算法代码如下: Private Sub Command1_Click() Dim rs As New ADODB.Recordset '经过起点A的线路 Dim ArrS() As String Dim ArrE() As String

rs.Open \线路 from 线路过站表 where 站点名称='\& \

Set MSH(0).DataSource = rs

If rs.EOF = True Then

MsgBox \没有可达线路!\ rs.Close Exit Sub End If rs.Close Text1.Text = \

Dim intMaxCol As Integer

rs.Open \线路 from 线路过站表 where 站点名称='\& \

Set MSH(1).DataSource = rs If rs.EOF = True Then

MsgBox \没有可达线路!\ rs.Close Exit Sub End If rs.Close

Dim strFA As String Dim intFA As Integer intFA = 1

For i = 1 To MSH(0).Rows - 1

rs.Open \* from 线路过站表 where 线路 ='\& Trim(MSH(0).TextMatrix(i, 0)) & \站点序号 desc\ If rs.EOF = False Then

ReDim ArrS(rs.RecordCount - 1) rs.MoveFirst

For k = 0 To rs.RecordCount - 1

ArrS(k) = Trim(rs.Fields(\站点名称\ rs.MoveNext Next rs.Close

For j = 1 To MSH(1).Rows - 1

If Trim(MSH(0).TextMatrix(i, 0)) = Trim(MSH(1).TextMatrix(j, 0)) Then

strFA = \乘坐 \直达\

Text1.Text = Text1.Text & intFA & \ intFA = intFA + 1 strFA = \ Else

rs.Open \* from 线路过站表 where 线路 ='\& Trim(MSH(1).TextMatrix(j, 0)) & \站点序号 desc\

If rs.EOF = False Then

ReDim ArrE(rs.RecordCount - 1) rs.MoveFirst

For k = 0 To rs.RecordCount - 1

ArrE(k) = Trim(rs.Fields(\站点名称\ rs.MoveNext Next rs.Close strFA = \

For m = 0 To UBound(ArrS) For n = 0 To UBound(ArrE) If ArrS(m) = ArrE(n) Then strFA

=

\

\

&