[置顶] MapServer 之 发布网络覆盖数据服务(WCS-Web Coverage Service)

今天我们讲一下使用 mapserver 发布 OGC 的三大网络地图服务的最后一个 - WCS,wcs 主要是规定了通过网络提供访问 coverage 数据的标准,那么什么是 coverage 数据呢? 狭义的说,可以认为 mapserver wcs 中发布的 coverage 数据就是卫星影像 或者 dem。

广义上说,coverage 数据主要是指时空现象的数字表示,可以是多维的,例如一维的传感器时间序列信号,二维的卫星影像,三维的 x/y/t 格式的“图像时间序列”,或者 x/y/z 格式的三维地理断层数据,四维的 x/y/z/t 格式的数据,数据中既包含 x、y、z坐标信息,还包含时刻信息。常见的 coverage 数据有:航拍图、土地覆盖数据、DEM 等,常用的数据格式有:GeoTIFF(扩展名为 .tif)、NetCDF、HDF-EOS 或者 NITF。

文中名词: openlayers3 === ol3

本文尝试发布北京地区的 pm10 分布情况,数据下载于“地理空间信息云”,本文的数据经过在软件中重新渲染,并且重新投影到 epsg:3857 坐标系下。发布后的结果如下:

mapserver 发布 WCS 配置

与配置 wms 和 wfs 一样,mapserver 发布 wcs 同样需要修改对应的 mapfile 文件,增加全局的 WEB 对象的 METADATA 子对象的键值对,但是 wms 和 wfs 都是针对矢量数据,如 ESRI 的 shapefile 格式,而 wcs 主要是针对栅格格式,所以 mapfile 中图层 type 需要设置栅格,数据源也要使用栅格格式。所以,mapfile 文件需要满足如下条件,对应的图层服务才会拥有 wcs 的能力:

  1. 图层的数据源是栅格(raster)数据(如 GeoTIFF 或者 Erdas Imagine 格式)
  2. 图层名(layer name)必须设置,图层类型(layer type)值必须是 RASTER
  3. metadata
    • WEB metadata 或者 LAYER metadata 的 “wcs_enable_request” 参数必须设置
    • WEB metadata 的 “wcs_label” 参数必须设置
    • LAYER 对象的 metadata 中,”wcs_label” 、”wcs_rangeset_name” 、”wcs_rangeset_label” 必须设置
  4. MAP对象、 LAYER对象的 PROJECTION 对象都必须设置,这里LAYER的 PROJECTION 并不会继承 MAP,所以 LAYER 的 PROJECTION 也必须设置
  5. LAYER 设置为接受 wcs 的相关请求,这个有点抽象,一般是通过 “wcs_enable_request” 参数设置的

以上就是 mapfile 需要满足的要求,下面我们通过一个例子来实现针对特定图层发布 wcs。

wcs mapfile 例子

以下的例子是发布 wcs,mapfile 需要的最小配置,有这些配置,wcs 就可以发布成功。当然,mapfile 中还规定了很多参数,wcs 的规范中也规定了很多参数,这些参数可以通过查看 mapserver 的 mapfile 文档: http://mapserver.org/mapfile/index.html,和 wcs 规范: http://www.opengeospatial.org/standards/wcs。

# 发布 WCS 的 mapfile 最小配置文件
# 原文地址: http://blog.csdn.net/qingyafan/article/details/50434132
# @author QINGYAFAN
# @date 2016-2-28

MAP
    NAME wcs_sample
    EXTENT 12847916.7660075146704912 4785268.8040398322045803 13079930.6709103845059872 5021045.0965897748246789
    WEB
        METADATA
            "wcs_enable_request"    "*"
            "wcs_label" "tiff wcs"
        END
    END

    LAYER
        NAME "wcs_layer"
        TYPE RASTER
        DATA "geodata/pm10-color-3857.tif"
        METADATA
            "wcs_label" "pm10"
            "wcs_rangeset_name" "pm"
            "wcs_rangeset_label"    "pm10"
        END
        PROJECTION
            "init=epsg:3857"
        END
    END
END

其实,配置文件中的 EXTENT 参数实际上也可以省略,如果省略, mapserver 会计算出其范围,反之,指定这个参数,那么就会省去每次计算的时间。

调用服务(ol3)

我们使用 openlayers3 来测试调用,我们使用切片图层类型来进行调用,原因是这样的加载速度会快一点。代码如下:

/** 
 * 请求 WCS 的 ol3 调用代码
 * 原文地址: http://blog.csdn.net/qingyafan/article/details/50434132
 * @author QINGYAFAN
 * @date 2016-2-28
 * /

var wcs_layer = new ol.layer.Tile({
    title: 'mapserver-geotiff',
    extent: [12847916.7660075146704912,4785268.8040398322045803,13079930.6709103845059872,5021045.0965897748246789],
    source : new ol.source.TileWMS({
        url: "http://127.0.0.1:8081/cgi-bin/mapserv.exe?",
        params: {
            'map':'C:/xxx/mapfile/wcs_sample.map',
            'SERVICE':'WCS',
            'VERSION':'1.0.0',
            'REQUEST':'GetCoverage',
            'coverage': 'wcs_layer',
            'BBOX':'4785268.8040398322045803,12847916.7660075146704912,5021045.0965897748246789,13079930.6709103845059872',
            'CRS':'EPSG:3857',
            'FORMAT':'image/png'
        },
        serverType: 'mapserver'
    })
});
map.addLayer( wcs_layer );

看完代码,有些朋友可能会注意到,我们的 layer source 使用了 TileWMS,为什么不用 wcs,反而用了 wms 相关呢?其实,第一,是因为 ol3 并没有直接关于 wcs 的类;其次,wcs 的请求方式和 wms 请求方式是一致的,一般是通过 http get 方式,而 ol.source.TileWMS 主要是根据指定的参数构造一个 http get 请求 url,使用异步通信的方式发出请求并接收返回的结果,外层的 ol.layer.Tile 进行结果的展示。

需要注意,请求中的 ‘url’ 参数是指定 mapserv.exe 的位置,一般是放置在 httpd 的 cgi-bin 目录; ‘map’ 参数必须要指定绝对地址,因为 mapserver 只接受绝对位置的 mapfile 文件解析。

调用后的结果就是文章开始时的样子。

延伸

wcs 包含三个操作,以上的调用只是利用了 getCoverage,其余两个操作是: GetCapabilities 和 DescribeCoverage,主要是获取 wcs 的元数据, coverage 的描述性数据。而且 wcs 有三个历史版本,这里使用的 1.0.0,也就是最早的版本,其余的两个版本是 1.1.0 和 2.0,这里不再延伸其区别,有兴趣的可以去看看相关规范和文章。

总结

这篇文章里,我主要介绍了使用 mapserver 发布卫星影像(或者说栅格图片-地图,又或者说 coverage data),发布这些数据的网络服务需要 OGC 的 wcs 规范,这个规范就是针对于发布 coverage data 网络服务。因此,需要进一步的配置和调用说明,可以参考 mapserver 和 ogc wcs 规范。

文中的例子,我会更新到我的 GitHub : https://github.com/QingyaFan。

好的,就写到这里,有什么问题,可以在文章下面留言或者给我发邮件。

你可能感兴趣的:(Webgis,OpenLayers,WCS,MapServer,发布影像)