今天我们讲一下使用 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 坐标系下。发布后的结果如下:
与配置 wms 和 wfs 一样,mapserver 发布 wcs 同样需要修改对应的 mapfile 文件,增加全局的 WEB 对象的 METADATA 子对象的键值对,但是 wms 和 wfs 都是针对矢量数据,如 ESRI 的 shapefile 格式,而 wcs 主要是针对栅格格式,所以 mapfile 中图层 type 需要设置栅格,数据源也要使用栅格格式。所以,mapfile 文件需要满足如下条件,对应的图层服务才会拥有 wcs 的能力:
以上就是 mapfile 需要满足的要求,下面我们通过一个例子来实现针对特定图层发布 wcs。
以下的例子是发布 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 会计算出其范围,反之,指定这个参数,那么就会省去每次计算的时间。
我们使用 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。
好的,就写到这里,有什么问题,可以在文章下面留言或者给我发邮件。