Ethan's Blog

记录和思考

GeoServer 基础教程(四):空间数据互操作的接口规范 WMS、WFS 和 WCS

前面几节介绍了 GeoServer 基础教程的一些基本操作,相信大家对 GeoServer 的基本操作都比较熟悉了。我们知道 GeoServer 使用开放地理空间联盟(OGC)提出的开放标准,支持三种空间数据互操作的接口规范 WMS、WFS 和 WCS,这一节我们就来介绍这三种规范,为以后使用这些规范开发基于 GeoServer 的 Web 应用打下基础。

首先简单介绍一下 OGC(Open Geospatial Consortium,开放地理信息协会)和 Web Services 以及他们之间的关系。

OGC 是一个非赢利的国际化标准制定组织,领导进行对地理数据相关的操作和服务标准的制定。OGC 最主要的一项计划是互操作计划(Interoperability Program,简称 IP),该项目的目标是提供一套综合的开放接口规范,以使软件开发商可以根据这些规范来编写互操作组件,从而满足互操作需求。

Web Services 即 Web 服务,它是自包含的、模块化的应用程序,它可以在网络中被描述、发布、查找以及调用。Web 服务的一个主要思想,就是未来的应用将由一组应用了网络的服务组合而成。在 Web Services 体系中,所有东西都是服务,这些服务发布一个 API 供网络中的其他服务或者应用使用,并且封装了实现细节。Web Services 是 OGC 规范以及建立面向服务的空间共享体系的基础技术体系。空间信息 Web 服务是在 Web 服务技术和标准基础之上实现的地理空间信息网上在线服务。它利用 Web 服务技术提供的公共接口、交换协议和服务规范,提供应用客户管理、注册服务、编码、处理服务、描述服务和数据服务等。主要的应用客户包括发现客户、地图浏览客户、影像利用客户等。空间信息 Web 服务除了采用基本的 Web 服务技术协议外,还需要相关地理空间信息及处理的技术协议,目前主要有 OGC、ISO/TC211 和 W3C 等组织在进行相关协议标准的制定。 OGC Web 服务(OWS)即是典型的空间信息 Web 服务标准体系。

OGC Web 服务公共执行规范详细描述了 OWS 接口执行规范包含的公共方面:

  • 操作请求和响应的内容
  • 操作请求和响应包含的参数和数据结构
  • 操作请求和响应的 XML 和 KVP 编码

这些规范目前包括网络地图执行规范(WMS)、网络特征数据执行规范(WFS)、网络覆盖执行规范 (WCS)。下面逐一为大家介绍。

WMS(Web Map Service,网络地图执行规范)

Web 地图服务(WMS)利用具有地理空间位置信息的数据制作地图。在 WMS 规范中将地图定义为地理数据可视的表现,WMS 返回的不是地图数据,而是地图图象。

WMS 规范定义了三个操作:

  1. GetCapabilities 操作返回服务级元数据,它是对服务信息内容和请求参数的一种描述,元数据使用 XML 形式文件表示;
  2. GetMap 操作根据客户端发出的请求参数在服务端进行检索,服务器返回一个地图图象,其地理空间参数和大小是已经明确定义的,返回的地图图象可以是 GIF,JPEG,PNG 或 SVG 格式的;
  3. GetFeatureInfo 操作根据用户请求的 X,Y 坐标或感兴趣的图层,返回这些特殊要素的信息,信息以 HTML,GML 或者 ASCII 格式表示。

GetCapabilities (必须)

该操作的目的在于获取服务元数据,元数据是对服务器信息内容和可接受的请求参数值的一种机器可读性(并且可以人读)描述。

GetCapabilities 操作的参数 GetCapabilities 操作的参数

GetCapabilities 操作的参数详解:

FORMAT:该可选参数规定服务元数据的格式要求。WMS 服务器上 GetCapabilities 请求支持的值由服务元数据中的一个或多个 <Request><GetCapabilities><Format> 元素列出.。如果请求描述的格式不被服务器支持,服务器应该返回默认的 text/xml 格式。

VERSION:确定请求服务的版本。

SERVICE:该强制性参数指示哪个可用的服务类型将被激活,在 WMS 上当激活一个 GetCapabilities 时,值”WMS” 就应该被使用。

