4.4. WMS规范基础

开放地理空间联盟(OGC)Web地图服务(WMS)规范为通过Web服务提供地图服务提供了一种模式。WMS接收到一个请求,该请求详细说明了地图的边界框(或范围)、要包含的图层、要使用的投影和其他参数。它以通用格式(如JPG、GIF或PNG)返回栅格化的地图图像。它不返回任何实际的GIS数据,尽管规范的可选部分描述了用户如何查询服务的任何像素以检索属性信息。

WMS从2000年就开始出现了,并得到了一些最早的FOSS GIS服务器的支持。如今,自由/开源软件和专有地理信息系统软件仍然广泛支持这一点。尽管它有时被批评为笨重,但WMS在在线地图领域已经实现了更大程度的互操作性。

如果您确实需要高级别的互操作性,并且不需要闪电般的快速性能或处理数十个并发用户的能力,请将WMS视为一个选项。如果需要更高的性能和可伸缩性,应该考虑瓦片映射,包括OGC认可的WMTS(Web地图瓦片服务)规范。下一课将介绍瓦片地图服务。使用GetMap操作从WMS请求地图

熟悉WMSs的最好方法是看一个真实的WMSs。因此,请仔细检查以下URL,然后在web浏览器中打开链接:

https://imagery.pasda.psu.edu/arcgis/services/pasda/UrbanTreeCanopy_Landcover/MapServer/WmsServer?SERVICE=WMS&version=1.1.1&REQUEST=GetMap&LAYERS=10&STYLES=&BBOX=-77.87304,40.78975,-77.85828,40.80228,-77.85828,40.80228&SRS=EPSG:4326&FORMAT=image/png&WIDTH=1200&HEIGHT=900

该请求使用WMS的GetMap操作检索基于州立学院区域的图像和LiDAR数据的具有土地覆盖分类的地图。如果您熟悉校园,则可能会在图像中识别出一些建筑物和道路。此 WMS 由 PASDA网站门户 提供。

../../_images/qgis34_699_1.PNG

图4.1 WMS GetMap示例输出

尽管WMS可以执行多种类型的操作,但GetMap是最常见的。是那个给你寄回地图图像的。

WMS URL的根目录https://www.e-education.psu.edu/geog585/node/699/ ... / MapServer / WmsServer?)可以通过多种方式形成(通常以'wms结尾) ?”而不是“ WmsServer?”),但后面的参数是? 必须根据WMS规范进行格式化。让我们检查一下以上URL中使用的参数。

输入表格标题

参数

示例值

笔记

SERVICE

WMS

表示正在调用WMS。

VERSION

1.1.1

此WMS可以预期遵守的WMS规范的版本

REQUEST

GetMap

这是正在从WMS请求的操作。GetMap方法是在WMS上调用的最常见的操作,它实际上是返回地图图像的操作。GetCapabilities方法是另一个常见的操作,它返回一些描述WMS可以做什么的XML元数据。

LAYERS

10

WMS绘制地图时应包含的以逗号分隔的图层列表。有些WMS(如本例)被视为不打算绘制在一起的单独层的集合。其他 WMS的图层设计为重叠或分组绘制。在这个WMS中,图层的名称是数字,但也可以是实名,如“landcover_2006_statecollege”。

STYLES

在该参数中,可以定义自己的样式,以便在绘制WMS时将其应用于WMS。我们没有提交这个参数,因此我们得到了服务器上定义的默认样式。

SRS

EPSG:4326

WMS绘制地图时将使用的坐标系。这里使用EPSG代码指定(您在前面的课程中看到)。客户机可以请求在WGS 84(EPSG:4326)或WMS发布者在WMS上显式启用的任何坐标系中绘制WMS。如果不确定WMS发布服务器启用了哪些坐标系,则可以在请求地图图像之前使用GetCapabilities方法查找。

BBOX

-77.87304、40.78975、-77.85828、40.80228、-77.85828、40.80228

WMS将返回的地图的矩形范围。通过以逗号分隔的方式指定左下角和右上角的坐标来给出。

FORMAT

图片/png

WMS应返回的图像格式。在这种情况下,服务器将返回一个PNG。你的选择会影响你的服务表现。对于遥感图像,像image/jpeg这样的格式可能导致服务器和客户端之间传输的数据更少(因此绘制时间更快)。

