WCS地图服务

WCS – Web Coverage Service ,WCS是OGC定义的在Web上以“Coverage”的形式共享地理空间数据的规范。所谓“Coverage”是指能够返回其时空域中任意指定点的值的数据,其形式易于输入到模型中使用。WCS服务是以“Coverage”的形式实现了栅格影像数据集的共享。

Mapfile 定义

正如在WMS和WFS支持中一样,通过向 .map 文件添加某些元数据关键字/值对来启用 WCS 发布。

fig WCS

MapServer 只针对满足以下条件的层,并将其包含在其WCS功能中:

  • 数据源是一个栅格,并且可以使用 GDAL 处理(例如 GeoTIFF 、Erdas Imaging, ... ...);
  • 必须设置层名称;
  • 图层类型设置为 RASTER
  • 必须设置Web 元数据或图层元数据 wcs_enable_request
  • 必须设置Web元数据 wcs_label
  • 必须设置图层元数据 wcs_labelwcs_rangeset_namewcs-rangeset-label
  • 图层可以通过WCS提供服务(请参见 MS RFC 67 );
  • 必须设置层投影,即使投影设置在地图级别。

看一下本节使用的 Mapfile :

01 MAP
02     EXTENT -180 -90 180 90
03     SIZE 600 300
04     SHAPEPATH "/gdata"
05     OUTPUTFORMAT
06         NAME "GEOTIFF_16"
07         DRIVER "GDAL/GTiff"
08         MIMETYPE "image/tiff"
09         IMAGEMODE FLOAT32
10         EXTENSION "tif"
11     END
12     WEB
13         IMAGEPATH "/ms4w/tmp/ms_tmp/"
14         IMAGEURL "/ms_tmp/"
15         METADATA
16             "wcs_label" "GMap WCS Demo Server"
17             "wcs_description" "Some text description of the service"
18             "wcs_onlineresource" "http://127.0.0.1/cgi-bin/mapserv.exe?"
19             "wcs_fees" "none"
20             "wcs_accessconstraints" "none"
21             "wcs_keywordlist" "wcs,test"
22             "wcs_metadatalink_type" "TC211"
23             "wcs_metadatalink_format" "text/plain"
24             "wcs_metadatalink_href" "http://someurl.com"
25             "wcs_address" "124 Gilmour Street"
26             "wcs_city" "Ottawa"
27             "wcs_stateorprovince" "ON"
28             "wcs_postcode" "90210"
29             "wcs_country" "Canada"
30             "wcs_contactelectronicmailaddress" "blah@blah"
31             "wcs_contactperson" "me"
32             "wcs_contactorganization" "unemployed"
33             "wcs_contactposition" "manager"
34             "wcs_contactvoicetelephone" "613-555-1234"
35             "wcs_contactfacimiletelephone" "613-555-1235"
36             "wcs_service_onlineresource" "http://127.0.0.1/cgi-bin/mapserv.exe?"
37             "wcs_enable_request" "*"
38         END
39     END
40     PROJECTION
41         "init=epsg:4326"
42     END
43     LAYER
44         METADATA
45             "wcs_label" "Elevation/Bathymetry"
46             "wcs_rangeset_name" "Range 1"
47             "wcs_rangeset_label" "My Label"
48         END
49         NAME "world-img"
50         DATA "land_shallow_topo_8192.tif"
51         STATUS OFF
52         TYPE RASTER
53     END
54 END

GetCapabilities请求

如同WMS和WFS中一样,也可以使用 GetCapabilities 来对 WCS 的功能进行查看:

http://mapfig.cn/cgi-bin/mapserv?map=/owg/xmfw8.map&SERVICE=WCS&VERSION=2.0.1&REQUEST=GetCapabilities

对参数使用 Python 进行解析:

>>> [print(x) for x  in url.split('&')]
http://mapfig.cn/cgi-bin/mapserv?map=/owg/xmfw8.map
SERVICE=WCS
VERSION=2.0.1
REQUEST=GetCapabilities

