从底层谈WebGIS 原理设计与实现(五):WebGIS中通过行列号来换算出多种瓦片的URL 之在线地图
1.前言
这篇文章里,我主要针对OGC标准中的WMS、WMTS以及ArcGIS的在线地图服务来进行解析。
写之前,我先来给大家提一下OGC是什么。OGC的全名是Open GIS Consortium,中文名是开放地理空间信息联盟,它是一个是非盈利、志愿的国际标准化组织。在空间数据互操作领域,基于公共接口访问模式的互操作方法是一种基本的操作方法。通过国际标准化组织(ISO/TC211)或技术联盟(如OGC)制定空间数据互操作的接口规范,GIS软件商开发遵循这一接口规范的空间数据的读写函数,从而可以实现异构空间数据库的互操作(来自百度百科)。
目前OGC制定的标准有:WMS(地图服务)、WMTS(地图瓦片服务)、WFS(要素服务)、WCS(栅格服务)。在下面我介绍的地图请求方式皆是RESTFUL下的请求方式。
2.WMS服务的URL
WMS服务可以提供以下几种服务:
GetCapabilities返回服务级元数据。
GetMap返回一个地图影像。
GetFeatureinfo返回显示在地图上的某些特殊要素的信息等。
2.1例子
我们来看一下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:4326
&WIDTH=256&HEIGHT=256&bbox=117.21879147492814,34.240704396544345,117.22000975886715,34.24192268048341。
观察这个URL,很多参数在实际运用中可以根据提供的服务而固定,比如FORMAT、LAYERS、REQUEST、SRS、STYLES、VERSION、WIDTH、HEIHT参数。而真正需要我们实际上去不停换算的便是BBOX了。
2.2原理
WMS请求是一种可以动态出图的请求,原则上它可以显示原始图像在任意比例尺下的地图,它不像瓦片服务,只能显示切图时所设定好的比例尺下的的地图。在我们使用二次开发包时,比如用esri提供的开发包时,其中只需要我们设置需要显示的级别数,而不需要我们设置每个级别所对应的比例尺,便是因为WMS是一个动态出图服务。在二次开发中,直接使用提供的WMS类是非常简单的,只需要提供显示的范围和需要显示的级别数即可,此类的内部会自动的划分每一个级别的比例尺,而WMS是动态出图的,所以完全可以支持这种方式。
2.3 注意
但是,实际中,有的服务商提供的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”;
3.WMTS服务
WMTS服务的全称是Web Map Tile Service,故名思议,不同于之前的WMS的动态出图,WMTS服务是基于瓦片思想的。WMTS一样支持提供一定的标准服务,比如:
GetCapabilities(获取服务的元信息,在这个元信息中我们可以看到切图的详细配置)。
GetTile(获取切片)。
GetFeatureInfo(可选,获取点选的要素信息)。
可以看到这些操作和WMS的操作非常的相同。
3.1例子
我们再来看一下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。
3.2原理
WMTS服务和我们之前反复讨论的瓦片思想是符合的,观察参数也能看出,TILEMATRIX、TILEROW、TILECOL其实就是Level、row、col。于是WMTS服务下的瓦片请求的URL也变顺理成章的可以拼出来了:固定格式URL+“&TILEMATRIX=”+level+“&TILEROW=”+row+“&TILECOL=”+col。
4.常见地图服务器发布的地图中的URL——以AGS服务为例
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。
5.提几个问题
问题一:
一个地图需要前几个级别地图是来源于A服务,它的服务地址是AURL。中间几个级别地图来源于B服务,它的服务地址是BURL,后面几个别地图是来源于C服务,它的服务地址是CURL。这个时候我们该如何让系统可以在每个级别正常的出图呢?
问题二:
一个地图需要同时显示地形图和注记图层,且地形图服务来源于A服务,注记图层来源于B服务。如何能正常的加载两个服务,并且让注记图层正常的叠加在地形图上呢?
问题三:
还是一个地图需要同时显示地形图和注记图层,但是此时地形图服务是WMTS服务,而注记图层是WMS服务。如何将两种不同服务的瓦片获取后叠加呢?
问题我就只提这三个吧,这种类似的问题特别特别多,但是我想只要我们知道了各种服务的URL获得原理,再加上一点点自己解决问题的思路,应该都不难解决的。在以后的栅格图层(瓦片图层)设计的章节里,我会给出一个我们解决此类问题的方法,该方法能很通用的解决这一系列问题。
6.总结
讲到这里时,整个系列中,我们已经讲了行列号是什么、如何获取行列号、通过行列号得到瓦片URL。可以说我们现在距离如何在前端显示出栅格图像,是万事俱备只欠东风了。那么下一章节里,我将给大家借来这个东风。下一节内容是:瓦片在前端拼接显示的原理。欢迎大家持续关注。
从底层谈WebGIS 原理设计与实现(五):WebGIS中通过行列号来换算出多种瓦片的URL 之在线地图的更多相关文章
-
(五)WebGIS中通过行列号来换算出多种瓦片的URL 之在线地图
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 这篇文章里,我主要针对OGC标准中的WMS.WMTS以及Ar ...
-
从底层谈WebGIS 原理设计与实现(四):WebGIS中通过行列号来换算出多种瓦片的URL 之离线地图
从底层谈WebGIS 原理设计与实现(四):WebGIS中通过行列号来换算出多种瓦片的URL 之离线地图 作者:naaoveGI… 文章来源:naaoveGIS 点击数:1759 更 ...
-
WebGIS中通过行列号来换算出多种瓦片的URL 之离线地图(转载)
WebGIS中通过行列号来换算出多种瓦片的URL 之离线地图 1.前言 在前面我花了两个篇幅来讲解行列号的获取,也解释了为什么要获取行列号.在这一章,我将把常见的几种请求瓦片时的URL样式罗列出来,并 ...
-
(四)WebGIS中通过行列号来换算出多种瓦片的URL 之离线地图
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.前言 在前面我花了两个篇幅来讲解行列号的获取,也解释了为什么要获取行 ...
-
【总结整理】webGIS学习thinkGIS(四)WebGIS中通过行列号来换算出多种瓦片的URL 之离线地
http://www.thinkgis.cn/topic/541a5319da8db186fd06e097 1.前言 在前面我花了两个篇幅来讲解行列号的获取,也解释了为什么要获取行列号.在这一章,我将 ...
-
从底层谈WebGIS 原理设计与实现(三):WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理(转载)
从底层谈WebGIS 原理设计与实现(三):WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理 1.前言 在上一节中我们知道了屏幕上一像素等于实际中多少单位长度(米或经纬度)的换算方法, ...
-
从底层谈WebGIS 原理设计与实现(六):WebGIS中地图瓦片在Canvas上的拼接显示原理
从底层谈WebGIS 原理设计与实现(六):WebGIS中地图瓦片在Canvas上的拼接显示原理 作者:naaoveGI… 文章来源:naaoveGIS 点击数:1145 更新时间: ...
-
从底层谈WebGIS 原理设计与实现(二):探究本质,WebGIS前端地图显示之地图比例尺换算原理
从底层谈WebGIS 原理设计与实现(二):探究本质,WebGIS前端地图显示之地图比例尺换算原理 作者:naaoveGI… 文章来源:http://www.cnblogs.com/naaove ...
-
从底层谈WebGIS 原理设计与实现(一):开篇
从底层谈WebGIS 原理设计与实现(一):开篇 作者:naaoveGI… 文章来源:http://www.cnblogs.com/naaoveGIS/ 点击数:4773 更新时间: ...
随机推荐
-
IE浏览器打开chorme浏览器,如何打开其他浏览器
看到这个标题是否感觉奇怪,为什么要用IE浏览器打开chorme或者火狐浏览器等,这个功能从开发者来说不是一个好的需求,但确实是真实存在的,有用公司的背景历史比较复杂,而且公司有过长期的开发历史,这导致 ...
-
MessageDigest简要
本文博客原 參考文章:http://blog.sina.com.cn/s/blog_4f36423201000c1e.html 一.概述 java.security.MessageDigest类用于为 ...
-
jquery.validate 验证(支持前台js验证通过,然后ajax后台数据校验)二
jquery.validate 为啥 源码 里面 规定 dataType: "json" 呢 因为 他配套的 是 messages 下面 的 remote 属性 验证失 ...
-
【.net 深呼吸】在运行阶段修改应用配置文件
上一篇博文中,老周所介绍的自行编写的配置类,虽然能够很好地做封装,但它仅允许修改用户级别的配置,所以文件都是保存到用户配置目录下的.可是,许多情况下,我们还是不考虑用户隔离,而是能够直接修改与应用程序 ...
-
【移动开发】SharedPreferences的兼容版本
public class SharedPreferencesCompat { private static final String TAG = SharedPreferencesCompat.cla ...
-
Windows10远程报错:由于CredSSP加密Oracle修正
Windows10远程桌面连接 报错信息 : 网上找到方法 但是奈何是 "Win10家庭版" 不能使用这个办法,具体操作可以看最后的引用链接 !!!! 策略路径:"计算机 ...
-
LinkedList - 好一个双向链表
LinkedList是常用的集合结构之一,数据存储结构为链式存储,每个节点都有元素.前指针和后指针,指针指向了前节点和后节点的位置.同是LinkedList也是一个队列,实现了Deque接口,Dequ ...
-
【Java每日一题】20170329
20170328问题解析请点击今日问题下方的“[Java每日一题]20170329”查看(问题解析在公众号首发,公众号ID:weknow619) package Mar2017; public cla ...
-
yield return:使用.NET的状态机生成器
通过关键字词组yield return,.Net Framework(从2.0开始)会为我们生成一个状态机.状态机实际上就是一个可枚举的类型化集合 理解yield return的工作方式 关键字词组y ...
-
python学习之----遍历单个域名和随机数
实现“*六度分隔理论”的查找方法.也就是说,我们要实现从埃里克 · 艾德尔的词条页面(https://en.wikipedia.org/wiki/Eric_Idle)开始,经过最少的链接点击次数 ...