WIDTH

1200

返回图像的宽度(像素)。

HEIGHT

900

返回图像的高度(像素)。

从 WMS 请求地图时,必须提供一些必需的参数,如果WMS发布服务器已实现这些参数,则可以决定提供一些可选参数。上表中的所有参数都是必需的。可选参数可以显示时间和高程标注等内容。第7.3.2节表8Version 1.3.0 WMS Specification 显示GetMap请求的所有参数,以及它们是必需的还是可选的。如果您对如何设置参数的格式有疑问,可以始终参考规范;但是,大多数GIS软件为您提供了与WMSs交互的用户友好界面,这样您就不必自己制定url。

4.4.1. 其他WMS操作

除了GetMap请求,WMS还支持另一个必需操作(GetCapabilities)和可选操作(GetFeatureInfo)。

4.4.2. GetCapabilities

GetCapabilities请求返回有关服务的元数据,您可以在发出其他类型的请求时将其用作指南。以下是我们的土地覆盖WMS的GetCapabilities请求:

https://imagery.pasda.psu.edu/arcgis/services/pasda/UrbanTreeCanopy_Landcover/MapServer/WmsServer?SERVICE=WMS&REQUEST=GetCapabilities

注意,这个URL比GetMap要简单得多。当您调用GetCapabilities时,您通常还不太了解该服务;因此,您不需要提供一堆参数。你实际上是在问,“告诉我这个服务包含什么,它能做什么。”

当您点击上面的URL时,查看web浏览器中返回的XML响应

请注意,您可以看到有关WMS中每个层的信息,这在发出GetMap请求时非常有用,并且您希望知道要为LAYERS参数指定的适当名称。

<Layer queryable="1">
   <Name>10</Name>
   <Title>
     <![CDATA[ LandCover_UTC_2006_StateCollege ]]>
   </Title>
   <Abstract>
     <![CDATA[ ]]>
  </Abstract>
   ...
</Layer>

您还可以看到服务发布者已决定支持该层的空间参考系统的列表。

<CRS>CRS:84</CRS>
<CRS>EPSG:4326</CRS>
<CRS>CRS:4269</CRS>

GetFeatureInfo

GetFeatureInfo是服务发布者可以启用的可选方法,允许用户在特定位置查询WMS层的属性数据。这使得添加交互元素(如信息弹出窗口)成为可能,而无需寻求第二个web服务的帮助。

当您发出GetFeatureInfo请求时,您将提供与GetMap请求相同的许多参数,并添加要查询的像素的屏幕坐标。

土地覆盖示例说明第9层是可查询的,因此请尝试以下查询URL,以查询宽度为1200、高度为900的地图图像中坐标x=600和y=300处的要素:

https://imagery.pasda.psu.edu/arcgis/services/pasda/UrbanTreeCanopy_Landcover/MapServer/WmsServer?SERVICE=WMS&version=1.1.1&REQUEST=GetFeatureInfo&LAYERS=10&STYLES=&SRS=EPSG:4326&BBOX=-77.87304,40.78975,-77.85828,40.80228,-77.85828,40.80228&FORMAT=image/png&WIDTH=1200&HEIGHT=900&QUERY_LAYERS=9&INFO_FORMAT=text/plain&X=600&Y=300

在这种情况下,返回的纯文本响应将告诉您这些坐标的像素值是5,根据description at PASDA 意思是“建筑”:

@9
PixelValue;OBJECTID;COUNT;
5;5;1378041;

GetFeatureInfo有点像通配符,因为WMS规范没有为返回的信息指定任何特定的结构或格式。如果不知道是谁发布了服务,则必须发出请求并检查响应,以便了解如何处理返回的信息。GetCapabilities响应可以显示您可以请求的受支持的信息格式:

<GetFeatureInfo>
   <Format>application/vnd.esri.wms_raw_xml</Format>
   <Format>application/vnd.esri.wms_featureinfo_xml</Format>
   <Format>application/vnd.ogc.wms_xml</Format>
   <Format>text/xml</Format>
   <Format>text/html</Format>
   <Format>text/plain</Format>
   ...
</GetFeatureInfo>