REQUEST:要激活 GetCapabilities 操作,值”GetCapabilities” 就应该被用到。

UPDATESEQUENCE:该可选参数是为维持缓冲区一致而设置的,它的值可以为一个代表一个符合 ISO 8601:2004 格式(原文附录 D)的时间标签(timestamp)的 integer、string 或者其他 string。服务器可能包含一个 UpdateSequence 值于服务元数据中,如果这样,当 Capablities 被改变(e.g. 当新的 maps 添加到给服务中)的时候,这个值应该被增加。客户端可能在其 GetCapabilities 请求中包含该参数。

GetMap(必须)

GetMap 操作返回一幅地图(map),接收到 GetMap 请求后,WMS 要么满足请求要么发送一个异常。

GetMap 请求的参数 GetMap 请求的参数

GetMap 请求的参数详解:

LAYERS:该参数值是一个逗号分隔的列表,列表元素为有效图层名称。这些名字应该是在服务元数据中的 <Layer><Name> 元素中已经定义过的字符内容。WMS 在绘制 map 的时候,应该将该列表最左边的层放到层栈的最底部,下一个放在前一个的上面,依此类推。其中可选的 <LayerLimit> 元素在服务元数据中为一个正数。表明了客户端在一次 GetMap 请求中允许请求的最大图层数。如果忽略了该元素,则服务器没有该限制。

STYLES:以逗号分隔的列表形式表示的请求的每一图层的 STYLE。STYLE 值应该有效,并且 STYLE 值与 LAYERS 参数值总是一一对应的。所以,每个 map 都是按照 LAYERS 的 STYLE 绘制各个 layer,而各个 Layer 的名称必须符合默认的混合形式,则在 STYLE 参数中应该用逗号来分隔一个空值(如”STYLE=style1,style2”),如果服务器为一个 layer 发布多个 Style,而客户端发送了一个默认 style 的请求,选择哪个 style 作为默认值就是服务器的标准了。元数据中 styles 的顺序并不能表明哪个为默认的值。客户端开发人员应该最大限度地减少用户不注意地请求或无意识地获得扭曲的地图。

CRS:CRS 参数声明了应用到 BBOX 请求参数的层 CRS。该参数的值必须为所请求的服务器元数据中已经定义过或从请求层中继承过的.。WMS 不必支持所有的 CRS,但是,对于其已经在服务元数据发布的 CRS 应该支持。如果客户请求其不支持的 CRS,服务器应该返回一个异常(code=”InvalidCRS”) 。如果 WMS 服务已经声明了一个层的 CRS=CRS:1,如前所述,表示该层没有定义好一个坐标参考系统,因此不能与其他层联合显示。客户端应该在 GetMap 中指定 CRS=CRS:1,否则,服务器可能发送一个服务异常。当 CRS 在 请求中使用时,BBOX 参数的单位应该为像素。

BBOX:该参数允许客户请求一个特定的 Bounding Box。该参数的值为逗号分隔的一串实数列表,形如:”minx,miny, maxx, maxy”,它们分部代表请求图层 CRS 下的区域坐标:最小 x、最小 y、最大 x、最大 y。其 x、y 轴的单位、方向、增量都在层 CRS 中定义。BoundingBox 和 map 像素矩阵之间的关系是 BoundingBox 包围在像素矩阵的外边,而不是通过地图周边像素的中心,在该内容中,单个像素描述地面的一个区域。

FORMAT:该强制参数声明了地图的要求格式。WMS 服务器支持的 GetMap 请求格式值在服务元数据中以 <Request><GetMap><Format> 形式列出。<Format> 的整个 MIME 字符串值被用来表示 FORMAT 参数的值,而这个值没有默认值。在 HTTP 环境下,MIME 类型应该使用内容类型实体头文件设置为返回对象。如果请求指定了一个服务器不支持的格式,服务器应该发送一个服务异常(code = ”InvalidFormat” )。

