OpenLayers调用WMS服务

 

ArcGIS学习(五)OpenLayers调用WMS服务 收藏

<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} -->

ArcGIS 学习(五) OpenLayers 调用 WMS 服务

 

<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} -->

OpenLayers

<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

OpenLayers 是一个开源的js 框架,用于在您的浏览器中实现地图浏览的效果和基本的zoompan 等功能。OpenLayers 支持的地图来源包括了WMSGoogleMapKaMapMSVirtualEarth 等等,您也可以用简单的图片作为源,在这一方面OPenLayers 提供了非常多的选择。

  WMS 服务

<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} p {mso-margin-top-alt:auto; margin-right:0cm; mso-margin-bottom-alt:auto; margin-left:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:宋体; mso-bidi-font-family:宋体;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

    1  OGC 组织及其开放性规范

    为了实现异构的地理空间信息及GIS 处理功能的互操作的集成,OGC(Open GIS Consortium) 一直致力于寻求一种方式,将地理信息系统技术、分布处理技术、面向对象技术、数据库设计以及实时信息处理方法有效地结合起来,实现分布式异构平台上GIS 互操作[2 ]。OGC 制定了开放地理信息互操作规范(OGIS) ,试图通过共同的开放地理数据模型(OGM)OGIS 参考模型(ORM) 来实现互操作。其目的是希望提出一个可扩展的、基于各种标准的、能无缝集成各种在线空间处理和位置服务的框架,使得分布式空间处理系统能通过XMLHTTP 技术进行交互,并为各种在线空间数据资源,来自传感器的信息、空间处理服务和位置服务和基于Web 的发现、访问、整合、分析、利用和可视化提供互操作框架[3 ]。

  OGC 的中心主题是共享信息和提供服务,在OGC 的抽象规范中共有17 个主题,其中主题12 是开放式Web Services 空间信息服务框架[45 ],它包含一系列的抽象规范和实现规范。概括地来讲,OGC OpenGIS Web Services(OWS) 包括三个主要的地理信息服务即Web Map Service(WMS)Web Feature Service(WFS)Web Coverage Service(WCS) 。除此之外,还包括Simple Feature Specillcation(SFS)Geography Markup Language(GML) 等。

    2  WMS 规范及其实现过程

    2 1  WMS 规范

  OGC WMS 属于OGC 图示表达服务,它利用具有地理空间位置信息的数据制作地图。在WMS 规范中将地图定义为地理数据可视的表现,WMS 返回的不是地图数据,而是地图图像。WMS 规范定义了三个操作[6 ]:

  ●GetCapabilities 操作返回服务级元数据,它是对服务信息内容和请求参数的一种描述,元数据使用XML 形式文件表示。

  ●GetMap 操作根据客户端发出的请求参数在服务端进行检索,服务器端返回一个地图图像,其地理空间参数和大小参数是已经明确定义的,返回的地图图像可以是GIFJPEGPNGSVG 格式。

  ●GetFeaturelnfo 操作根据用户所请求的XY 坐标或感兴趣的图层,返回地图上某些特殊要素的信息,信息以HTMLGMLASCII 的格式表示。

    2 2  WMS 的具体实现过程

   WMS 的三个操作中,GetCapabilitiesGetMap 是必须要实现的,而GetFeaturelnfo 是可选的,下面介绍这三种操作的具体实现过程。

  WMS 的请求与响应是在客户端和服务器端实现的,客户端既可以是普通的浏览器,也可以是应用系统或组件。图1 是一个用UML 时序图描述的客户端与服务器端的交互过程。

  客户端通过HTTP 协议向服务器端发送请求并完成空间数据的可视化。服务器端要响应三种基于URL 的请求,即GetCapabliltiesGetMapGetFeaturelnfo 。客户端接收GIFJPEGPNG 格式的图像文件或XML 格式的元数据文件、GML 文件。

1  客户端与服务器端的交互过程

Fig. 1  Process of interaction between client and server

  客户端在请求一个Web 地图服务之前,必须了解WMS 服务器所能提供地图的相关信息,这些信息包含在地图元数据文件中。在OGCWMS 规范中,通过发送GetCapabilities 请求获得描述服务器端所能提供服务的元数据,例如,用户可以通过浏览器发送下列请求获得XML 文档:

  http//localhost:8080/query Capabilities?REQU  EST=GetCapabilities & VERSION=version&SERVICE=WMS

  元数据是以XML 文档的形式返回的。XML 文档中提供的信息包括:WMS 服务器支持的所有功能接口列表;所能提供的图像格式;从服务器端传送地图数据的可用的空间参照系列表;从服务器端返回的所有异常的列表;特定与某一软件商的WMS 服务器修改和控制功能的专用元数据的列表;某一WMS 服务器的可用图层及可选属性的列表;该WMS 是否支持可选的GetFeaturelnfo 操作等。

  客户端解析元数据描述文档,从中检索到需要的信息,然后发出下面格式的GetMap 请求,http//localhost8080deegeewms? SERVIC
E=WMS&REQUEST = GetMap&LAYERS = layers&STYLES=styleS&FORMAT = format &sRS=coordinate-system&BBOX=bounding_box&WIDTH = width & HEIGHT=height

  WMS 服务器处理来自用户的请求,通过访问数据库或文件获得需要的数据,以图像的方式返回给用户请求的地图,格式可以为JPEGPNGGIFSVG

  由于每一个GetMap 请求将返回对应一个地图的一个或多个图层。多个图层在构成一个新的地图时就有可能相互覆盖,解决方法就是将它们设置成透明的。用户不仅可以请求单个WMS 服务器上的多个图层,也可以向多个WMS 服务器发出请求,由于每一个服务器有不同的元数据描述文件,客户端就需要向每一个WMS 服务器发送Get Captilities 请求获取各自不同的元数据描述文档,当用户选择的图层分别位于不同的WMS 服务器上时,每一个服务器将返回一个或多个图层,这些图层有可能使用不同的坐标参照系、显示范围等参数,只有参数相同的图层才可以进行叠加。

  选定地图上的某一点,通过发送GetFeaturelnfo 请求可以获得该区域的更详细的信息,WMS 服务器的响应将是以下三种格式的一种,GML 格式、文本格式和HTML 文件。由于GML 是基于XML 的,所以客户端可以通过编程的方式解析GML 文件,转化为可以在浏览器上显示的SVG 矢量格式。

3  基于WMS 的体系结构及实现过程


2  WMS 应用实例体系结构框架

Fig. 2  The architecture of WMS instance

  由于 WMS 规范从语义和语法两个角度详细定义了 WMS 服务器向客户程序提供的操作接口,所以它提供了规范化网络空间信息系统的能力。所有遵循该规范的服务器都可以被客户端访问。同所有基于 Web 的应用程序一样, OGCWMS 规范可以有多种实现方式。三层或多层体系结构由于可以对显示层、业务逻辑层和数据层进行逻辑上和物理上的分离,便于系统的维护和升级,最大程度地减少了系统间的耦合,成为构建基于 Web 的应用系统的首选。本文设计了一个基于开源 WMS 服务器的三层结构的 WMS 应用框架,即 WMS 客户端、 WMS 服务器端和数据源端。其体系结构见图 2
     <!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

OpenLayers 调用 WMS 服务:

          

图像的加载是采用的螺旋式加载。首先从右上角开始按照顺时针方向给整个 img 矩阵建立一个堆栈,其实质是按照堆栈先进后出思想设计的一个数组,然后按堆栈中的位置顺序从视窗中间开始逆时针方向依次加载栅格图像。

整个 img 矩阵构成一个 grid 格网,当移动地图使得 grid 的范围 [ bound ] 不能包含视窗的 bound ,或者地图的显示比例发生变化时会重新向服务器请求数据,否则只会移动各个 img 的位置,从而使得视窗在 grid 之内。

客户端用于栅格图显示的 img 数量是由计算得到的。用户指定的用于显示的 div 作为视窗,视窗大小除以每张 img 的长宽得到一个 m*n 的矩阵,表示要填满整个视窗在长宽方向所需的最少的 img 数量,然后将 Img 长宽方向都缓存两个 img 得到一个 (m+2)*(n+2) 的矩阵,即为客户端 img 数,默认缓存为两格,当然我们也可以将缓存数作为参数传入以改变缓存默认值 buffer ,那么改动之后的矩阵为 (m+buffer)*(n+buffer)

在移动的时候取 grid 网格中左上角那个 tile 的左上角坐标值,即 grid[0][0] 为参考点,当这个点的坐标超出阈值的时候会搬动 grid 中各个节点的位置。

这里的 img openlayers 中其实已经被封装成了 Tile 类,该图层有一个 div 作为容器。每个 image 都有一个 div 将其包装起来, tileSize 是按照 OpenLayers.TILE_WHITH OpenLayers.TILE_HEIGHT 常量事先就定义好了,表示每个 tile 实例的大小。

栅格图形显示之提供了基于标准的 WMS 调用的,即只要服务器端提供了标准的 WMS 服务,客户端就可以调用到。由于 OpenLayers 的螺旋加载功能是和最底下的一层分开的,因此我们可以在最底层扩展自己的栅格地图调用类,即让自己的类继承自 OpenLayers.Layer.Grid ,在我们自己的类中重构 getURL 方法。但是,这也有个弊端,那就是我们依然很大程度上继承了 OpenLayers 的栅格调用方法,这种方法具有很高的重用性,非常利于扩展,但是不一定会带来高的效率。

举个例子:我们需要自己的调用方式,服务器端提供的栅格图金字塔一共有 17 级,整个显示范围是 -180,-90,180,90 ,第零级每张栅格图经纬度方向上的跨度都是 18 度,随着级数升高经纬度方向上的跨度相比前一级都减半,栅格图采用的是格网坐标,坐标原点在左上角。我们自己的调用方式有一部分和 WMS 栅格图调用相同。当移动或者缩放的范围超出阈值的时候会向服务器发送请求,我们根据每个 Tile 的经纬度范围计算得到该栅格图中心点的经纬度坐标,而根据当前经纬度可以知道该分辨率下服务器端栅格图矩阵,然后再根据该分辨率下栅格图的经纬度跨度得到 Tile 在服务器端提供的栅格图上所处的位置,从而取到该图。从服务器端过来的栅格图像每张大小为 256*256 像素。这个过程是很我重新写过的,基本继承了 OpenLayers WMS 调用的核心思想,当然效率也不会有改进。

    其实我们完全可以让自己的栅格显示类直接继承自 OpenLayers.Layer ,这样一方面利用了 OpenLayers 图层操作的框架,令一方面又最大程度上放弃了 OpenLayers 带来低效率的机制。经过本人试验,虽然做了这个改进,但是最终的效果也没有很明显的改进,原因容后续分析。

该部分主要包含 4 个类:

OpenLayers.Layer OpenLayers.Layer.HTTPRequest OpenLayers.Layer.Grid OpenLayers.Layer.WMS ,它们的继承关系如图所示 :

                                           

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值