室内地图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 { egin{matrix}X=X-(n-1)*LENGTH \ Y=Y end{matrix} ight.]

则可以作为一个整体实现network dataset 进而做路径计算(下图中四根淡绿色的线为四部电梯)。

建立和network dataset 后,我们新建route试试看看通过路径分析是否实现了8楼到6楼的路径计算(这里电梯我都命名为了Lift):

成功实现,并且可以通过名字区分是电梯还是在同一层内的导航。但是这个方法仅仅是一种室内三维导航的粗糙实现,需要对你通过其他定位方法(比如WiFi/蓝牙)获得的坐标并且通过上述式子进行换算之后再进行路径计算,根据Floor id加载你需要加载的楼层图。

最后再附上Android Demo 效果:

首先,进入demo 定位,根据Floor6 加载6楼的底图:

选择目的地toilet

Arcgis服务器返回路径计算结果。

done!

原文地址:https://www.cnblogs.com/lesliexong/p/7521586.html