WIDTH、HEIGHT:该强制参数指定产生的地图整数值大小,单位为像素。Map CS 适用于 map,WIDTH-1 指定了 Map CS 中 x 轴方向的最大值,而 HEIGHT-1 则为 y 轴方向的最大值.。如果请求的格式为 picture,则返回的图片将不考虑 MIME 类型,准确地为指定的 width 和 height 像素值。在这种情况下,如果 BBOX 的比率和 width/height 的比率不一致时,WMS 将会拉伸返回的地图以使得最终像素能够在 BBOX 比率下自动生成。换句话说,就是使得在一个输出像素不是方形的,或者拉伸图像区域到不同比率的设备上也能够使用该定义去请求一幅地图。如果 WIDTH/HEIGHT 比率与 X、Y 以及像素尺寸的比率不一致,那么就会发生图像扭曲。

TRANSPARENT:该可选参数定义地图背景是否透明,可取值:”TRUE” 和 FALSE”,默认和参数缺省时取值:FALSE.。绘制透明像素地能力使得不同的地图请求可以被叠置生成一个复合地区。强烈推荐每个 WMS 提供一种可以提供透明图层的格式以使得图层可以与其他图层叠置.。注意:image/gif 格式具有透明性并且可以让通常客户完全显式。image/png 格式提供一个范围内的意义的点,或实体将不能设成透明的,而客户端可能仍然请求 TRANSPARENT=TRUE 当 FORMAT 参数包含一个图形元素格式,TRANSPARENT 参数可能在请求中出现,但其设置值将会被 WMS 忽略。

BGCOLOR:该可选参数为一个字符串,用来指定地图将要使用的背景色(无数据区)。BGCOLOR 通常的格式为一个 RGB 值的十六进制编码,其中对于每个颜色值 red、green 和 blue 使用两个十六进制字符,所以该值的范围为 00 到 FF(十进制的 0 和 255)。其 格式为 oxRRGGBB,RRGGBB 大小写都是允许的。而”0x” 必须为小写的”x”,如果该参数在请求中缺失,则默认的值为 oxFFFFFF(对应的值为白色)。当 FORMAT 值为图像格式时,服务器应该设置背景像素值为 BGCOLOR 值,当 FORMAT 的值为图形元素格式(它们没有显式的背景),或者图像格式时,WMS 应该避免为前景元素使用 BGCOLOR 值,因为这样在该背景颜色下,它们将不可见。当图层已经确定为不透明”opaque” 时,地图上的重要点、实体将不显式任何背景。

GetFeatureInfo(可选)

GetFeatureInfo 是一个可选操作。它只支持可查询属性被定义或继承为 “1”(真)的层。客户端不得向其他层发出 GetFeatureInfo 要求。如果一个 WMS 收到一个 GetFeatureInfo 请求,但不支持它,它会回应一个格式正确的服务异常反应(XML 代码 = OperationNotSupported)。

