公交車路線查詢系統後台資料庫設計 引入步行路線

2022-03-14 02:22:50 字數 3803 閱讀 8037

公交車路線查詢系統後台資料庫設計系列文章

(該資料庫已經輸入了廣州市350條公交車路線作為測試資料)

在《查詢演算法

》和《關聯地名和站點

》兩篇文章中,已經實現了通過地名或站點進行路線查詢的演算法,但是在現實中,從起點到終點不一定全程都是乘車,例如,有以下3條路線:

r1: s1->s2->s3->s4->s5

r2: s6->s7->s2->s8

r3: s8->s9->s10

假如現在要從站點s1到s7,如果用inquiry查詢路線,顯然沒有合適的乘車方案。但是s2和s7相距僅僅乙個站的距離,可以用步行代替,因此可以先從

s1乘坐r1到

s2再步行到s7。

為了實現在乘車路線中插入步行路線,在資料庫使用walkroute(startstop, endstop, distance, remark)(startstop-起始站點,endstop-目的站點,distance-距離,remark-備註)儲存距離較近的兩個站點。

加入表walkroute

後,查詢演算法也要作相應的修改,其實

walkroute

和routet0

很相似,因此只需把

walkroute

看成是特殊的直達線路即可,修改後的

inqueryt1

如下:

/* 

查詢站點@startstops到站點@endstops之間的一次換乘乘車路線,多個站點用'/'分開,如:

exec inquiryt1 '站點1/站點2','站點3/站點4'

*/ create proc inquiryt1(@startstops varchar(32),@endstops varchar(32))

as begin

declare @ss_tab table(name varchar(32))

declare @es_tab table(name varchar(32))

insert @ss_tab select value from dbo.splitstring(@startstops,'/')

insert @es_tab select value from dbo.splitstring(@endstops,'/')

if(exists(select * from @ss_tab sst,@es_tab est where sst.name=est.name))

begin

raiserror ('起點集和終點集中含有相同的站點',16,1)

return

end

declare @stops table(name varchar(32))

insert @stops select name from @ss_tab

insert @stops select name from @es_tab

declare @result table(

startstop varchar(32),

route1 varchar(256),

transstop varchar(32),

route2 varchar(256),

endstop varchar(32),

stopcount int

) declare @count int

set @count=0

--查詢"步行-乘車"路線

insert @result

select

sst.name as startstop,

'從'+r1.startstop+'步行到'+r1.endstop as route1,

r1.endstop as transstop,

r2.route as route2,

est.name as endstop,

r2.stopcount as stopcount

from

@ss_tab sst,

@es_tab est,

(select * from walkroute where endstop not in (select name from @stops)) r1,

routet0 r2

where

sst.name=r1.startstop

and r1.endstop=r2.startstop

and r2.endstop=est.name

order by r2.stopcount

set @count=@@rowcount

--查詢"乘車-步行"路線

insert @result

select

sst.name as startstop,

r1.route as route1,

r1.endstop as transstop,

'從'+r2.startstop+'步行到'+r2.endstop as route2,

est.name as endstop,

r1.stopcount as stopcount

from

@ss_tab sst,

@es_tab est,

routet0 r1,

(select * from walkroute where startstop not in (select name from @stops)) r2

where

sst.name=r1.startstop

and r1.endstop=r2.startstop

and r2.endstop=est.name

order by r1.stopcount

set @count=@count+@@rowcount

if(@count=0)

begin

--查詢"乘車-乘車"路線

insert @result

select

sst.name as startstop,

r1.route as route1,

r1.endstop as transstop,

r2.route as route2,

est.name as endstop,

r1.stopcount+r2.stopcount as stopcount

from

@ss_tab sst,

@es_tab est,

(select * from routet0 where endstop not in (select name from @stops)) r1,

routet0 r2

where

sst.name=r1.startstop

and r1.endstop=r2.startstop

and r2.endstop=est.name

and r1.route<>r2.route

order by r1.stopcount+r2.stopcount

end

select

startstop as 起始站點,

route1 as 路線1,

transstop as 中轉站點,

route2 as 路線2,

endstop as 目的站點,

stopcount as 總站點數

from

@result

end

e-mail:[email protected]

出處:

公交車路線查詢系統後台資料庫設計 查詢演算法

1.公交車路線資訊在資料庫中的儲存方式 顯然,如果在資料庫中簡單的使用表bus route 路線名 路線經過的站點,費用 來儲存公交車路線的線路資訊,則很難使用查詢語句實現乘車線路查詢,因此,應該對線路的資訊進行處理後再儲存到資料庫中,筆者使用的方法是用站點 路線關係表stop route 站點 路...

洛谷 2233 HNOI2002 公交車路線

題目戳這裡 一句話題意 乙個大小為8的環,求從1到5正好n步的方案數 途中不能經過5 solution 鉅說這個題目很水 應該是比較容易的dp,直接從把左邊和右邊的方案數加起來即可,但是有幾個需要注意的地方 1.因為n有1e7所以需要滾動陣列。2.因為不能經過5,所以4只能從3轉移,6只能從7轉移。...

HNOI2002 公交車路線(矩陣快速冪)題解

題目描述 在長沙城新建的環城公路上一共有8個公交站,分別為a b c d e f g h。公共汽車只能夠在相鄰的兩個公交站之間執行,因此你從某乙個公交站到另外乙個公交站往往要換幾次車,例如從公交站a到公交站d,你就至少需要換3次車。tiger的方向感極其糟糕,我們知道從公交站a到公交e只需要換4次車...