文章版权由做者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。前端
这篇文章里,我主要针对OGC标准中的WMS、WMTS以及ArcGIS的在线地图服务来进行解析。算法
写以前,我先来给你们提一下OGC是什么。OGC的全名是Open GIS Consortium,中文名是开放地理空间信息联盟,它是一个是非盈利、志愿的国际标准化组织。在空间数据互操做领域,基于公共接口访问模式的互操做方法是一种基本的操做方法。经过国际标准化组织(ISO/TC211)或技术联盟(如OGC)制定空间数据互操做的接口规范,GIS软件商开发遵循这一接口规范的空间数据的读写函数,从而能够实现异构空间数据库的互操做(来自百度百科)。数据库
目前OGC制定的标准有:WMS(地图服务)、WMTS(地图瓦片服务)、WFS(要素服务)、WCS(栅格服务)。在下面我介绍的地图请求方式皆是RESTFUL下的请求方式。服务器
WMS服务能够提供如下几种服务:微信
GetCapabilities返回服务级元数据。框架
GetMap返回一个地图影像。函数
GetFeatureinfo返回显示在地图上的某些特殊要素的信息等。设计
咱们来看一下WMS服务请求地图时的URL例子:http://172.18.0.154:7001/ServiceRight/proxy/f446aabb04a59af336901290d615e16b/xzcg/WMS/XZ500DLG_BZWGS84?LAYERS=XZ500DLG_BZWGS84&FORMAT=image/gif&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&SRS=EPSG:4326rest
&WIDTH=256&HEIGHT=256&bbox=117.21879147492814,34.240704396544345,117.22000975886715,34.24192268048341。blog
观察这个URL,不少参数在实际运用中能够根据提供的服务而固定,好比FORMAT、LAYERS、REQUEST、SRS、STYLES、VERSION、WIDTH、HEIHT参数。而真正须要咱们实际上去不停换算的即是BBOX了。
WMS请求是一种能够动态出图的请求,原则上它能够显示原始图像在任意比例尺下的地图,它不像瓦片服务,只能显示切图时所设定好的比例尺下的的地图。在咱们使用二次开发包时,好比用esri提供的开发包时,其中只须要咱们设置须要显示的级别数,而不须要咱们设置每一个级别所对应的比例尺,即是由于WMS是一个动态出图服务。在二次开发中,直接使用提供的WMS类是很是简单的,只须要提供显示的范围和须要显示的级别数便可,此类的内部会自动的划分每个级别的比例尺,而WMS是动态出图的,因此彻底能够支持这种方式。
可是,实际中,有的服务商提供的WMS服务却并非这样的,他们颇有可能会在某个比例尺很小的地方作出限制,让咱们只能以某几个固定的比例尺去访问获得瓦片,其余比例尺均不能够。以前替其余组同事处理过的一个利用基于FlexViewer框架下的WMS类加载地图时,在特定的某几个级别上不显示地图,即是这个缘由了。而解决这个问题的方法是从新扩展这个类,使扩展的WMSEX类可以经过设定好的每一个级别的比例尺来换算出对应的Bbox,这里咱们以前获得的行列号的算法就终于有用途了。
minX=resolution*tileSize*col;
minY=resolution*tileSize*row;
maxX=resolution*tileSize*(col+1);
maxY=resolution*tileSize*(row +1);
Bbox=“minX,minY,maxX,maxY”;
WMTS服务的全称是Web Map Tile Service,故名思议,不一样于以前的WMS的动态出图,WMTS服务是基于瓦片思想的。WMTS同样支持提供必定的标准服务,好比:
GetCapabilities(获取服务的元信息,在这个元信息中咱们能够看到切图的详细配置)。
GetTile(获取切片)。
GetFeatureInfo(可选,获取点选的要素信息)。
能够看到这些操做和WMS的操做很是的相同。
咱们再来看一下WMTS下请求地图瓦片的URL例子,这里我以天地图中的URL为范例:http://srv.zjditu.cn/ZJEMAP_2D/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&LAYER=ZJEMAP&FORMAT=image/png&TILEMATRIXSET=TileMatrixSet0&TILEMATRIX=17&STYLE=default&TILEROW=21747&TILECOL=109282。
观察这个URL所包含的参数,在获取瓦片前咱们是能够将FORMAT、LAYER、REQUEST、SERVICE、STYLE、VERSION根据需求而写定的,在不断变化的是TILEMATRIX、TILEROW、TILECOL。
WMTS服务和咱们以前反复讨论的瓦片思想是符合的,观察参数也能看出,TILEMATRIX、TILEROW、TILECOL其实就是Level、row、col。因而WMTS服务下的瓦片请求的URL也变瓜熟蒂落的能够拼出来了:固定格式URL+“&TILEMATRIX=”+level+“&TILEROW=”+row+“&TILECOL=”+col。
AGS中,在对发布的服务进行了切图后,地图的请求URL成了一种固定的格式。如:http://172.29.0.74:8399/arcgis/rest/services/HFTile/MapServer/tile/2/957/834。
显而易见,在tile后的即是Level、row、col。因此AGS下的URL写法即是:restMapService地址/Level/row/col。
问题一:
一个地图须要前几个级别地图是来源于A服务,它的服务地址是AURL。中间几个级别地图来源于B服务,它的服务地址是BURL,后面几个别地图是来源于C服务,它的服务地址是CURL。这个时候咱们该如何让系统能够在每一个级别正常的出图呢?
问题二:
一个地图须要同时显示地形图和注记图层,且地形图服务来源于A服务,注记图层来源于B服务。如何能正常的加载两个服务,而且让注记图层正常的叠加在地形图上呢?
问题三:
仍是一个地图须要同时显示地形图和注记图层,可是此时地形图服务是WMTS服务,而注记图层是WMS服务。如何将两种不一样服务的瓦片获取后叠加呢?
问题我就只提这三个吧,这种相似的问题特别特别多,可是我想只要咱们知道了各类服务的URL得到原理,再加上一点点本身解决问题的思路,应该都不难解决的。在之后的栅格图层(瓦片图层)设计的章节里,我会给出一个咱们解决此类问题的方法,该方法能很通用的解决这一系列问题。
讲到这里时,整个系列中,咱们已经讲了行列号是什么、如何获取行列号、经过行列号获得瓦片URL。能够说咱们如今距离如何在前端显示出栅格图像,是万事俱备只欠东风了。那么下一章节里,我将给你们借来这个东风。下一节内容是:瓦片在前端拼接显示的原理。欢迎你们持续关注。
并非只有在开着本身的车时才是自由,只要咱们双腿还在,都能远行。
-----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/
若是您以为本文确实帮助了您,能够微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^