MapServer 之 发布网络地图服务(WMS-Web Map Service)

一、环境搭建

  • 操作系统: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服务。

时间: 2024-10-27 13:51:44

MapServer 之 发布网络地图服务(WMS-Web Map Service)的相关文章

在ArcGIS中发布GoogleEarth瓦片为网络地图服务(wms)

说明 本案例实现内容:GoogleEarth瓦片地图的获取.在ArcGIS Server Manger中发布下载好的影像瓦片数据. 本实例使用软件版本:ArcGIS10.2,水经注万能地图下载器. 影像瓦片来源"水经注万能地图下载器".如果没有安装本软件,可以百度"水经注软件"到官方网站下载. 一.下载瓦片数据 启动水经注万能地图下载器,选择"卫星.谷歌地球"在线地图,点击"框选下载区域",双击下载区域,选择级数,如下图. 由

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

今天我们讲一下使用 mapserver 发布 OGC 的三大网络地图服务的最后一个 - WCS,wcs 主要是规定了通过网络提供访问 coverage 数据的标准,那么什么是 coverage 数据呢? 狭义的说,可以认为 mapserver wcs 中发布的 coverage 数据就是卫星影像 或者 dem. 广义上说,coverage 数据主要是指时空现象的数字表示,可以是多维的,例如一维的传感器时间序列信号,二维的卫星影像,三维的 x/y/t 格式的"图像时间序列",或者 x/y

OpenLayers调用arcgis server发布的地图服务

有两种方式可以调用arcgis server发布的地图服务,一种是rest,一种是wms. 地图的投影为900913,arcgis server为10.0版本,地图服务的空间参考为3857. 与Google Map相对应的ArcGis投影文件: 众所周知,Google Map的投影参考为"WGS 84 Web墨卡托",定义为 EPSG:900913 或者 EPSG:3857 (EPSG:3785).与此相对应的ArcGis的投影坐标系名称为:WGS 1984 Web Mercator.

在Arccatalog中加载并查看已经发布的地图服务

发布地图服务,更新规划数据之后,需要查看相应的规划数据服务是否出现空白,没有被全覆盖,服务速度等等浏览查看数据更新之后的地图服务. 一般需要直接访问ArcGIS当中的ArcGIS server 10.x下面的Services Directory直接访问已经发布的地图服务,但这只是地图服务地址,我们需要查看浏览地图,所以,需要打开Arccatalog,点击GIS servers,add ArcGIS server,选择第三项,administer server,点击下一步,在server URL中

使用SDE连接Postgre或者SqlServer数据库发布要素地图服务方法

使用SDE连接Postgre数据库或者SqlServer发布要素服务两种方式:1.直接创建一个Geographic DataBase,gdb里面建好图层和属性表,然后在ArcCatalog的数据库连接工具中打开创建好的Postgre或者sqlserver数据库,把gdb里面的表添加进去.2.先在数据库管理工具中创建好数据库和表结构,然后在ArcCatalog中用数据库连接工具打开,在里面再将需要创建图层的表字段导入到空的图形表里面.3.通过步骤1,2创建好数据库后,在ArcGIS中配置地图,发布

Engine加载ArcGIS Online和ArcGIS Server发布的地图服务

两种方式:1. 可以通过遍历的方式,根据地图服务的名称进行判断,然后加载. IAGSServerObjectName pSOName = null; IAGSServerObjectName psoname = null; IAGSServerConnection con = new AGSServerConnection(); IAGSServerConnectionFactory2 confactory = new AGSServerConnectionFactory() as IAGSSe

基于GeoServer切片地图服务的发布

接着上一篇文章,如何将JPG格式的图片转化为带地理坐标的TIFF格式里提及的最近的一个项目,数据源是一张高分辨率的2.5维图片,现在已经成功转化成了带有地理坐标的TIFF格式.下面将介绍借助GeoServer如何将这个TIFF格式的数据以TMS(Tiled Map Service)的形式发布出去.此前笔者利用商业软件ArcGIS Server发布地图服务已经算是比较熟悉了.此次利用开源软件发布还处于摸索与学习阶段. 1.GeoServer介绍 GeoServer是OpenGIS Web 服务器规

GeoServer发布地图服务

最近要利用GIS服务器软件发布一些地图服务,商业的软件(比如ArcGIS Server肯定是用不起的),最后在开源GIS软件GeoServer和MapServer中选择了GeoServer. 下面简单说说如果使用,给初始GeoServer的朋友一点点帮助!愿他们不走我走过的弯路,哈哈! 1 安装GeoServer 首先,进入GeoServer官网下载安装包点击进入下载,现在最新的版本是2.7.1,GeoServer提供了针对操作系统专门的版本,但是我喜欢使用免安装的版本,即一个打包好的war包(

ArcGIS 10.0之 地图服务的建立、发布、切片、使用

第四部分 地图服务介绍 1.地图服务器的建立 打开ArcCatalog,在左侧的GIS服务器下,打开-添加ArcGIS Server,弹出添加界面,选择管理GIS服务项,进入下一步, 填写本机IP,或者其他IP地址的机器(需要将本机的登录用户添加到那台机器的管理组内),点击完成. 添加好的服务器,如下图所示, 2.发布地图服务 地图准备好之后,在ArcCatalog软件中,新建文件夹连接到该地图文件,并浏览到该地图,点击右键,选择-发布到ArcGIS Server,进入界面,如下图 选择ArcG