动态图层

来源:互联网 发布:windows对话框 编辑:程序博客网 时间:2024/04/28 03:00

动态图层

                                                      陈玉进   李泉   南京跬步科技有限公司(http://www.creable.cn)

GIS中,所谓“动态图层”就是位于地图最上层且刷新很快的图层。通常为点图层,用于显示那些实时刷新的信息。这样,就产生了两个问题:一,为什么动态图层位于地图最上层;二,如何作到刷新很快。下面就以GPS车辆监控为例加以说明。

假设屏幕内需要显示的GPS车辆监控点有500个,为了实时反映每辆车的最新状态,只要获得任何一辆车最新的GPS位置信息,就要进行全图刷新,通常也就是说,要能够作到一秒钟内能刷新多次。如此大的负载,如没有特殊的技巧,是难以实现“动态实时”效果的。相对于动态图层,没有实时信息的图层集合称为“底图”,刷新时,先绘制底图,再绘制动态图层,底图在下,动态图层在最顶上,在底图不变的情况下刷新,底图无需绘制直接粘贴,动态图层需要实时绘制,而影响动态图层绘制效率的关键是地图坐标到屏幕坐标的转换,在某个时间点也许只是一辆车的位置动了,其他车辆位置保持不变,为了刷新动态图层,需要500辆车进行地图坐标到屏幕坐标的转换,得到500辆车的屏幕坐标,然后进行绘制,这样作代价很高,难以作到实时的效果,为此,给每辆车从0499编号,申请一个长度为500的数组,存储每辆车的屏幕坐标,当其中一辆车位置改变时,只需要重新计算这一辆的屏幕坐标,其他车辆位置不变,直接绘制。这样,找到了问题的瓶颈,解决了瓶颈对快速刷新的性能限制,提高了实时刷新的效果。 还有一个问题一直未考虑,假如一共有5000辆车,而当前屏幕内,可能有500辆车需要显示,如果按上面的作法,建立长度为5000的数组,用于存储这5000辆车的屏幕坐标,绘制的时候遍历此数组,读取屏幕坐标进行绘制,遍历的代价同样很高,为此,需要进一步改进,那样就需要建立实时动态网格索引,记录每辆车当前所在的网格,这样,在绘制的时候,按网格索引获得当前屏幕内的部分车辆的编号,由此编号直接对应到数组位置获得屏幕坐标,避免了遍历数组所带来的开销。

以上是针对底图不变的情况而言的,当底图发生变化时,如对地图进行平移、放大和缩小等操作,一方面底图需要重新绘制,另一方面动态图层上所有点的屏幕坐标需要重新计算,对平移来说,只需要加上一个平移的常数即可,而对于放大和缩小,就要用地图坐标到屏幕坐标的转换来计算,运算量较平移的情况要大,所以,平移相对于放大和缩小反应要快一点。

以上详细介绍了“动态图层”的底层实现原理,如果考虑采用类似WEBGIS定级分块渲染显示的话,还有更灵活、效率更高的处理方法,留给读者自己思考,缺点是就不方便作无级缩放了。