室內地圖2:如何實現室內三維路徑計算


傳統的最小路徑計算方法包括Dijkistra, A star,並不是本文這里要介紹具體的路算方法。

因為傳統的最小路徑算法已經非常完善並且好用,比如通過arcgis等進行路徑計算,該功能叫network analysis(對應需要根據你畫的路徑生成network dataset)。

本文要介紹的是,如何通過ArcGIS提供的network analysis的二維平面路算, 實現我們做室內定位導航的可視化三維導航。因為室內環境不同於二維導航,它涉及到樓層切換。

當然,最好的方法是像高德等地圖服務商自己做一套二次開發的平台,定義室內地圖生成標准,不過這個東西就不是我們做研究的人目前能花費精力去做得出來的了o(╯□╰)o。

 

在上一篇文章《室內地圖1:從cad--->map》中我簡單介紹了如何生產一個能用來展示並且做路徑分析的地圖,但是ArcGIS只是能做一個二維分析。比如說從602辦公室到632那么ok,但是假如你想讓他計算從602到804,可能就沒法計算了。因為室內導航中設計樓層,電梯和扶梯等等。

 

對於這個問題,我思考了兩種方法:

1. 通過對每一層樓生成一個network dataset, 涉及跨樓層導航的時候,首先將用戶計算到距離自己最近的電梯/扶梯(即計算 602----> 6樓電梯口)、然后認為電梯、扶梯直達目標樓層后再計算目標樓層電梯到目的地的路徑(8樓電梯口----->804)。這種方法容易理解,將擴樓層導航分解成了兩個路徑分析,即當前位置到當前樓層電梯,目標樓層電梯到目標位置兩端路徑分析。如果涉及到不同建築物之間的切換,則進一步延伸為,6樓--->6樓電梯口---->1樓電梯口------>另一棟樓1樓電梯口---->目標樓層。不過此方法有一個致命缺點,除了可能繞遠之外,就是有些電梯不一定能夠直達目標樓層而需要轉電梯,這樣一來,這個導航方法就不能用了,所以我思考了第二個實現方法。

 

2. 這個方法的基本思想:通過在地圖平面上畫出樓層偏移,並且畫出電梯作為不同樓層間的連接路徑,然后室內整體建立network dataset。 這個比較難解釋,看圖說話:首先這是我6樓的平面圖,其中酒紅色的為路徑,那么arcgis是可以在這張路徑上做最短路徑計算的。

  

但是,不同樓層投影在平面上是有重合的,也就是說如果我把10樓的路徑和地圖放上去將重合在一起。導航將難做到從6樓到10樓的路徑計算和展示。

所以,我通過將每一層的路徑在X方向(圖中的豎直方向)比上一層偏移一個固定LENGTH(比如10米),並畫出電梯作為兩層的連接路徑。

也就是說假如以1樓平面坐標正確,那么對於樓層為n的樓的坐標為:

\[\left \{ \begin{matrix}X=X-(n-1)*LENGTH \\ Y=Y \end{matrix} \right.\]

則可以作為一個整體實現network dataset 進而做路徑計算(下圖中四根淡綠色的線為四部電梯)。

建立和network dataset 后,我們新建route試試看看通過路徑分析是否實現了8樓到6樓的路徑計算(這里電梯我都命名為了Lift):

成功實現,並且可以通過名字區分是電梯還是在同一層內的導航。但是這個方法僅僅是一種室內三維導航的粗糙實現,需要對你通過其他定位方法(比如WiFi/藍牙)獲得的坐標並且通過上述式子進行換算之后再進行路徑計算,根據Floor id加載你需要加載的樓層圖。

最后再附上Android Demo 效果:

首先,進入demo 定位,根據Floor6 加載6樓的底圖:

選擇目的地toilet

Arcgis服務器返回路徑計算結果。

done!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM