一、环境搭建
- 操作系统:Windows 7 x64;
- 地图服务器:MapServer 6.40;
- Web服务器:Apache httpd 2.2;
- 空间数据库:PostgreSQL/PostGIS 9.2.
1、 Apache HTTP Server
Apache HTTP Server(httpd)是一个开源的Web服务器,可以运行在多个操作系统中,包含UNIX、Linux和Windows,能够提供安全、高效和可扩展的web服务,提供与当前的HTTP标准同步的HTTP服务。
Httpd项目在1995年启动,1996年4月就变成了最流行的web服务器软件,至今已有20年的历史了。
最近的版本是在2015年1月29日发布的,版本号为2.4.12,相对于上一个版本,主要增加了一些新特性,主要包括:动态加载MPM(Multi-Processing Modules,多道处理模块),对OCSP(Online Certificate Status Protocol,线证书状态协议)的支持,增加‘mod_lua’模块,动态反向代理配置,身份验证/授权,FastCGI代理,新的表达式解析器,一个小的对象缓存API。
2、MapServer
MapServer是一个开源的基于胖服务器端/瘦客户端模式的实时地图发布系统,客户端发送数据请求时,服务器端实时的处理空间数据,并将生成的数据发送给客户端。MapServer 的核心部分是C语言编写的地图操作模块,它本身许多功能的实现依赖一些开源或免费的库,利用GEOS、OGR/GDAL 对多种矢量和栅格数据的支持,通过Proj.4共享库实时的进行投影变换。同时,还集合PostGIS 和开源数据库PostgreSQL 对地理空间数据进行存储和SQL 查询操作,基于ka-map、MapLab、Cartoweb 和Chameleon 等一系列客户端JavaScript API来支持对地理空间数据的传输与表达,并且遵守OGC制定的WMS、WFS、WCS、WMC、SLD、GML 和Filter Encoding 等一系列规范。
MapServer依赖于一些开源库,如Shapelib,FreeType,Proj.4,GDAL/OGR ,GD Library,Regex。由于MapServer由C写成,它依赖的子项目都有相应的C语言实现版本。
- Shapelib提供了读、写和更新“ESRI Shapefile”格式数据的能力,并能修改相应的属性文件(.dbf);
- FreeType是一个渲染字体的库,能够渲染大部分的矢量和bitmap字体格式,设计思想是小、高效、高度定制化,并且在不损失性能和功能的前提下尽可能轻量;
- Proj.4是一个地理投影库,提供多种投影的定义和使用接口;
- GDAL/OGR,GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。OGR是GDAL项目的一个分支,功能与GDAL类似,只不过它提供对矢量数据的支持。有很多著名的GIS类产品都使用了GDAL/OGR库,包括ESRI的ARCGIS 9.3,Google Earth和跨平台的GRASS GIS系统。
- GD Library,动态产生图片,支持大多数格式:JPEG, GIF, WEBP, XPM, BMP。通常用来动态生成图表、图片、缩略图等,常用于web环境中;
- Regex,为MapServer提供正则表达式支持。
3、PostgreSQL/PostGIS
PostgreSQL是著名的开源“对象-关系”数据库,支持空间数据格式;PostGIS是PostgreSQL的空间工具扩展,包含一些对PostgreSQL数据库中的空间数据进行操作的函数,包含增删修改,和基于原数据进行相应的计算的函数:包括求多边形中心等的函数。
最近的发布版本为9.4.1,9.3.6,9.2.10,9.1.15和9.0.19,PostgreSQL一次发布多个版本,都是修复相应的上一个版本的bug。9.4更改了在JSON和JSONB数据类型的unicode字符串转义的方式。
二、WMS服务发布
1. 发布服务
WMS(Web Map Service)从地理信息产生包含空间数据的地图,WMS将地图定义为适合在电脑屏幕上的数字图片,地图并不是数据本身,而是将原来的数据渲染成图片格式(PNG、GIF、JPEG)、基于矢量的元素SVG,或者WebCGM格式。
MapServer发布WMS,是通过一个map格式的文件来定义WMS的访问路径;数据源的来源,包含数据库的和本地的文件;还包含一些WMS图层的样式,包含配色,线条粗细,是否用相应的属性标识地物等等。
1.1 map配置文件
Map文件是以MAP元素包裹的,所有的元素都是以END结束相应元素的;web元素定义了图层的web访问路径;layer元素定义图层,图层的样式是用“class”元素配置的,图层中最主要的一部分是定义图层数据的来源路径,分为不同的类型。我们利用MapServer发布一幅包含世界国家的边界的多边形图层。
1、首先在map文件中定义图层大小和范围、字体路径和图层背景色
2、 然后定义相应的MapServer服务访问接口
Map文件中注释符号是“#”, “wfs_onlineresource”定义了MapServer的地址,指定了相应的根据地理信息产生的图片地址:imageurl “/ms_tmp/”。
3、 接下来定义layer的来源,这里来源于PostgreSQL/PostGIS图层,连接和读取的配置
4、 接下来定义样式元素,定义图层的配色,边界的颜色,透明度
5、 接下来我们希望给每个国家加一个标签,显示每个国家的名称
显示的标签的文字必须是动态的,否则要为这个想法写一个包含200多个国家名的静态的文件,因此我们将该标签的文字配制成PostgreSQL数据库中的图层表的一个字段,这样实现动态目的,TEXT’[name]’,表示调取图层表的’name’字段;color表示文字的颜色;font表示使用的字体;position表示放置标签位置,ul代表up-left,左上角,同理有ur、bl和br;从数据库读数据,尤其是包含中文的表,必须指明数据库的编码,否则会显示乱码。
6、 最后,闭合layer和Map标签
2. WMS访问方法
最后是用特定的方法来进行访问,OGC的WMS规范规定访问WMS服务要支持HTTP GET方法,HTTP GET是在URL明文传输数据,主要是以key=value形式,规范还定义了构造访问URL的方法:
我们根据相应的map中的定义,构造访问刚刚发布图层的URL:
http://127.0.0.1/cgi-bin/mapserv.exe?map=mapfiles/boundries.map&mode=map
端口默认80,可以省去,URL定义了以map模式运行,配置文件地址是mapfile/boundries.map,也就是刚刚发布的map配置文件,其中定义了图层的相关配置。
接受请求的程序是mapserv.exe,该程序的路径是http://127.0.0.1/cgi-bin/mapserv.exe,该程序是以httpd的扩展的形式出现的,遵循CGI规范,用C写成。除了map=‘’和mode=‘’,还可以接受更多的参数,比如说地图的尺寸。
1、将构造的URL输入浏览器
可以看到,浏览器显示一张PNG格式的图片,是MapServer的默认输出格式,大小为800*400,结合之前的map配置文件,我们看看配置文件是如何起作用的:
配置文件就是配置的输出图片大小是800*400,图片的颜色就是配置的颜色。但是我们看到,我们配置的显示标签并没有成功,为什么呢?我们看一下配置文件:
框出的两行配置文件告诉MapServer,当目标要素(即国家)的面积最少50像素大小的时候,才显示标签文字,且文字最小为10像素。
2、 改变图层尺寸以显示标签
现在我们改变一下图层尺寸:
查看效果:
当图片的尺寸超过浏览器视口大小,其默认就会缩小图片,并默认有一个放大镜选项,点击放大为原来尺寸:
可以看到显示出了原来的文字。
3. 讨论
那像百度地图和高德地图可以随意缩放和平移,是什么原理呢?原理很简单,就是不断地请求,不断地刷新,但是并不见百度和高德会刷新页面,其实这里就是用到了AJAX,AJAX应用的如此广泛,竟无处不在。
利用JavaScript就可以做到,HTML中定义一个DIV元素,然后将请求返回的图片显示到相应的DIV中,然后定义一些HTML元素作为控件,并使用JavaScript绑定一些事件,触发请求MapServer服务即可,而且请求是AJAX形式,这样就实现了地图缩放和平移。
著名的Web GIS的JavaScript库OpenLayers就是这个原理,但是OpenLayers支持更多的图层类型。
4. 延伸:地图切片
如果每次都这么请求,每次MapServer都要进行渲染过程,那么效率就太低了,于是就想到将经常请求的图层直接做成图片切片,存储在相应的目录,每次访问,直接越过MapServer直接读取现成的图片,这样就省去了渲染过程,减小了服务器的开销。
切片就是将渲染成的图片分成多个小块,根据索引号,进行拼接,构成整个地图,这样做可以只加载用户可见的区域的切片,其余的不加载,这样也加快了访问速度。
如果再想进一步加快访问速度,那将切片放在缓存中,这样又加快了读取速度,因为硬盘读取与固态硬盘读取不在一个数量级上,固态硬盘和内存仍然不在一个数量级上,所以性能会有大幅度的提升。
三、总结
WMS服务就是一个将地理信息生成图片(包含空间信息的图片—地图)的web服务,同时定义了访问的规则,各个地图服务器软件实现可能略有不同,但是大体的原理都是一样一样的!
其它地图服务器软件,如ArcGIS for Server和GeoServer,不同之处在于,ArcGIS for Server封装了这些复杂的底层操作,更像一个商业化的软件,GeoServer是另一个开源的地图服务器软件,用Java实现,也将复杂的配置,变成了图形化的管理界面。这两个软件有点相似,有一个在浏览器中运行的管理界面,可视化地配置发布WMS服务。