我们都知道,传统的最小路径计算方法包括Dijkistra, A star等。但是本文这里并不介绍具体的路算方法,这些计算方法很成熟了。在各大地图平台应用广泛,比如我们出门的导航。
本文要介绍的是,如何通过ArcGIS提供的network analysis的二维平面路算 实现我们做室内定位导航的可视化三维导航。当然,最好的方法是像高德等地图服务商自己做一套二次开发的平台,不过这个东西就不是我们做研究的人目前能花费精力去做得出来的了。
在上一篇文章《室内地图1:从cad--->map》中我简单介绍了如何生产一个能用来做路径分析的地图,但是ArcGIS只是能做一个二维分析。比如说从602办公室到632那么ok,但是假如你想让他计算从602到804,可能就没法计算了。因为室内导航中设计楼层,电梯和扶梯等等。所以我思考了两种方法:
1.每一层楼生成一个network dataset.在跨楼层导航的时候,首先将用户计算到距离自己最近的电梯/扶梯(602---->6楼电梯口)、然后认为电梯、扶梯直达目标楼层后再计算目标楼层电梯到目的地的路径(8楼电梯口----->804)。这种方法容易理解,将扩楼层导航分解成了两个路径分析,即当前位置到当前楼层电梯,目标楼层电梯到目标位置两端路径分析。不过此方法有一个缺点,就是有些电梯不一定能够直达目标楼层而需要转电梯,这样一来,这个导航方法就不能用了,所以我思考了第二个实现方法。
2.这个方法即通过在地图平面上画出楼层偏移,并且画出电梯作为路径的一种,然后室内整体作为dataset建立network。 这个比较难解释,我贴图来说:首先这是我6楼的平面图,其中酒红色的为可走路径。
我们知道,不同楼层投影在平面上是有重合的,也就是说如果我把10楼的路径和地图放上去将重合在一起。导航也很难做到从六楼到10楼的路径计算。
所以,我决定将每一楼的平面图和路径图在X方向比上一层偏移LENGTH(比如10米),也就是说假如以1楼平面坐标正确,那么对于楼层为n的楼的坐标为:
\[\left \{ \begin{matrix}X=X-(n-1)*LENGTH \\ Y=Y \end{matrix} \right.\]
再讲电梯连接起来,则可以作为一个整体实现network analysis。
建立和network dataset 后,我们新建route试试看看通过路径分析是否实现了8楼到6楼的路径计算:
成功实现,但是这个方法仅仅是一种简单实现室内三维导航的设想,需要对你通过其他定位方法获得的坐标通过上述式子进行换算之后再进行定位请求。
最后再附上android demo 图:
进入demo 定位显示:
选择目的地toilet
开始导航!!
祝大家成功!