查看输出的 XML 格式的结果,这里只展示与版本相关的地方:

<ows:ServiceType codeSpace="OGC">OGC WCS</ows:ServiceType>
<ows:ServiceTypeVersion>2.0.1</ows:ServiceTypeVersion>
<ows:ServiceTypeVersion>1.1.1</ows:ServiceTypeVersion>
<ows:ServiceTypeVersion>1.0.0</ows:ServiceTypeVersion>
<ows:Profile>http://www.opengis.net/spec/WCS/2.0/conf/core</ows:Profile>

可以看到 WCS 的版本有:

  • 2.0.1
  • 1.1.1
  • 1.0.0

DescribeCoverage请求

DescribeCoverage 请求列出了有关特定覆盖范围产品的更多信息。

http://mapfig.cn/cgi-bin/mapserv?map=/owg/xmfw8.map&SERVICE=WCS&VERSION=2.0.1&REQUEST=DescribeCoverage&COVERAGEID=world-img

参数说明如下:

>>> [print(x) for x  in url.split('&')]
http://mapfig.cn/cgi-bin/mapserv?map=/owg/xmfw8.map
SERVICE=WCS
VERSION=2.0.1
REQUEST=DescribeCoverage
COVERAGEID=world-img

不同版本之间的参数有较大差别,返回的结果也不同,可以分别打开链接看一下:

WFS 1.0.0:

http://mapfig.cn/cgi-bin/mapserv?map=/owg/xmfw8.map&SERVICE=WCS&VERSION=1.0.0&REQUEST=DescribeCoverage&COVERAGE=world-img

对 URL 进行解析:

>>> [print(idx, x) for idx, x  in enumerate(url.split('&'))]
0 http://mapfig.cn/cgi-bin/mapserv?map=/owg/xmfw8.map
1 SERVICE=WCS
2 VERSION=1.0.0
3 REQUEST=DescribeCoverage
4 COVERAGE=world-img

WFS 1.1.1:

http://mapfig.cn/cgi-bin/mapserv?map=/owg/xmfw8.map&SERVICE=WCS&VERSION=1.1.1&REQUEST=DescribeCoverage&IDENTIFIERS=world-img

对 URL 进行解析:

>>> [print(idx, x) for idx, x  in enumerate(url.split('&'))]
0 http://mapfig.cn/cgi-bin/mapserv?map=/owg/xmfw8.map
1 SERVICE=WCS
2 VERSION=1.1.1
3 REQUEST=DescribeCoverage
4 IDENTIFIERS=world-img

GetCoverage的用法

GetCoverage 返回数据,也就是栅格数据。 由于此时请求没法指定文件的名称与后缀,可以将文件下载后保存,并修改成以 .tif 为后缀的文件。 这个文件具有地理空间信息。

http://mapfig.cn/cgi-bin/mapserv?map=/owg/xmfw8.map&SERVICE=WCS&VERSION=1.1.0&REQUEST=GetCoverage&IDENTIFIER=world-img&FORMAT=image/tiff&BOUNDINGBOX=43,33,44,34,urn:ogc:def:crs:EPSG::4326

参数分解如下:

>>> [print(idx, x) for idx, x  in enumerate(url.split('&'))]
0 http://mapfig.cn/cgi-bin/mapserv?map=/owg/xmfw8.map
1 SERVICE=WCS
2 VERSION=1.1.0
3 REQUEST=GetCoverage
4 IDENTIFIER=world-img
5 FORMAT=image/tiff
6 BOUNDINGBOX=43,33,44,34,urn:ogc:def:crs:EPSG::4326

GetCoverage 返回图片

GetCoverage 也可以直接返回图片,只需要修改 format=image/png 。但是要注意,返回的图片,必须在 Web 中通过单独的请求返回,无法作为 <image> 对象在网页中使用。

下面是一个实例, 网页中的图片,此处是无法显示的。但是通过“右键”->“查看图像”,能够看到是一幅图片。