通过配置实现多种需求下的地图展示

发表于:2014-11-21 11:17

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Naa    来源:51Testing软件测试网采编

分享:
  1.背景
  对于一般性的地图显示需求,我们只需要知道地图的一个固定URL,然后知道要显示的范围和要显示的级别以及每个级别的scale等即可。
  但是如果我们遇到下面几种情况时,又该如何。
  (1)需要显示的图层的不同级别来自于不同的服务器(URL不同):如前几个级别由一个固定URL提供,后几个级别由另外一个URL提供。
  (2)需要同时叠加几张图层:如需要叠加地形图和注记图,且图层的显示有层级之分。
  (3)需要同时叠加几张图层,并且每个图层初始显示级别不一样。
  (4)需要同时叠加几张图层,图层的URL的请求方式均有不同:如其中一个图层由AGS提供,一个图层是天地图服务提供,还有一个图层是当地城管局提供,最后还有一个图层是由本地未发布的缓存瓦片提供。
  诸如类似于以上的地图显示需求还有很多,如果我们单纯的对每一种情况进行一个代码上的分支当然也是能解决的。但是这并不是最好的一种解决方法,每次新的需求提出时,都需要对代码修改,这不符合设计模式中的开放封闭原则。虽然我们可以用简单工厂等模式来努力改善这种情况,不过如果有更好的方式,不需要修改任何代码,不需要用设计模式,就能解决以上的问题是否更好?
  下面我将给出一种通过数据库配置来实现上面所有问题的解决方案。此方案在多个项目中已经开始使用。
  2.配置(表)的设计
  2.1原理
  首先我们必须对以上多种地图显示的需求进行一个分析,提出他们的共同点。
  (1)对图层开始显示的级别有需求(startLevel)。
  (2)多张图层叠加,并且图层叠加有从上自下的顺序(layerDisplayOrder)。
  (3)图层可能的URL不同(ServiceURL)
  (4)每个图层的URL格式可以不一样,比如URL可能天地图的WMTS格式,可能是AGS发布的请求方式(level\row\col),也有可能是Geoserver发布的WMS格式。并且有的服务提供商还需要token字段来判断是否有权限得到服务,或者不同的服务商提供的WMTS格式中对col和row以及level的表述字段名称不一样(通过这个分析,可以提炼出Xfield、Yfield、LevelFieldName、Token字段来对不同的需求进行配置)。
  (5)所有的图层,如果要叠加,需要用同一个空间参考,同一个瓦片大小,同一个地图起始原点,以及同一套地图比例尺。
  (6)变化的只是URL,其核心瓦片行列号和地图级别是每种瓦片请求URL均需要的。
  2.2设计
  2.2.1图层列表(tcMaplayerList)的设计
  首先我给出图层列表设计的截图:
  (1)每一个图层均有一个图层名
  (2)每一个图层均有自己的图层类型,比如AGS类型的、WMTS类型的等。这是为了程序中对不同的类型的URL进行解析。
  (3)每一个图层有其自己的显示顺序,为了正确的叠加图层之用。
  (4)每一个图层也有自己开始显示的级别。如有的图层想第一级别开始显示,有的图层希望地图放大到第二级别时才开始显示。
  2.2.2图层详细内容列表(tcgismapservicedetail)的设计
  同样,这里先给出表的截图:
  (1)ItemID为每个记录的主码。
  (2)layerName与tcMaplayerList中的图层名是对应的。
  (3)图层级别表示的是该图层在此级别时的信息。
  (4)图层在该级别的URL有一个固定的部分,比如WMTS请求中,变化的只是行列号,而前面的部分均是不定的。
  (5)Token、XFieldName、YFieldName、LevelFieldName均是为扩展之用,当URL需要给行列号以及级别一个固定的名称时等,则配置。否则不用。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号