專利名稱:一種跨區(qū)域路徑搜索方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及地理信息系統(tǒng)(Geographic Information System, GIS)領(lǐng)域,尤其涉 及一種路徑結(jié)果文字描述及跨區(qū)域路徑搜索方法及裝置。
背景技術(shù):
車輛導航系統(tǒng)就是為行駛在城市道路網(wǎng)中的車輛,從當前所處位置到目的地提供 有效、精確、快速的行車路線,并引導車輛到達目的地。因而,車輛導航系統(tǒng)的一個基本問題 就是路徑規(guī)劃。現(xiàn)實情況下有可能涉及大范圍的道路網(wǎng)絡查詢。例如,私人用戶經(jīng)常需要 驅(qū)車到另外的城市,此時道路計算所需要的網(wǎng)絡就不能僅限于一個城市或一塊區(qū)域,涉及 到的道路網(wǎng)絡面積是非常龐大的。而一個城市一般來說需要占用幾十兆甚至上百兆的內(nèi) 存,這種拓撲網(wǎng)絡的數(shù)據(jù)量都是海量級的,也就是說,如果建立全國道路網(wǎng)絡并全部一次映 射到內(nèi)存中來計算,是不現(xiàn)實的,也是不科學的。因此,對于跨城市的路徑規(guī)劃由于內(nèi)存占 用等問題,需要將不同城市建立不同的拓撲網(wǎng)絡,相對于單城市的路徑規(guī)劃要復雜許多。同 時對于路徑規(guī)劃計算出的結(jié)果,由于系統(tǒng)需要,往往返回結(jié)果一系列的LinkID,需要增加路 徑的文字描述。目前,有學者通過在拐點輸入預設信息來解決這個問題,需要存儲大量文字 和進行預處理。
發(fā)明內(nèi)容
為了解決上述的技術(shù)問題,提供了一種跨區(qū)域路徑搜索方法及裝置,其目的在于, 實現(xiàn)高效跨區(qū)域?qū)Ш铰窂剿阉鳎Ш铰窂浇Y(jié)果動態(tài)給出文字描述結(jié)果。本發(fā)明提供了一種路徑結(jié)果文字描述方法,包括步驟A,獲取路徑結(jié)果中順次連接的第一弧段和第二弧段的名稱、方向和長度;步驟B,如果第一弧段的名稱和第二弧段的名稱相同,則記錄并顯示第一弧段或第 二弧段的方向以及第一弧段的長度與第二弧段的長度之和;如果第一弧段的名稱和第二弧段的名稱不同,則記錄并顯示第一弧段的方向和長 度,并且記錄和顯示第一弧段向第二弧段的轉(zhuǎn)向狀態(tài)以及第二弧段的方向和長度。步驟A中,第一弧段或第二弧段的方向用方向角算法求得。步驟A中,第一弧段或第二弧段的方向按照下列步驟計算步驟Al,獲取第一弧段或第二弧段的兩個端點的坐標(tl.x,tl.y)和(t2. x, t2. y);步驟A2,計算 dx = t2. x-tl. χ, dy = t2. y-tl. y ;如果dx = 0且dy > 0,則方向為“北”;如果dx = 0且dy < 0,則方向為“南”;如果dx > 0,計算 d = dy/dx 如果d> 2. 747,則方向為“北”;如果0. 364 < d < 2. 747,則方向為“東北”;如果-0.364 < d < 0. 364,則方向為“東”;
如果-2.747 < d < -0. 364,則方向為“東南”;如果d<-2. 747,則方向為“南”;如果dx < 0,計算 d = dy/dx 如果d> 2. 747,則方向為“南”;如果0. 364 < d < 2. 747,則方向為“西南”;如果-0.364 < d < 0. 364,則方向為“西”;如果-2.747 < d < -0. 364,則方向為“西北”;如果d<-2. 747,則方向為“北”。步驟B中,第一弧段向第二弧段的轉(zhuǎn)向狀態(tài)用轉(zhuǎn)向角算法求得。步驟B中,第一弧段向第二弧段的轉(zhuǎn)向狀態(tài)依據(jù)下列步驟計算步驟Bi,獲取第一弧段和第二弧段的三個端點的坐標(tl.x,tl.y)、(t2.x,t2.y) 禾口(t3. x,t3. y);步驟B2,計算矢量(tl. X,tl. y)- > (t2. χ, t2. y)與矢量(t2. χ, t2. y)- > (t3. X,t3. y)的內(nèi)積innerp和外積outp 如果outp = 0,則轉(zhuǎn)向狀態(tài)為“直行”;如果outp < 0,并且innerp = 0,則轉(zhuǎn)向狀態(tài)為“右轉(zhuǎn)”;如果outp < 0,并且innerp 不為0,則計算tanp = outp/innerp ;如果tanp彡_1或tanp彡1,則轉(zhuǎn)向狀態(tài)為“右轉(zhuǎn)”; 0 < tanp < 1,則轉(zhuǎn)向狀態(tài)為“右轉(zhuǎn)掉頭”;如果-1 < tanp < 0,并且第一弧段和第二弧段 同名,則轉(zhuǎn)向狀態(tài)為“直行”;如果-1 < tanp < 0,第一弧段和第二弧段不同名,且不存在從 (t2.x, t2.y)出發(fā)的其他弧段,則轉(zhuǎn)向狀態(tài)為“直行”;如果-1 < tanp < 0,第一弧段和第 二弧段不同名,存在從(t2.x,t2.y)出發(fā)到端點(t4.x,t4.y)的弧段,則計算矢量(t2. X, t2. y)- > (t3. x,t3. y)與矢量(t2. χ, t2. y)- > (t4. x,t4. y)的外積,如果該外積大于 0, 則轉(zhuǎn)向狀態(tài)為“靠右”,如果該外積小于0,則轉(zhuǎn)向狀態(tài)為“靠左”;如果outp > 0,并且innerp = 0,則轉(zhuǎn)向狀態(tài)為“左轉(zhuǎn)”;如果outp > 0,并且innerp 不為0,則計算tanp = outp/innerp ;如果tanp彡_1或tanp彡1,則轉(zhuǎn)向狀態(tài)為“左轉(zhuǎn)”; 如果-1 < tanp < 0,則轉(zhuǎn)向狀態(tài)為“左轉(zhuǎn)掉頭”;如果0 < tanp < 1,并且第一弧段和第二 弧段同名,則轉(zhuǎn)向狀態(tài)為“直行”;如果0 < tanp < 1,第一弧段和第二弧段不同名,并且不 存在從(t2. x,t2. y)出發(fā)的其他弧段,則轉(zhuǎn)向狀態(tài)為“直行”;如果0 < tanp < 1,第一弧段 和第二弧段不同名,并且存在從(t2.x,t2. y)出發(fā)到端點(t4.x,t4. y)的弧段,則計算矢量 (t2. X,t2. y)- > (t3. x,t3. y)與矢量(t2. χ, t2. y)- > (t4. x,t4. y)的外積,如果該外積 大于0,則轉(zhuǎn)向狀態(tài)為“靠右”,如果該外積小于0,則轉(zhuǎn)向狀態(tài)為“靠左”。第一弧段、第二弧段的長度或第一弧段的長度與第二弧段的長度之和大于或等于 1000米,則換算為公里進行顯示。本發(fā)明提供了一種路徑結(jié)果文字描述裝置,包括參數(shù)獲取模塊,用于獲取路徑結(jié)果中順次連接的第一弧段和第二弧段的名稱、方 向和長度;文字描述模塊,用于在第一弧段的名稱和第二弧段的名稱相同時,記錄并顯示第 一弧段或第二弧段的方向以及第一弧段的長度與第二弧段的長度之和;在第一弧段的名稱 和第二弧段的名稱不同時,記錄并顯示第一弧段的方向和長度,并且記錄和顯示第一弧段向第二弧段的轉(zhuǎn)向狀態(tài)以及第二弧段的方向和長度。參數(shù)獲取模塊使用方向角算法求得第一弧段或第二弧段的方向。參數(shù)獲取模塊,用于獲取第一弧段或第二弧段的兩個端點的坐標(tl. χ, tl. y)和 (t2. χ, t2. y);計算 dx = t2. χ-tl. χ, dy = t2. y-tl. y ;如果dx = 0且dy > 0,則參數(shù)獲取模塊獲取的方向為“北”;如果dx = 0且dy < 0,則參數(shù)獲取模塊獲取的方向為“南”;如果dx > 0,計算 d = dy/dx 如果d > 2. 747,則參數(shù)獲取模塊獲取的方向為“北”;如果0. 364 < d < 2. 747,則參數(shù)獲取模塊獲取的方向為“東北”;如果-0. 364 < d < 0. 364,則參數(shù)獲取模塊獲取的方向為“東”;如果-2. 747 < d < -0. 364,則參數(shù)獲取模塊獲取的方向為“東南”;如果d < -2. 747,則參數(shù)獲取模塊獲取的方向為“南”;如果dx < 0,計算 d = dy/dx 如果d > 2. 747,則參數(shù)獲取模塊獲取的方向為“南”;如果0. 364 < d < 2. 747,則參數(shù)獲取模塊獲取的方向為“西南”;如果-0. 364 < d < 0. 364,則參數(shù)獲取模塊獲取的方向為“西”;如果-2. 747 < d < -0. 364,則參數(shù)獲取模塊獲取的方向為“西北”;如果d < -2. 747,則參數(shù)獲取模塊獲取的方向為“北”。文字描述模塊使用轉(zhuǎn)向角算法求得第一弧段向第二弧段的轉(zhuǎn)向狀態(tài)。文字描述模塊,用于獲取第一弧段和第二弧段的三個端點的坐標(tl.x,tl.y)、 (t2. x,t2. y)禾口(t3. x,t3. y);計算矢量(tl. χ, tl. y)_ > (t2. χ, t2. y)與矢量(t2. χ, t2. y)- > (t3. x,t3. y)的內(nèi)積 innerp 禾口夕卜積 outp 如果outp = 0,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“直行”;如果outp < 0,并且irmerp = 0,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“右 轉(zhuǎn)”;如果 OUtp < 0,并且 innerp 不為 0,則計算 tanp = outp/innerp ;如果 tanp < _1 或 tanp ^ 1,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“右轉(zhuǎn)”;0 < tanp < 1,則文字描述模塊 記錄并顯示轉(zhuǎn)向狀態(tài)為“右轉(zhuǎn)掉頭”;如果-1 < tanp < 0,并且第一弧段和第二弧段同名,則 文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“直行”;如果-1 < tanp < 0,第一弧段和第二弧段不 同名,且不存在從(t2.x,t2.y)出發(fā)的其他弧段,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為 “直行”;如果-1 < tanp < 0,第一弧段和第二弧段不同名,存在從(t2. x,t2. y)出發(fā)到端點 (t4. X,t4. y)的弧段,則計算矢量(t2. X,t2. y)- > (t3. χ, t3. y)與矢量(t2. χ, t2. y)- > (t4. χ, t4. y)的外積,如果該外積大于0,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“靠右”, 如果該外積小于0,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“靠左”;如果outp > 0,并且irmerp = 0,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“左 轉(zhuǎn)”;如果 OUtp > 0,并且innerp 不為 0,則計算 tanp = outp/innerp ;如果 tanp < _1 或 tanp ^ 1,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“左轉(zhuǎn)”;如果-1 < tanp < 0,則文字描述 模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“左轉(zhuǎn)掉頭”;如果0 < tanp < 1,并且第一弧段和第二弧段同 名,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“直行”;如果0 < tanp < 1,第一弧段和第二弧 段不同名,并且不存在從(t2.x,t2.y)出發(fā)的其他弧段,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“直行”;如果O < tanp < 1,第一弧段和第二弧段不同名,并且存在從(t2.x,t2. y) 出發(fā)到端點(t4. χ, t4. y)的弧段,則計算矢量(t2. χ, t2. y)-> (t3. χ, t3. y)與矢量(t2. x,t2. y)-> (t4.x,t4. y)的外積,如果該外積大于0,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài) 為“靠右”,如果該外積小于0,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“靠左”。第一弧段、第二弧段的長度或第一弧段的長度與第二弧段的長度之和大于或等于 1000米,則換算為公里進行顯示。本發(fā)明提供了一種跨區(qū)域路徑搜索方法,包括步驟1,加載全國路網(wǎng)索引表以及常用的網(wǎng)絡圖層至內(nèi)存;全國路網(wǎng)索引表中包 含起點城市的名稱、終點城市的名稱、起點城市的出口、終點城市的入口、起點城市的出口 的坐標、終點城市的入口的坐標以及起點城市和終點城市之間的路徑類型;步驟2,根據(jù)起點名稱和終點名稱判斷與起點城市或終點城市是否已被加載到內(nèi) 存,如果沒有,將相應的網(wǎng)絡圖層加載到內(nèi)存;起點名稱包括起點城市以及在該起點城市中 的具體位置,終點名稱包括終點城市以及在該終點城市中的具體位置;起點城市和終點城 市不同;步驟3,從全國路網(wǎng)索引表中查詢起點城市和終點城市之間的路徑類型、起點城市 對應的城市出口點的坐標和終點城市的對應的城市入口點的坐標,得到第二段路徑;步驟4,查詢起點城市中從該起點城市中的具體位置到對應的城市出口點的最短 路徑,得到第一段路徑;步驟5,查詢終點城市中從對應的城市入口點到該終點城市中的具體位置的最短 路徑,得到第三段路徑;步驟6,返回第一段路徑、第二段路徑和第三段路徑作為跨區(qū)域路徑搜索結(jié)果。還包括步驟7,獲取跨區(qū)域路徑搜索結(jié)果中順次連接的第一弧段和第二弧段的名稱、方向 和長度;步驟8,如果第一弧段的名稱和第二弧段的名稱相同,則記錄并顯示第一弧段或第 二弧段的方向以及第一弧段的長度與第二弧段的長度之和;如果第一弧段的名稱和第二弧段的名稱不同,則記錄并顯示第一弧段的方向和長 度,并且記錄和顯示第一弧段向第二弧段的轉(zhuǎn)向狀態(tài)以及第二弧段的方向和長度。步驟7中,第一弧段或第二弧段的方向用方向角算法求得。步驟7中,第一弧段或第二弧段的方向按照下列步驟計算步驟71,獲取第一弧段或第二弧段的兩個端點的坐標(tl.x,tl.y)和(t2. x, t2. y);步驟72,計算 dx = t2. x_tl. χ, dy = t2. y-tl. y ;如果dx = 0且dy > 0,則方向為“北”;如果dx = 0且dy < 0,則方向為“南”; 如果dx > 0,計算 d = dy/dx 如果d> 2. 747,則方向為“北”;如果0. 364 < d < 2. 747,則方向為“東北”;如果-0.364 < d < 0. 364,則方向為“東”;如果-2.747 < d < -0. 364,則方向為“東南”;
如果d<-2. 747,則方向為“南”;如果dx < 0,計算 d = dy/dx 如果d> 2. 747,則方向為“南”;如果0. 364 < d < 2. 747,則方向為“西南”;如果-0.364 < d < 0. 364,則方向為“西”;如果-2.747 < d < -0. 364,則方向為“西北”;如果d<-2. 747,則方向為“北”。步驟8中,第一弧段向第二弧段的轉(zhuǎn)向狀態(tài)用轉(zhuǎn)向角算法求得。步驟8中,第一弧段向第二弧段的轉(zhuǎn)向狀態(tài)依據(jù)下列步驟計算步驟81,獲取第一弧段和第二弧段的三個端點的坐標(tl.x,tl.y)、(t2.x,t2.y) 禾口(t3. x,t3. y);步驟82,計算矢量(tl. X,tl. y)- > (t2. χ, t2. y)與矢量(t2. χ, t2. y)- > (t3. X,t3. y)的內(nèi)積innerp和外積outp 如果outp = 0,則轉(zhuǎn)向狀態(tài)為“直行”;如果outp < 0,并且innerp = 0,則轉(zhuǎn)向狀態(tài)為“右轉(zhuǎn)”;如果outp < 0,并且innerp 不為0,則計算tanp = outp/innerp ;如果tanp彡_1或tanp彡1,則轉(zhuǎn)向狀態(tài)為“右轉(zhuǎn)”; 0 < tanp < 1,則轉(zhuǎn)向狀態(tài)為“右轉(zhuǎn)掉頭”;如果-1 < tanp < 0,并且第一弧段和第二弧段 同名,則轉(zhuǎn)向狀態(tài)為“直行”;如果-1 < tanp < 0,第一弧段和第二弧段不同名,且不存在從 (t2.x, t2.y)出發(fā)的其他弧段,則轉(zhuǎn)向狀態(tài)為“直行”;如果-1 < tanp < 0,第一弧段和第 二弧段不同名,存在從(t2.x,t2.y)出發(fā)到端點(t4.x,t4.y)的弧段,則計算矢量(t2. X, t2. y)- > (t3. x,t3. y)與矢量(t2. χ, t2. y)- > (t4. x,t4. y)的外積,如果該外積大于 0, 則轉(zhuǎn)向狀態(tài)為“靠右”,如果該外積小于0,則轉(zhuǎn)向狀態(tài)為“靠左”;如果outp > 0,并且innerp = 0,則轉(zhuǎn)向狀態(tài)為“左轉(zhuǎn)”;如果outp > 0,并且innerp 不為0,則計算tanp = outp/innerp ;如果tanp彡_1或tanp彡1,則轉(zhuǎn)向狀態(tài)為“左轉(zhuǎn)”; 如果-1 < tanp < 0,則轉(zhuǎn)向狀態(tài)為“左轉(zhuǎn)掉頭”;如果0 < tanp < 1,并且第一弧段和第二 弧段同名,則轉(zhuǎn)向狀態(tài)為“直行”;如果0 < tanp < 1,第一弧段和第二弧段不同名,并且不 存在從(t2. x,t2. y)出發(fā)的其他弧段,則轉(zhuǎn)向狀態(tài)為“直行”;如果0 < tanp < 1,第一弧段 和第二弧段不同名,并且存在從(t2.x,t2. y)出發(fā)到端點(t4.x,t4. y)的弧段,則計算矢量 (t2. X,t2. y)- > (t3. x,t3. y)與矢量(t2. χ, t2. y)- > (t4. x,t4. y)的外積,如果該外積 大于0,則轉(zhuǎn)向狀態(tài)為“靠右”,如果該外積小于0,則轉(zhuǎn)向狀態(tài)為“靠左”。第一弧段、第二弧段的長度或第一弧段的長度與第二弧段的長度之和大于或等于 1000米,則換算為公里進行顯示。
本發(fā)明提供了一種跨區(qū)域路徑搜索裝置,包括數(shù)據(jù)加載模塊,用于加載全國路網(wǎng)索引表以及常用的網(wǎng)絡圖層至內(nèi)存;全國路網(wǎng) 索引表中包含起點城市的名稱、終點城市的名稱、起點城市的出口、終點城市的入口、起點 城市的出口的坐標以及終點城市的入口的坐標;根據(jù)起點名稱和終點名稱判斷與起點城市 或終點城市是否已被加載到內(nèi)存,如果沒有,將相應的網(wǎng)絡圖層加載到內(nèi)存;起點名稱包括 起點城市以及在該起點城市中的具體位置,終點名稱包括終點城市以及在該終點城市中的 具體位置;起點城市和終點城市不同;
跨區(qū)域路徑獲取模塊,用于從全國路網(wǎng)索引表中查詢起點城市和終點城市之間的 路徑類型、起點城市對應的城市出口點和終點城市的對應的城市入口點,得到第二段路徑; 查詢起點城市中從該起點城市中的具體位置到對應的城市出口點的最短路徑,得到第一段 路徑;查詢終點城市中從對應的城市入口點到該終點城市中的具體位置的最短路徑,得到 第三段路徑;返回第一段路徑、第二段路徑和第三段路徑作為跨區(qū)域路徑搜索結(jié)果。還包括參數(shù)獲取模塊,用于獲取路徑結(jié)果中順次連接的第一弧段和第二弧段的名稱、方 向和長度;文字描述模塊,用于在第一弧段的名稱和第二弧段的名稱相同時,記錄并顯示第 一弧段或第二弧段的方向以及第一弧段的長度與第二弧段的長度之和;在第一弧段的名稱 和第二弧段的名稱不同時,記錄并顯示第一弧段的方向和長度,并且記錄和顯示第一弧段 向第二弧段的轉(zhuǎn)向狀態(tài)以及第二弧段的方向和長度。參數(shù)獲取模塊使用方向角算法求得第一弧段或第二弧段的方向。參數(shù)獲取模塊,用于獲取第一弧段或第二弧段的兩個端點的坐標(tl. χ, tl. y)和 (t2. χ, t2. y);計算 dx = t2. χ-tl. χ, dy = t2. y-tl. y ;如果dx = O且dy > 0,則參數(shù)獲取模塊獲取的方向為“北”;如果dx = 0且dy < 0,則參數(shù)獲取模塊獲取的方向為“南”;如果dx > 0,計算 d = dy/dx 如果d > 2. 747,則參數(shù)獲取模塊獲取的方向為“北”;如果0. 364 < d < 2. 747,則參數(shù)獲取模塊獲取的方向為“東北”;如果-0. 364 < d < 0. 364,則參數(shù)獲取模塊獲取的方向為“東”;如果-2. 747 < d < -0. 364,則參數(shù)獲取模塊獲取的方向為“東南”;如果d < -2. 747,則參數(shù)獲取模塊獲取的方向為“南”;如果dx < 0,計算 d = dy/dx 如果d > 2. 747,則參數(shù)獲取模塊獲取的方向為“南”;如果0. 364 < d < 2. 747,則參數(shù)獲取模塊獲取的方向為“西南”;如果-0. 364 < d < 0. 364,則參數(shù)獲取模塊獲取的方向為“西”;如果-2. 747 < d < -0. 364,則參數(shù)獲取模塊獲取的方向為“西北”;如果d < -2. 747,則參數(shù)獲取模塊獲取的方向為“北”。文字描述模塊使用轉(zhuǎn)向角算法求得第一弧段向第二弧段的轉(zhuǎn)向狀態(tài)。文字描述模塊,用于獲取第一弧段和第二弧段的三個端點的坐標(tl.x,tl.y)、 (t2. x,t2. y)禾口(t3. x,t3. y);計算矢量(tl. χ, tl. y)_ > (t2. χ, t2. y)與矢量(t2. χ, t2. y)- > (t3. x,t3. y)的內(nèi)積 innerp 禾口夕卜積 outp 如果outp = 0,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“直行”;如果outp < 0,并且irmerp = 0,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“右 轉(zhuǎn)”;如果 OUtp < 0,并且 innerp 不為 0,則計算 tanp = outp/innerp ;如果 tanp < _1 或 tanp ^ 1,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“右轉(zhuǎn)”;0 < tanp < 1,則文字描述模塊 記錄并顯示轉(zhuǎn)向狀態(tài)為“右轉(zhuǎn)掉頭”;如果-1 < tanp < 0,并且第一弧段和第二弧段同名,則 文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“直行”;如果-1 < tanp < 0,第一弧段和第二弧段不同名,且不存在從(t2.x,t2.y)出發(fā)的其他弧段,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為 “直行”;如果-I < tanp < 0,第一弧段和第二弧段不同名,存在從(t2. x,t2. y)出發(fā)到端點 (t4. X,t4. y)的弧段,則計算矢量(t2. X,t2. y)- > (t3. χ, t3. y)與矢量(t2. χ, t2. y)- > (t4. χ, t4. y)的外積,如果該外積大于0,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“靠右”, 如果該外積小于0,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“靠左”;如果outp > 0,并且irmerp = 0,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“左 轉(zhuǎn)”;如果 OUtp > O,并且 innerp 不為 0,則計算 tanp = outp/innerp ;如果 tanp < _1 或 tanp ^ 1,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“左轉(zhuǎn)”;如果-1 < tanp < 0,則文字描述 模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“左轉(zhuǎn)掉頭”;如果0 < tanp < 1,并且第一弧段和第二弧段同 名,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“直行”;如果0 < tanp < 1,第一弧段和第二弧 段不同名,并且不存在從(t2.x,t2.y)出發(fā)的其他弧段,則文字描述模塊記錄并顯示轉(zhuǎn)向 狀態(tài)為“直行”;如果0 < tanp < 1,第一弧段和第二弧段不同名,并且存在從(t2. χ, t2. y) 出發(fā)到端點(t4. χ, t4. y)的弧段,則計算矢量(t2. χ, t2. y)-> (t3. x, t3. y)與矢量(t2. x,t2. y)-> (t4.x,t4. y)的外積,如果該外積大于0,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài) 為“靠右”,如果該外積小于0,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“靠左”。第一弧段、第二弧段的長度或第一弧段的長度與第二弧段的長度之和大于或等于 1000米,則換算為公里進行顯示。本發(fā)明能夠高效地實現(xiàn)跨區(qū)域?qū)Ш铰窂剿阉鳎Ш铰窂浇Y(jié)果動態(tài)給出文字描 述結(jié)果,彌補了靜態(tài)的在交叉點上預設導航信息導致效率不足的問題。
圖1為內(nèi)存調(diào)度方案;圖2為跨城市自駕車最短路徑查詢流程圖;圖3為單城市路徑查詢流程圖;圖4為路徑結(jié)果文字描述舉例;圖5為路徑結(jié)果文字描述流程圖;圖6為方向角算法圖;圖7為方向角算法問題分析圖;圖8為轉(zhuǎn)向角算法圖;圖9為轉(zhuǎn)向角算法問題分析圖;圖10為路徑描述舉例。
具體實施例方式考慮到效率優(yōu)先原則,首先將省級城市之間的道路作為預設信息進行存儲,包括 高速公路或國道等類型。在全國路網(wǎng)上采用空間換時間的方法,將各省之間道路選擇方案 采用本地搜索方式;各省網(wǎng)絡隨需求加載入內(nèi)存。全國路網(wǎng)索引結(jié)構(gòu)如表1所示。其中,ID作為主鍵,由〈cityid-cityid〉構(gòu)成的列 表作為表項,表示起始城市和終止城市的ID連接,其含義是從某一個省級城市至另一個省 級城市。省級城市ID表如表2,例如“北京”為beijing,“上?!睘閟hanghai,山西為shanxi,陜西為shan3xi。因此,從北京至上海的記錄ID值即為“bei jing-shanghai ”。表 1 表2 全國路網(wǎng)索引表中還記錄了起始點和終止點的相關(guān)信息,包括起始城市CITYA, 起始城市出口 POINTA,POINTA的坐標[AX,AY]及終止城市CITYB,終止城市入口 Ρ0ΙΝΤΒ, POINTB 的坐標[BX, BY]。此外,該表中記錄了城市之間路徑的描述信息及類型。描述信息按照系統(tǒng)習慣進 行處理,類型釆用整型,1代表高速,2代表國道,3代表普通道路。全國內(nèi)陸一共31個省,因此索引表格每種路徑類型需要建立映射關(guān)系A(chǔ)231 = 930 條文本記錄?;谏鲜鋈珖肪W(wǎng)索引結(jié)構(gòu),可以在進行跨城市路徑查詢時提供快速處理方案。(一)內(nèi)存調(diào)度方案如圖1,系統(tǒng)啟動時,首先將幾個常用的省的網(wǎng)絡圖層從數(shù)據(jù)庫中讀出,放入服務 器內(nèi)存中,同時,將全國路網(wǎng)索引結(jié)構(gòu)表讀入內(nèi)存。每個用戶請求為一個線程,有其唯一的 活躍圖層指針(currentLayerP),將currentLayerP默認選擇beijing。內(nèi)存中最多只允許 放4-5個省級圖層,用戶需求發(fā)生變化,或相隔一段時間后,進行內(nèi)存圖層掃描,將使用次 數(shù)最少的圖層釋放。(二)路徑搜索策略
具體路徑搜索流程如圖2,步驟如下步驟1 系統(tǒng)啟動時,加載網(wǎng)絡圖層及全國路網(wǎng)索引表至內(nèi)存,將currentLayerP默認選擇bei jingo步驟2 收到用戶給出請求及四個參數(shù),分別記錄起點from和終點to,以及起點城 市fromCity和終點城市toCity,同時給出請求路徑類型。判斷fromCity與toCity是否相 同,是轉(zhuǎn)步驟3,否則轉(zhuǎn)步驟4。步驟3 調(diào)用單城市路徑查詢接口。將currentLayerP指向fromCity,查詢from 至to的最短路徑,返回結(jié)果。步驟4 進行跨區(qū)域異構(gòu)路網(wǎng)查詢。首先從全國路網(wǎng)索引結(jié)構(gòu)表中查詢fromCity 至toCity (ID = fromCity-toCity)的跨城市路徑及對應的城市出口點坐標值fromP[Ax, Ay]、入口點坐標值toP[Bx,By]以及路徑類型??绯鞘新窂綖樽罱K結(jié)果的第二段路徑 secondroute。步驟5 調(diào)用單城市路徑查詢接口。將currentLayerP指向fromCity圖層,查詢 從from至fromP之間的最短路徑,作為最終結(jié)果的第一段路徑firstroute。在該步驟中, 如果起點城市不存在于內(nèi)存中,則將起點城市加載至內(nèi)存中。步驟6 調(diào)用單城市路徑查詢接口。將currentLayerP指向toCity圖層,查詢從 toP至to之間的最短路徑,作為最終結(jié)果的第三段路徑thirdroute。在該步驟中,如果終 點城市不存在于內(nèi)存中,則將終點城市加載至內(nèi)存中。步驟7 返回三段路徑(firstroute+secondroute+thirdroute),即成為跨城市自 駕車行駛導引結(jié)果。單城市路徑查詢接口流程如圖3,查詢最短路徑前,需判斷city是否在內(nèi)存中,存 在則直接進行搜索,否則調(diào)用內(nèi)存調(diào)度算法,將city加載進內(nèi)存,再進行最短路徑查詢。(三)文字描述算法增加用戶的使用方便性與易讀性,需要將結(jié)果表示如圖4所示。本發(fā)明設計和構(gòu) 造了方向角算法和轉(zhuǎn)向角算法以解決文字描述問題。文字描述的基本格式為“起點:<PointName/RoadName>1)進入 <RoadName> 向 <DirectionXNumber> 公里 / 米;2) <TurningXRoadName> 向 <DirectionXNumber> 公里 / 米;3) <TurningXRoadName> 向 <DirectionXNumber> 公里 / 米;4)〈Turning〉向 <DirectionXNumber> 公里 / 米;5) <TurningXRoadName> 向 <DirectionXNumber> 公里 / 米到達.終點<PointName/RoadName>,,
表3 其中字段具體含義參考表3。其中當路徑名稱〈RoadName〉發(fā)生變化時,給出分 條描述。如果轉(zhuǎn)彎后的路段沒有〈RoadName〉,則省略“進入〈RoadName〉”,例如上述第4條 "<Turning> 向 <Direction>,,。下面給出具體轉(zhuǎn)化方法。在路徑分析中,搜索的計算結(jié)果一般采用矢量數(shù)據(jù)格式表 示,矢量數(shù)據(jù)模型一般用χ、y坐標和點、線、面簡單幾何對象來表示空間要素,既存儲矢量的 坐標信息,又包含屬性信息,例如,弧段是道路的抽象,其屬性信息一般包括路徑代號、路徑名 稱、起始節(jié)點、終止節(jié)點、長度(例如米為單位)等等,對于每條弧段,通過構(gòu)造方法getNameO 及getCostO獲得該弧段的名稱及長度,因此,〈RoadName〉和〈Number〉可以通過簡單的查 找和累加計算獲得。路徑結(jié)果按照路徑順序記錄了一系列弧段數(shù)組及相關(guān)的節(jié)點數(shù)組,因為 一條弧段有兩個節(jié)點,因此節(jié)點數(shù)組數(shù)目比弧段數(shù)組數(shù)目多1,它的表示格式如下edgesb], vertexs[n+l]。稍后將介紹獲取〈Direction〉及〈Turning〉的構(gòu)造方法 getDirection ()及 getTurnO。對于輸入的矢量路徑結(jié)果,轉(zhuǎn)化步驟如下,程序流程圖如圖5所示步驟1 初始化字符串str = “ ”,浮點型cost = 0,整型index = 1,調(diào)用edges
的getName ()方法獲得第一條弧段name,轉(zhuǎn)步驟2。步驟2 判斷name是否為空,如果不為空,則str+=“1)進入”+name,轉(zhuǎn)步驟3, 否則str+= “1)”,轉(zhuǎn)步驟3。步驟3 調(diào)用 edges
的 getDirection()和 getCostO 獲得〈Direction〉和 cost, Str+ = “向”+〈Direction〉,轉(zhuǎn)步驟 4。步驟4 判斷edges是否還有弧段,如果沒有則轉(zhuǎn)步驟7,否則獲取edges的下一條 弧段 edges[i],調(diào)用 getTurnO 方法獲取該弧段〈Turning〉。判斷 edges[i]-> getName () 是否等于 edges [i-1] - > getName (),如果相等,則 cost+ = edges [i] - > getCost (),轉(zhuǎn)步 驟4,否則轉(zhuǎn)步驟5 ;i為自然數(shù)。步驟5 判斷cost是否小于1000,如果是,則str+ = cost+ “米;”,轉(zhuǎn)6,否則將 cost轉(zhuǎn)化為公里單位,Str+ = cost+ “公里;”,轉(zhuǎn)6。步驟 6 index 自力口 1, str+ = index+ “)”+<Turning>+edges [i] - > getName ()。str+ = “@,,+edges[i]_ > getDirection(),cost = edges[i]- > getCost (),4。步驟7 判斷cost是否小于1000,如果是,則str+ = cost+ “米到達· ”,算法返 回,否則將cost轉(zhuǎn)化為公里單位,str+ = cost+ “公里到達.”,算法返回。下面介紹獲得〈Direction〉的算法getDirection()及獲得〈Turning〉的算法 getTu rn ()。〈Direction〉主要指車輛行駛過程中的方向,例如東、南、西、北、東北、西北、東南、 西南。可以用方向角算法求得。方向角(direction angle)指的是采用某坐標軸方向作為 標準方向所確定的角度,一般是指以觀測者的位置為中心,將正北或正南方向作為起始方 向旋轉(zhuǎn)到目標的方向線所成的角(一般指銳角),通常表達成北(南)偏東(西)X X度。 為了簡明,本文只選用東、南、西、北、東北、西北、東南、西南八個方向。方向角算法需要一條 弧段,并返回一條弧段對應的方向。因為實際道路正南正北的比較少,因此可以認為角度在 一定范圍內(nèi)屬于南或北,角度范圍及判定表如圖6所示。具體流程如圖7所示,步驟如下輸入一段弧兩端點tl,t2步驟 1 計算 dx = t2. x-tl. x,dy = t2. y-tl. y。步驟2 如果dx不等于0,轉(zhuǎn)步驟3,否則判斷dy是否大于零,若dy > 0,則返回 “北”,否則,返回“南”。步驟3 如果dx < 0,轉(zhuǎn)步驟4,否則計算d = dy/dx 如果d> 2. 747,返回“北”,0. 364 < d < 2. 747,返回“東北”,-0. 364 < d < 0. 364,返回“東,,,-2. 747 < d <-0. 364,返回“東南”,d <-2. 747,返回“南”。步驟4 計算d = dy/dx,如果d> 2. 747,返回“南”,0. 364 < d < 2. 747,返回“西南”,-0. 364 < d < 0. 364,返回“西”,-2. 747 < d < -0. 364,返回“西北”,d <-2. 747,返回“北”?!碩urning〉是指轉(zhuǎn)向,是在面對交叉口時下一步的行駛選擇,通常有以下幾種直 行、左轉(zhuǎn)、右轉(zhuǎn)、左轉(zhuǎn)掉頭、右轉(zhuǎn)掉頭、靠左、靠右。其中靠左、靠右在直行的范圍內(nèi)針對兩種 交叉路段進行的判斷,是面臨分叉路口的更精細選擇。一般可以通過轉(zhuǎn)向角算法求得。轉(zhuǎn) 向角算法需要兩條弧段,并返回前后兩條弧組成的折線轉(zhuǎn)向狀態(tài)。算法需要計算兩條弧 段的內(nèi)外積,設當前段弧段為α,下一條弧段為β,根據(jù)內(nèi)外積數(shù)學公式,外積α X β =
α I · I β I · Sin< α,β >,內(nèi)積 α · β = | α | · | β 卜 Cos< α,β >。α X β =0,表示α、β平行,或正向或反向,然而在實際路網(wǎng)中,不存在直接反向 掉轉(zhuǎn),因此,當α X β = 0可直接歸為直行;α X β > 0,表示α在β的順時針方向,所以β是向左側(cè)轉(zhuǎn)。α X β < 0,表示α在β的逆時針方向,所以β是向右側(cè)轉(zhuǎn)。由于tan<a,3>=aX3/a.3,ia.3^0 時,如圖 8 所示根據(jù) tan< α, β >判斷轉(zhuǎn)向。實際路網(wǎng)往往不是很規(guī)則的直線,存在某個區(qū)段上符合某種可能的情況。具體流程如圖9所示,步驟如下輸入兩條連接弧段的三個端點tl,t2,t3。步驟1 計算矢量tl- > t2與t2- > t3的內(nèi)積innerp和外積outp。步驟2 如果outp = 0,則返回“直行”,否則轉(zhuǎn)步驟3。步驟3 如果outp < 0,轉(zhuǎn)步驟4,否則判斷irmerp。如果innerp = 0,返回“左 轉(zhuǎn)”,否則計算 tanp = outp/innerp。如果 tanp ≤ _1 或 tanp ≥ 1,返回“左轉(zhuǎn)”;_1 < tanp < 0,返回“左轉(zhuǎn)掉頭”;O < tanp < 1,轉(zhuǎn)步驟5(圖9中所示a)。步驟4 判斷irmerp,如果irmerp = O,返回“右轉(zhuǎn)”,否則計算tanp = outp/ innerp,如果tanp≤-1或tanp≥1,返回“右轉(zhuǎn)” ;_1 < tanp < 0,轉(zhuǎn)步驟5(圖9中所示 a) ;O < tanp < 1,返回“右轉(zhuǎn)掉頭”。步驟5 如果前后路段同名,返回“直行”,否則判斷從t2出發(fā)是否有其他弧段,如 果沒有,返回“直行”,否則記t2- > t4轉(zhuǎn)步驟6。步驟6 求t2- > t3與t2- > t4的外積,如果> 0,則返回“靠右”,否則返回“靠左”。其中,步驟5和步驟6是直行范圍內(nèi)的特殊情況(圖9中a),如“靠左”和“靠右”。 實際路網(wǎng)中存在一種特殊情況,即“ 丫,,字形路口,面臨該類型路口時,兩者都為直行路段, 因此我們需要判斷是“靠左直行”還是“靠右直行”,可以通過外積公式判斷“ 丫,,字形的兩 條岔路弧段的相對方向進行判斷。(四)舉例跨區(qū)域路徑搜索策略中,例如搜索“北京天安門,,至“上海虹口區(qū)黃浦江”駕車路 線。步驟1 系統(tǒng)啟動,加載網(wǎng)絡圖層及全國路網(wǎng)索引表至內(nèi)存,將currentLayerP默 認選擇bei jing。步驟2 收到用戶給出請求及四個關(guān)于點的參數(shù),from = “天安門”,to = “黃浦 江”,起點城市fromCity =“beijing”和終點城市toCity =“shanghai”。查詢路徑類型選 擇“高速”。fromCity Φ toCity,因此轉(zhuǎn)步驟4。步驟4 進行跨區(qū)域異構(gòu)路網(wǎng)查詢。首先從全國路網(wǎng)索引結(jié)構(gòu)表中查詢北京至上 海(ID = beijing-shanghai)的跨城市路徑及對應的城市出口點坐標值fromP(“上海/靜 海/G020京滬高速入口”)、入口點坐標值toP( “南北高架路出口”)。跨城市路徑最為第二 段路徑 secondroute。步驟5 調(diào)用單城市路徑查詢接口。將currentLayerP指向bei jing圖層,查詢從 from至fromP之間的最短路徑,作為最終結(jié)果的第一段路徑firstroute。步驟6 調(diào)用單城市路徑查詢接口。將currentLayerP指向shanghai圖層,查詢 從toP至to之間的最短路徑,作為最終結(jié)果的第三段路徑thirdroute。步驟7 返回三段路徑(firstroute+secondroute+thirdroute),即成為跨城市自 駕車行駛導引結(jié)果。對于導航路徑文字描述算法,以上海市內(nèi)車輛路徑導航結(jié)果進行計算。導航結(jié)果 如圖10所示,文字描述結(jié)果是“1)進入中山東二路向東南1. 1公里;
2)直行中山南路向東南1. 5公里;3)靠右向西南913米;
4)左轉(zhuǎn)南浦大橋向東南2公里;5)左轉(zhuǎn)向東北1.4公里;6)直行浦東南路向西南582米;7)左轉(zhuǎn)南碼頭路向南1. 5公里到達?!卑凑瘴淖置枋鲛D(zhuǎn)化算法,我們的輸入為矢量線數(shù)組,輸出為如上文字描述。具體流 程如下步驟 1 初始化 str =“,,,cost = 0,index = 1, name = edges
- > getName () =“中山東二路”,轉(zhuǎn)步驟2。步驟2 判斷name不為空,則str+ =“1)進入”+name =“1)進入中山東二路”,轉(zhuǎn)
步驟3 ο步驟3 調(diào)用 edges
的 getCostO 獲得 cost = 139. 3,getDirection ()如 下,用方向角算法,其弧段的兩端點坐標為tl [“ 121.492997",“ 31.231958〃 ], t2 [”121.49346〃,“ 31.231524〃 ]。則步驟1)計算 dx = t2. x-tl. χ = 121. 49346-121. 492997 = 0. 000463,dy = t2.y-tl. y = 31. 231524-31. 231958 = _0· 000434。步驟2) :dx不等于0,轉(zhuǎn)步驟3。步驟3) :dx > 0,計算 d = dy/dx = -0. 000434/0. 000463 = -0. 9373。因為-2. 747 < d < -0. 364,所以返回“東南”。即〈Direction〉= “東南”,因此 str+ = “向”+〈Direction〉,str ="1)進入中山 東二路向東南”,和轉(zhuǎn)步驟4。步驟4 判斷edges還有弧段,獲取edges的下一條弧段edges [1],調(diào)用getTurn () 方法獲取該弧段〈Turning〉。利用轉(zhuǎn)向角算法,連接edges
及edges[1]的三個端點 tl [" 121.492072",“ 31.232931〃 ],t2:[“ 121.492997",“ 31.231958〃 ], t3 [“121. 49346〃,“ 31. 231524〃 ]。步驟1)步驟1 計算矢量tl- > t2與t2- > t3的內(nèi)積innerp = (t2. χ-tl. χ) * (t3. x_t2. χ) + (t3. y-t2. y) * (t2. y-tl. y)= (121. 492997-121. 492072) * (121. 49346-121. 492997)+ (31. 231524-31. 231958 )*(31. 231958-31. 232931)= 0. 000000850557 和外積outp = (t2. x-tl. x)*(t3. y-t2. y)-(t3. x_t2. x)*(t2. y-tl. y)= (121. 492997-121. 492072)* (31. 231524-31. 231958) - (121. 49346-121. 492997 )*(31. 231958-31. 232931)= 0.000000049049。判斷edges [i]_ > getName ()是否等于 edges [i_l] - > getName (),如果相等,則 cost+ = edges [i]_ > getCost (),否則轉(zhuǎn)步驟 5。步驟 2) :outp > 0,轉(zhuǎn) 3。步驟3)因為innerp > 0,計算
tanp = outp/innerp= 0. 000000049049/0.000000850557= 0.0576669。由于 0 < tanp < 1,轉(zhuǎn) 5。步驟5)前后路段同名,返回“直行”。判斷 edges[l]_ > getName ()等于 edges
_ > getName (),貝Ij cost+ = edges [1] - > getCost () = 139. 3+153. 2 = 292. 5,轉(zhuǎn)步驟 4。以下路段類似舉例,不再累述。對于轉(zhuǎn)向角算法,再舉一例,如3)中“靠右向西南913米”,輸入兩條連接弧段的三 個端點 tl: [“ 121.509874",〃 31.203728〃 ],t2: [” 121. 511563",〃 31.203089〃 ], t3:[“ 121.514867",“ 31.204264〃 ]。步驟1 計算矢量tl- > t2與t2- > t3的內(nèi)積innerp = (t2. χ-tl. χ) * (t3. x_t2. χ) + (t3. y-t2. y) * (t2. y-tl. y)= (121. 511563-121. 509874) * (121. 514867-121. 511563) + (31. 204264-31. 20308 9)* (31. 203089-31. 203728)= 0. 00000482963 和外積outp = (t2. x-tl. x) * (t3. y-t2. y) -(t3. x_t2. x) * (t2. y-tl. y)= (121. 511563-121. 509874)* (31. 204264-31. 203089) - (121. 514867-121. 51156 3)* (31. 203089-31. 203728)= 0.00000409583。步驟 2 :outp > 0,轉(zhuǎn) 3。步驟3 因為innerp > 0,計算tanp = outp/innerp= 0. 00000409583/0.00000482963= 0.848063。由于 0 < tanp < 1,轉(zhuǎn) 5。步驟5:前后路段不同名,并發(fā)現(xiàn)有從t2出發(fā)的另一條弧段,獲得t4: [”121.5104345",“ 31.210234〃 ],轉(zhuǎn) 6。步驟6 求t2- > t3與t2_ > t4的外積(t3. x-t2. χ) * (t4. y-t2. y) - (t4. x_t2. x) * (t3. y-t2. y)= (121. 514867-121. 511563)*(31. 210234-31. 203089)-(121. 5104345-121. 5115 63)* (31. 204264-31. 203089)= 0. 0000249331,大于 0,則返回“靠右,,。其他路段均按照以上方法可得。本領(lǐng)域的技術(shù)人員在不脫離權(quán)利要求書確定的本發(fā)明的精神和范圍的條件下,還可以對以上內(nèi)容進行各種各樣的修改。因此本發(fā)明的范圍并不僅限于以上的說明,而是由 權(quán)利要求書的范圍來確定的。
權(quán)利要求
一種跨區(qū)域路徑搜索方法,其特征在于,包括步驟1,加載全國路網(wǎng)索引表以及常用的網(wǎng)絡圖層至內(nèi)存;全國路網(wǎng)索引表中包含起點城市的名稱、終點城市的名稱、起點城市的出口、終點城市的入口、起點城市的出口的坐標、終點城市的入口的坐標以及起點城市和終點城市之間的路徑類型;步驟2,根據(jù)起點名稱和終點名稱判斷與起點城市或終點城市是否已被加載到內(nèi)存,如果沒有,將相應的網(wǎng)絡圖層加載到內(nèi)存;起點名稱包括起點城市以及在該起點城市中的具體位置,終點名稱包括終點城市以及在該終點城市中的具體位置;起點城市和終點城市不同;步驟3,從全國路網(wǎng)索引表中查詢起點城市和終點城市之間的路徑類型、起點城市對應的城市出口點的坐標和終點城市的對應的城市入口點的坐標,得到第二段路徑;步驟4,查詢起點城市中從該起點城市中的具體位置到對應的城市出口點的最短路徑,得到第一段路徑;步驟5,查詢終點城市中從對應的城市入口點到該終點城市中的具體位置的最短路徑,得到第三段路徑;步驟6,返回第一段路徑、第二段路徑和第三段路徑作為跨區(qū)域路徑搜索結(jié)果。
2.如權(quán)利要求1所述的跨區(qū)域路徑搜索方法,其特征在于,還包括步驟7,獲取跨區(qū)域路徑搜索結(jié)果中順次連接的第一弧段和第二弧段的名稱、方向和長度;步驟8,如果第一弧段的名稱和第二弧段的名稱相同,則記錄并顯示第一弧段或第二弧 段的方向以及第一弧段的長度與第二弧段的長度之和;如果第一弧段的名稱和第二弧段的名稱不同,則記錄并顯示第一弧段的方向和長度, 并且記錄和顯示第一弧段向第二弧段的轉(zhuǎn)向狀態(tài)以及第二弧段的方向和長度。
3.如權(quán)利要求2所述的跨區(qū)域路徑搜索方法,其特征在于,步驟7中,第一弧段或第二 弧段的方向用方向角算法求得。
4.如權(quán)利要求3所述的跨區(qū)域路徑搜索方法,其特征在于,步驟7中,第一弧段或第二 弧段的方向按照下列步驟計算步驟71,獲取第一弧段或第二弧段的兩個端點的坐標(tl. χ, tl. y)和(t2. χ, t2. y); 步驟 72,計算 dx = t2. x-tl. x,dy = t2. y-tl. y ;如果dx = O且dy > 0,則方向為“北”;如果dx = 0且dy < 0,則方向為“南”;如果 dx>0,計算 d = dy/dx:如果d> 2. 747,則方向為“北”;如果0. 364 < d < 2. 747,則方向為“東北”;如果-0. 364 < d < 0. 364,則方向為“東”;如果-2. 747 < d < -0. 364,則方向為“東南”;如果d<-2. 747,則方向為“南”;如果 dx<0,計算 d = dy/dx:如果d> 2. 747,則方向為“南”;如果0. 364 < d < 2. 747,則方向為“西南”;如果-0. 364 < d < 0. 364,則方向為“西”;如果-2. 747 < d < -0. 364,則方向為“西北”;如果d<-2. 747,則方向為“北”。
5.如權(quán)利要求2所述的跨區(qū)域路徑搜索方法,其特征在于,步驟8中,第一弧段向第二弧段的轉(zhuǎn)向狀態(tài)用轉(zhuǎn)向角算法求得。
6.如權(quán)利要求5所述的跨區(qū)域路徑搜索方法,其特征在于,步驟8中,第一弧段向第二弧段的轉(zhuǎn)向狀態(tài)依據(jù)下列步驟計算步驟81,獲取第一弧段和第二弧段的三個端點的坐標(tl.x,tl.y)、(t2.x, t2. y)和 (t3. χ, t3. y);步驟 82,計算矢量(tl. x,tl. y)-> (t2. χ, t2. y)與矢量(t2. χ, t2. y)-> (t3. χ, t3. y) 的內(nèi)禾只innerp禾口夕卜禾只outp 如果outp = 0,則轉(zhuǎn)向狀態(tài)為“直行”;如果outp < 0,并且innerp = 0,則轉(zhuǎn)向狀態(tài)為“右轉(zhuǎn)”;如果outp < 0,并且innerp 不為0,則計算tanp = outp/innerp ;如果tanp彡_1或tanp彡1,則轉(zhuǎn)向狀態(tài)為“右轉(zhuǎn)”; O < tanp < 1,則轉(zhuǎn)向狀態(tài)為“右轉(zhuǎn)掉頭”;如果-1 < tanp < 0,并且第一弧段和第二弧段 同名,則轉(zhuǎn)向狀態(tài)為“直行”;如果-1 < tanp < 0,第一弧段和第二弧段不同名,且不存在從 (t2.x, t2.y)出發(fā)的其他弧段,則轉(zhuǎn)向狀態(tài)為“直行”;如果-1 < tanp < 0,第一弧段和第 二弧段不同名,存在從(t2.x,t2.y)出發(fā)到端點(t4.x,t4.y)的弧段,則計算矢量(t2. X, t2. y)- > (t3. x,t3. y)與矢量(t2. χ, t2. y)- > (t4. x,t4. y)的外積,如果該外積大于 0, 則轉(zhuǎn)向狀態(tài)為“靠右”,如果該外積小于0,則轉(zhuǎn)向狀態(tài)為“靠左”;如果outp > 0,并且innerp = 0,則轉(zhuǎn)向狀態(tài)為“左轉(zhuǎn)”;如果outp > 0,并且innerp 不為0,則計算tanp = outp/innerp ;如果tanp彡_1或tanp彡1,則轉(zhuǎn)向狀態(tài)為“左轉(zhuǎn)”; 如果-1 < tanp < 0,則轉(zhuǎn)向狀態(tài)為“左轉(zhuǎn)掉頭”;如果0 < tanp < 1,并且第一弧段和第二 弧段同名,則轉(zhuǎn)向狀態(tài)為“直行”;如果0 < tanp < 1,第一弧段和第二弧段不同名,并且不 存在從(t2. x,t2. y)出發(fā)的其他弧段,則轉(zhuǎn)向狀態(tài)為“直行”;如果0 < tanp < 1,第一弧段 和第二弧段不同名,并且存在從(t2.x,t2. y)出發(fā)到端點(t4.x,t4. y)的弧段,則計算矢量 (t2. X,t2. y)- > (t3. x,t3. y)與矢量(t2. χ, t2. y)- > (t4. x,t4. y)的外積,如果該外積 大于0,則轉(zhuǎn)向狀態(tài)為“靠右”,如果該外積小于0,則轉(zhuǎn)向狀態(tài)為“靠左”。
7.如權(quán)利要求2-6任意一項所述的跨區(qū)域路徑搜索方法,其特征在于,第一弧段、第二弧段的長度或第一弧段的長度與第二弧段的長度之和大于或等于1000米,則換算為公里 進行顯示。
8.—種跨區(qū)域路徑搜索裝置,其特征在于,包括數(shù)據(jù)加載模塊,用于加載全國路網(wǎng)索引表以及常用的網(wǎng)絡圖層至內(nèi)存;全國路網(wǎng)索引 表中包含起點城市的名稱、終點城市的名稱、起點城市的出口、終點城市的入口、起點城市 的出口的坐標以及終點城市的入口的坐標;根據(jù)起點名稱和終點名稱判斷與起點城市或終 點城市是否已被加載到內(nèi)存,如果沒有,將相應的網(wǎng)絡圖層加載到內(nèi)存;起點名稱包括起點 城市以及在該起點城市中的具體位置,終點名稱包括終點城市以及在該終點城市中的具體 位置;起點城市和終點城市不同;跨區(qū)域路徑獲取模塊,用于從全國路網(wǎng)索引表中查詢起點城市和終點城市之間的路徑 類型、起點城市對應的城市出口點和終點城市的對應的城市入口點,得到第二段路徑;查詢起點城市中從該起點城市中的具體位置到對應的城市出口點的最短路徑,得到第一段路 徑;查詢終點城市中從對應的城市入口點到該終點城市中的具體位置的最短路徑,得到第 三段路徑;返回第一段路徑、第二段路徑和第三段路徑作為跨區(qū)域路徑搜索結(jié)果。
9.如權(quán)利要求8所述的跨區(qū)域路徑搜索裝置,其特征在于,還包括 參數(shù)獲取模塊,用于獲取路徑結(jié)果中順次連接的第一弧段和第二弧段的名稱、方向和 長度;文字描述模塊,用于在第一弧段的名稱和第二弧段的名稱相同時,記錄并顯示第一弧 段或第二弧段的方向以及第一弧段的長度與第二弧段的長度之和;在第一弧段的名稱和第 二弧段的名稱不同時,記錄并顯示第一弧段的方向和長度,并且記錄和顯示第一弧段向第 二弧段的轉(zhuǎn)向狀態(tài)以及第二弧段的方向和長度。
10.如權(quán)利要求9所述的跨區(qū)域路徑搜索裝置,其特征在于,參數(shù)獲取模塊使用方向角 算法求得第一弧段或第二弧段的方向。
11.如權(quán)利要求10所述的跨區(qū)域路徑搜索裝置,其特征在于,參數(shù)獲取模塊,用于獲取 第一弧段或第二弧段的兩個端點的坐標(tl.x,tl.y)和(t2.x,t2.y);計算dx = t2. x_tl. χ, dy = t2. y-tl. y ;如果dx = 0且dy > 0,則參數(shù)獲取模塊獲取的方向為“北”;如果dx = 0且dy < 0,則 參數(shù)獲取模塊獲取的方向為“南”; 如果 dx>0,計算 d = dy/dx: 如果d > 2. 747,則參數(shù)獲取模塊獲取的方向為“北”; 如果0. 364 < d < 2. 747,則參數(shù)獲取模塊獲取的方向為“東北”; 如果-0. 364 < d < 0. 364,則參數(shù)獲取模塊獲取的方向為“東”; 如果-2. 747 < d < -0. 364,則參數(shù)獲取模塊獲取的方向為“東南”; 如果d < -2. 747,則參數(shù)獲取模塊獲取的方向為“南”; 如果 dx<0,計算 d = dy/dx: 如果d > 2. 747,則參數(shù)獲取模塊獲取的方向為“南”; 如果0. 364 < d < 2. 747,則參數(shù)獲取模塊獲取的方向為“西南”; 如果-0. 364 < d < 0. 364,則參數(shù)獲取模塊獲取的方向為“西”; 如果-2. 747 < d < -0. 364,則參數(shù)獲取模塊獲取的方向為“西北”; 如果d < -2. 747,則參數(shù)獲取模塊獲取的方向為“北”。
12.如權(quán)利要求9所述的跨區(qū)域路徑搜索裝置,其特征在于,文字描述模塊使用轉(zhuǎn)向角 算法求得第一弧段向第二弧段的轉(zhuǎn)向狀態(tài)。
13.如權(quán)利要求12所述的跨區(qū)域路徑搜索裝置,其特征在于,文字描述模塊,用于獲取 第一弧段和第二弧段的三個端點的坐標(tl. χ, tl. y)、(t2. χ, t2. y)和(t3. χ, t3. y);計算 矢量(tl. x,tl. y)- > (t2. x,t2. y)與矢量(t2. χ, t2. y)- > (t3. χ, t3. y)的內(nèi)積 innerp 禾口夕卜積outp 如果outp = 0,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“直行”; 如果outp < 0,并且irmerp = 0,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“右轉(zhuǎn)”;如果 outp < 0,并且 innerp 不為 0,貝U計算 tanp = outp/innerp ;如果 tanp < -1 或 tanp ^ 1, 則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“右轉(zhuǎn)”;0 < tanp < 1,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“右轉(zhuǎn)掉頭”;如果-ι < tanp < 0,并且第一弧段和第二弧段同名,則文字描述 模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“直行”;如果-1 < tanp < 0,第一弧段和第二弧段不同名,且 不存在從(t2.x,t2.y)出發(fā)的其他弧段,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“直行”; 如果-1<切即<0,第一弧段和第二弧段不同名,存在從&2^32.7)出發(fā)到端點(t4.x, t4. y)的弧段,則計算矢量(t2. X,t2. y)- > (t3. χ, t3. y)與矢量(t2. χ, t2. y)- > (t4. χ, t4. y)的外積,如果該外積大于0,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“靠右”,如果該 外積小于0,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“靠左”;如果outp > 0,并且irmerp = 0,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“左轉(zhuǎn)”;如果 outp > O,并且 innerp 不為 O,貝U計算 tanp = outp/innerp ;如果 tanp < -1 或 tanp ^ 1, 則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“左轉(zhuǎn)”;如果-1 < tanp < 0,則文字描述模塊記錄 并顯示轉(zhuǎn)向狀態(tài)為“左轉(zhuǎn)掉頭”;如果O < tanp < 1,并且第一弧段和第二弧段同名,則文字 描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“直行”;如果O < tanp < 1,第一弧段和第二弧段不同名, 并且不存在從(t2.x,t2.y)出發(fā)的其他弧段,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“直 行”;如果O < tanp < 1,第一弧段和第二弧段不同名,并且存在從(t2.x,t2.y)出發(fā)到端點 (t4. X,t4. y)的弧段,則計算矢量(t2. X,t2. y)- > (t3. χ, t3. y)與矢量(t2. χ, t2. y)- > (t4. χ, t4. y)的外積,如果該外積大于0,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“靠右”, 如果該外積小于0,則文字描述模塊記錄并顯示轉(zhuǎn)向狀態(tài)為“靠左”。
14.如權(quán)利要求9-13任意一項所述的跨區(qū)域路徑搜索裝置,其特征在于,第一弧段、第 二弧段的長度或第一弧段的長度與第二弧段的長度之和大于或等于1000米,則換算為公 里進行顯示。
全文摘要
本發(fā)明涉及一種跨區(qū)域路徑搜索方法及裝置。該方法包括加載全國路網(wǎng)索引表以及常用的網(wǎng)絡圖層至內(nèi)存;從全國路網(wǎng)索引表中查詢起點城市和終點城市之間的路徑類型、起點城市對應的城市出口點的坐標和終點城市的對應的城市入口點的坐標,得到第二段路徑;查詢起點城市中從該起點城市中的具體位置到對應的城市出口點的最短路徑,得到第一段路徑;查詢終點城市中從對應的城市入口點到該終點城市中的具體位置的最短路徑,得到第三段路徑;返回第一段路徑、第二段路徑和第三段路徑作為跨區(qū)域路徑搜索結(jié)果。本發(fā)明能夠高效地實現(xiàn)跨區(qū)域?qū)Ш铰窂剿阉鳌?br>
文檔編號G06F17/30GK101840416SQ201010126870
公開日2010年9月22日 申請日期2010年3月16日 優(yōu)先權(quán)日2010年3月16日
發(fā)明者方金云, 趙婷 申請人:中國科學院計算技術(shù)研究所