GetFeatureInfo 操作设计的目的是为一个 WMS 的客户端提供更多返回地图请求的地图要素的信息。GetFeatureInfo 典型用例,一个用户看到一个地图请求响应,在地图上选择一个点(I,j)来获取更多信息。基本操作为客户端提供指定哪个像元被访问, 哪个层应该进行调查,信息应该返回什么样格式的功能。因为 WMS 的协议是无状态的, 对于 WMS,GetFeatureInfo 请求通过包括大部分原始 GetMap 请求参数(除了 VERSION 和 REQUEST)表明用户正预览的是什么地图。从 GetMap 请求下的空间范围信息((BBOX,,CRS,,WIDTH,,HEIGHT)来看,随着用户选择的 I、J 点的变化,WMS 返回关于位置的附加信息。

GetFeatureInfo 的请求参数 GetFeatureInfo 请求参数

GetFeatureInfo 的请求参数详解:

QUERY_LAYERS:QUERY_LAYERS 参数规定查询的图层。它的值是一个以逗号分隔的一个或多个图层列表。此参数应至少包含 1 个图层的名称,但也可以包含比原来的 GetMap 请求的层少。如果在 QUERY_LAYERS 中规定查询的图层没有在 WMS 中的元数据中被定义,将返回 < 服务异常(code = LayerNotDefined)。

INFO_FORMAT:INFO_FORMAT 参数表示返回的特征信息时使用何种格式。WMS 服务器支持的 GetFeatureInfo 请求格式值在服务元数据中以 <Request><FeatureInfo><Format> 形式列出。<Format> 的整个 MIME 字符串值被用来表示 INFO_FORMAT 参数的值,而这个值没有默认值。在 HTTP 环境下,MIME 类型应该使用内容类型实体头文件设置为返回对象。如果请求指定了一个服务器不支持的格式,服务器应该发送一个服务异常(code = ”InvalidFormat” )。

FEATURE_COUNT:FEATURE_COUNT 参数规定在返回的每个图层中所允许包含的特征数据量的最大值。

I,J:指示兴趣点,这是根据地图的 CS 定义,I 和 J 是地图坐标系统中的一个坐标,因此 I 的值应介于 0 与 i 轴的最大值,J 值应介于 0 和第 j 轴的最大值,点 I = 0,J = 0 表示该像素在地图的左上角,I 向右增加而 J 向下增加。点(I,J)表示所指示的像素的中心。如果 j 或者 I 值无效,则服务器会发出一个服务异常(code = InvalidPoint)。

WFS(Web Feature Service,网络特征数据执行规范)

WFS 是基于地理要素级别的数据共享和数据操作,WFS 规范定义了若干基于地理要素(Feature)级别的数据操作接口,并以 HTTP 作为分布式计算平台。通过 WFS 服务,客户端可以得到矢量数据格式描述的单个地理要素的空间数据或要素集的空间数据,并可以对单个地理要素进行编辑、 删除、 添加等数据操作。WFS 采用 GML 描述地理要素特征, 根据用户请求的内容返回 GML 描述的空间数据。

OpenGIS 的 WFS 实施规范为下一步操作逻辑提供支持,提出了描述使用了分布式计算平台 HTTP 地理特征数据处理操作界面。数据处理操作包括以下能力:

  • 创建一个新功能实例
  • 删除功能实例
  • 更新功能的实例
  • 获取或查询功能,对空间和非空间的限制

WFS 规范定义了 6 个基本操作:

  1. GetCapabilities 操作 返回描述 WFS 服务元数据的 XML 文档, 服务元数据描述了该 WFS 服务可以提供的地理要素类型以及针对每个要素类型的操作;
  2. DescribeFeatureType 操作 返回 WFS 能够提供的地理要素类型的 GML 应用模式描述文档;
  3. GetFeature 操作 根据用户查询条件,从 WFS 中获取地理要素,用户可以设定空间和非空间查询条件;
  4. Transaction 操作 为事务请求提供服务。用于描述地理数据变化的操作方法, 如创建、 修改和删除地理要素的操作;
  5. LockFeature 操作 WFS 可以在一个事务处理期间锁定一个地理要素类型中的一个或多个地理要素实例, 这使 WFS 具有支持可序列化事务的能力;
  6. GetGmlObject 操作 一个 WFS 服务可能通过追踪 Xlinks 来获取客户请求所需的构成地理要素的子要素实例。

WCS(Web Coverage Service,网络覆盖执行规范)

WCS 面向空间影像数据,它将包含地理位置值的地理空间数据作为 “覆盖物(COverage)“在网上相互交换。网络覆盖服务由三种操作组成:GetCapabilities,GetCoverage 和 DescribeCoverageType。

  • GetCapabilities 操作返回描述服务和数据集的 XML 文档。
  • GetCoverage 操作是在 GetCapabilities 确定什么样的查询可以执行、什么样的数据能够获取之后执行的,它使用通用的覆盖格式返回地理位置的值或属性。
  • DescribeCoverageType 操作允许客户端请求由具体的 WCS 服务器提供的任一覆盖层的完全描述。

至此,空间数据互操作的接口规范 WMS、WFS 和 WCS 已经介绍完毕,这些都是一些理论的东西,大家可以选择粗略看看,也可以更深入地去学习和理解。当然,如果需要深入学习和理解应用的,紧靠这一节的内容是远远不够的。此外,考虑到 WMS 使用得最为频繁,我在本文中着重介绍了 WMS 服务的规范和请求参数,希望有所助益。

除了本文所介绍的三种协议外,GeoServer 还支持 TMS、WMS-C、WMTS 等多个协议,此外,Web Processing Server(WPS)作为新近推出的标准,也有了越来越广泛的使用,对于这些内容,最好的学习之处还是 OGC 的官网( http://www.opengeospatial.org/ ),本文的大部分内容也是参考翻译于此,感兴趣的朋友可以多多前往学习。

相关文章: