威立雅(中国)环境服务有限公司
摘要:在使用各种实时动态监控的应用或大屏展示信息系统中,对于多个监控目标的信息同时在地图展示是非常普遍和迫切的需求,而ArcGIS的WebAPI提供的的infoWindows(PopUp)只能同时显示一个,这在一些应用中造成很大的不便。本文提供多个PopUp自动避让的算法,并提供ArcGISforJavaScriptAPI组件进行很好的展示。
关键词:ArcGIS;infoWindows;自动避让
0引言
在使用各种实时动态监控的应用或大屏展示信息系统中,对于多个监控目标的信息同时在地图展示是非常普遍和迫切的需求,而ArcGIS的WebAPI提供的的infoWindows(PopUp)只能同时显示一个,特别是ArcGISforJavaScriptAPI作为以后主流的WebAPI技术,甚至没有提供像ArcGISforFlexAPI中的infoSymbol这样多个可以同时显示的提示符号,尽管ArcGISforFlexAPI也没有提供多个infoSymbol自动避让的算法。
1关键技术
1.1技术路线
通过在地图上面建立“虚拟网格”,计算infowindows的位置,然后通过找到的最后位置去计算压盖infowindows的网格,如果infowindows主窗体和牵引线都压盖的格子都未被占用,那此位置即为可放infowindows的最优位置。超过一定的距离,依旧未能放下infowindows,那将对此infowindows采用牵引线的方式进行显示。牵引线的绘制采用改良的A*算法,传统A*算法计算得到的是距离最短的对角线,改良后在屏幕上找到一条拐点最少的前提下距离最短的牵引线,这样的线比较美观(横平竖直)。
1.2算法简介
MulitPopUp算法思想主要就是在地图上建立特定边长(参数可设)的虚拟网格,如下图所示,黑色格网表示已被占用格网,白色表示还未被占用格网,通过计算将地图要素位置所对应的格网、已确定的InfoWindows所覆盖的网格和牵引线所经过的格网做标记(如图黑色格子)。在计算InfoWindows最佳位置和牵引线最佳走向时候,做到不覆盖已做标记的格网。
MulitPopUp主要涉及两个算法:
1.通过格网覆盖法计算每个infowindows最优位置
格网覆盖就是通过在地图上建立特定边长(参数可设)的虚拟网格,以判断在地图内的网格是否被已确定位置的infowindoes覆盖为判断位置条件,之前的infowindows已经在空间上覆盖过网格,则网格值设为1,反之为零,在计算infowindows位置时,判断其覆盖的所有网格的累计值不能大于1为条件,否则继续寻找最优位置,如下图黄色框的位置即为有效的位置,黑色格子代表已被覆盖格子,白色格子代表还未被覆盖的格子。
格网算法在计算最优位置的时候,是按照九宫格的位置序列进行的,如上图
目前程序中默认设置的优先级别为:2、8、4、6、9、1、7、3其中前面2、8、4、6的位置如果能放下,将采用箭头的方式来标示位置,目前算法采用5个格子的buffer值,按2、8、4、6顺序这四个位置中找一个能放下infoWindows的位置,如还未有合适的位置,则按后面9、1、7、3的位置进行搜索,后面9、1、7、3事实上位置肯定较远(目前设置为大于5个格子的容限差),故采用为牵引线的方式。
2.最优Infowindows牵引线绘制算法(基于A*算法改良)。
通过上面一轮的筛选(九宫格2、8、4、6为第一轮infoWindows位置确定),如果还有infoWindows未能分配到九宫格中2、8、4、6的位置,那么实际上这些infoWindows需要重新计算稍远一点位置,并使用牵引线将infoWindows和地物连接起来。当确定好这些infoWindwos的位置后,事实上剩下的infoWindows只会是九宫格9、1、7、3的位置。现在那问题就转变为,如何将确定位置的一个点和一个infoWinows用一条合适的线连起来,为美观起见,要求这条线不能和任何InfoWindows及别的牵引线压盖,应尽量简短并形态上要求横平竖直。
经过了解,我们把目光聚焦在目前游戏中使用较多的A*算法,它可计算从屏幕A点到B点最短的一条线,此算法是一种静态路网中求解最短路最有效的直接搜索方法,如果经过改良,应该可以满足我们算法的需求。
按照A*算法的原理,如果格网长宽一致,最短路径必定优先是一条曲折的对角线,即使所经过的格网数目一样。如果我在算法中修改每次线在转弯时的格网权重,那么它就能分析出既满足“横屏竖直”这样美观的效果,有充分考虑了“最短路径”。
A*算法,距离最短,多为对角线,改良后A*算法,加大转弯的权重,效果即横平竖直。
2功能特色
ArcGIS的所有终端(CS、BS和各种移动终端)在展示信息的时候采用InfoWindows(PopUp\Callout)组件,InfoWindows具有箭头指向目标地物,可以展示图表和各种字段信息,十分适合点图查询这样的场景,用户也十分认可。但在另一类场景中,比如实时监控、大屏显示等需要在地图上同时显示两个以上地物信息的时候,ArcGIS目前还未有有效组件实现,且此需求在很多场景中用户都有需求。
应用场景1:在点图查询时,有时用户会连续点击几个兴趣点,希望查询到的点的信息,都能展示出来,也能自己选择关闭。
应用场景2:在一些实时监控系统或大屏监控系统中,需要同时展示监控点的实时信息、图表、视频等内容,MulitPopUp尤其适合这种场的应用。
功能应用:
多点同时显示infoWindows。
多infoWindows之间具有动态避让,优化布局功能。
调用简单,经过封装,在JavaScriptforArcGISAPI中只需一行代码就可调用此工具。
此算法和实现方式通过修改完全可以在ArcGISEngine、JS\Flex\SilverLight、iOS、Andorid和WindowsPhone等所有ArcGIS终端上应用。
功能展示:
1.全部要素同时展示,自动避让+牵引线:通过此算法排布,基本可以达到自动避让,优化布局的效果,过于密集处,通过牵引线展示在相对空闲地图上。
2.根据比例尺显示要素,自动避让:为达到最佳效果,会根据布局,实时调整显示的位置和个数,随着比例尺的放大,慢慢显示的infoWindows显示的数量越来越多,以保证较好的地图和infoWindows显示效果。
3.支持多种信息展示方式:infoWindows内容几乎可以放任何Html支持的元素,支持直接嵌入Html标签,为与ArcGISAPI保持一致,通过指定ArcGISGraphic属性值,来设置infoWindows内容,如文字、图片、视频,图表等等。
4总结与展望
1.水利行业水雨情监控系统中,监控各种水位站信息同样也需要多个点同时显示,以前的大都采用通过画Element的方式,该方式只能显示Text,无法方便的显示图片、视频和图表,且很影响地图效率,MulitPopUp可以很好解决此问题。
2.此工具稍作改动适用于所有ArcGISAPI(Engine、JS、Flex、Sliverlight、iOS、Android、Windowsphone)中,具有很大的应用场景。