文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

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。可以说我们现在距离如何在前端显示出栅格图像,是万事俱备只欠东风了。那么下一章节里,我将给大家借来这个东风。下一节内容是:瓦片在前端拼接显示的原理。欢迎大家持续关注。

并不是只有在开着自己的车时才是自由,只要我们双腿还在,都能远行。

                        -----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                    

(五)WebGIS中通过行列号来换算出多种瓦片的URL 之在线地图的更多相关文章

  1. 从底层谈WebGIS 原理设计与实现(五):WebGIS中通过行列号来换算出多种瓦片的URL 之在线地图

    从底层谈WebGIS 原理设计与实现(五):WebGIS中通过行列号来换算出多种瓦片的URL 之在线地图 作者:naaoveGI…    文章来源:naaoveGIS    点击数:2063    更 ...

  2. WebGIS中通过行列号来换算出多种瓦片的URL 之离线地图(转载)

    WebGIS中通过行列号来换算出多种瓦片的URL 之离线地图 1.前言 在前面我花了两个篇幅来讲解行列号的获取,也解释了为什么要获取行列号.在这一章,我将把常见的几种请求瓦片时的URL样式罗列出来,并 ...

  3. 从底层谈WebGIS 原理设计与实现(四):WebGIS中通过行列号来换算出多种瓦片的URL 之离线地图

    从底层谈WebGIS 原理设计与实现(四):WebGIS中通过行列号来换算出多种瓦片的URL 之离线地图 作者:naaoveGI…    文章来源:naaoveGIS    点击数:1759    更 ...

  4. (四)WebGIS中通过行列号来换算出多种瓦片的URL 之离线地图

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.前言 在前面我花了两个篇幅来讲解行列号的获取,也解释了为什么要获取行 ...

  5. 【总结整理】webGIS学习thinkGIS(四)WebGIS中通过行列号来换算出多种瓦片的URL 之离线地

    http://www.thinkgis.cn/topic/541a5319da8db186fd06e097 1.前言 在前面我花了两个篇幅来讲解行列号的获取,也解释了为什么要获取行列号.在这一章,我将 ...

  6. (十五)WebGIS中平移功能的设计和实现

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 这一章我们将详细讲解WebGIS工具栏中另一个基础工具——平 ...

  7. WebGIS中自定义互联网地图局部注记的一种方案

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.    前言 实际项目中我们经常会遇到这样一种场景:地图底图可能是互 ...

  8. (八)WebGIS中栅格图层的设计

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.    前言 我们在上一章里了解到WebGIS中栅格图层的本质—— ...

  9. 从底层谈WebGIS 原理设计与实现(三):WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理(转载)

    从底层谈WebGIS 原理设计与实现(三):WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理 1.前言   在上一节中我们知道了屏幕上一像素等于实际中多少单位长度(米或经纬度)的换算方法, ...

随机推荐

  1. Kafka设计解析(二)- Kafka High Availability (上)

    本文转发自Jason’s Blog,原文链接 http://www.jasongj.com/2015/04/24/KafkaColumn2 摘要 Kafka在0.8以前的版本中,并不提供High Av ...

  2. mysql 命令行还原备份数据库

    通常数据库还原备份可以通过navicat等数据库管理工具进行,只需要简单的导出导入就行了,但遇到有索引外键的数据库,数据库管理工具运行.sql文件会报错,这时候可以尝试命令行导入,亲测可以成功 MyS ...

  3. HTML5- Canvas入门(一)

    周老虎落网的时候,网易跟腾讯都推出了牛逼轰轰的HTML5页面来展示其关系网(网易http://news.163.com/special/data_zyk/  ,腾讯http://news.qq.com ...

  4. Java多线程7:死锁

    前言 死锁单独写一篇文章是因为这是一个很严重的.必须要引起重视的问题.这不是夸大死锁的风险,尽管锁被持有的时间通常很短,但是作为商业产品的应用程序每天可能要执行数十亿次获取锁->释放锁的操作,只 ...

  5. 日志系统实战(一)—AOP静态注入

    背景 近期在写日志系统,需要在运行时在函数内注入日志记录,并附带函数信息,这时就想到用Aop注入的方式. AOP分动态注入和静态注入两种注入的方式. 动态注入方式 利用Remoting的Context ...

  6. iTextSharp 116秒处理6G的文件

    前言: 有一家印刷企业专为米兰新娘,微微新娘,金夫人这样的影楼印刷婚纱相册.通过一个B2B销售终端软件,把影楼的相片上传到印刷公司的服务器,服务器对这些图片进行处理. 比如: 1)为每个图片生成订单条 ...

  7. 干掉Unity3D

    我为什么想干掉Unity3D? 这个问题容我不答,每个做技术的人总有一些完美主义. 你使用u3d的过程中是不是痛并快乐着呢. 就从两个国内具有相当普遍性的痛点说起. il2cpp,unity作出了这个 ...

  8. 用css画出三角形

    看到有面试题里会有问到如何用css画出三角形 众所周知好多图形都可以拆分成三角形,所以说会了画三角形就可以画出很多有意思的形状 画出三角形的原理是调整border(边框)的四个方向的宽度,线条样式以及 ...

  9. Text文档编码识别方法

    Text文档编码识别方法 在做文档读取的时候,时常碰到编码格式不正确的问题,而要怎么样正确识别文档的编码格式,成了很多程序员的一块心病,今天我就要试着治好这块心病,这段代码的浓缩来自上千万文档的数据分 ...

  10. 【Win 10开发】协议-上篇:自定义应用协议

    就像系统许多内置应用可以通过URI来启动(如ms-settings-bluetooth:可以打开蓝牙设置页),我们自己开发的应用程序,如果需要的话,可以为应用程序自定义一个协议.应用程序协议在安装时会 ...