文章版权由做者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。数据库
对于通常性的地图显示需求,咱们只须要知道地图的一个固定URL,而后知道要显示的范围和要显示的级别以及每一个级别的scale等便可。设计模式
可是若是咱们遇到下面几种状况时,又该如何。缓存
(1)须要显示的图层的不一样级别来自于不一样的服务器(URL不一样):如前几个级别由一个固定URL提供,后几个级别由另一个URL提供。服务器
(2)须要同时叠加几张图层:如须要叠加地形图和注记图,且图层的显示有层级之分。设计
(3)须要同时叠加几张图层,而且每一个图层初始显示级别不同。3d
(4)须要同时叠加几张图层,图层的URL的请求方式均有不一样:如其中一个图层由AGS提供,一个图层是天地图服务提供,还有一个图层是当地城管局提供,最后还有一个图层是由本地未发布的缓存瓦片提供。server
诸如相似于以上的地图显示需求还有不少,若是咱们单纯的对每一种状况进行一个代码上的分支固然也是能解决的。可是这并非最好的一种解决方法,每次新的需求提出时,都须要对代码修改,这不符合设计模式中的开放封闭原则。虽然咱们能够用简单工厂等模式来努力改善这种状况,不过若是有更好的方式,不须要修改任何代码,不须要用设计模式,就能解决以上的问题是否更好?blog
下面我将给出一种经过数据库配置来实现上面全部问题的解决方案。此方案在多个项目中已经开始使用。token
首先咱们必须对以上多种地图显示的需求进行一个分析,提出他们的共同点。get
(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均须要的。
首先我给出图层列表设计的截图:
(1)每个图层均有一个图层名
(2)每个图层均有本身的图层类型,好比AGS类型的、WMTS类型的等。这是为了程序中对不一样的类型的URL进行解析。
(3)每个图层有其本身的显示顺序,为了正确的叠加图层之用。
(4)每个图层也有本身开始显示的级别。若有的图层想第一级别开始显示,有的图层但愿地图放大到第二级别时才开始显示。
一样,这里先给出表的截图:
(1)ItemID为每一个记录的主码。
(2)layerName与tcMaplayerList中的图层名是对应的。
(3)图层级别表示的是该图层在此级别时的信息。
(4)图层在该级别的URL有一个固定的部分,好比WMTS请求中,变化的只是行列号,而前面的部分均是不定的。
(5)Token、XFieldName、YFieldName、LevelFieldName均是为扩展之用,当URL须要给行列号以及级别一个固定的名称时等,则配置。不然不用。
在显示地图以前,须要先向后台发出请求,此请求的参数主要是layerType,后台根据layerType将tcMapLayerList表中符合需求的内容读出返回。
在解析了须要显示的图层列表后,每一个图层均会给后台发出本身的信息,信息中包括了此时地图的级别,以及须要获得的瓦片行列号和本身的图层名。
可是此时的地图级别并非图层发给后台的级别参数,真是的地图级别是:
factLayerLevel=layerLevel+startLayerLevel。
根据factlayerLevel和layerName,在tcgismapservicedetail中找到对应的信息,若是有信息,则表示该图层在此真实级别下是须要显示的,而后根据该图层的layerType将此时的URL拼接出来,下载瓦片而后返回此瓦片。
若是没有查到数据则不显示此地图级别下的该图层。
经过此配置基本能够实现项目中遇到的绝大部分地图需求。改进后,虽然再也不须要对各类需求进行大规模的代码编写,可是针对不一样的瓦片类型的URL获取依然是要走分支的,这里能够经过策略模式来让代码更加规范。
断了一个多月没写博,WebGIS的原理系列会继续写下去的,但愿你们持续关注。
------欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/