一、环境搭建

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

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

  1. wms地图绘制工具_【转】WMS(Web Map Service网络地图服务)

    1.GeoServer(地理信息系统服务器)是 OpenGIS Web 服务器规范的 J2EE 实现(geoserver只能用j2ee开发),利用GeoServer 可以方便的发布地图数据.GeoSe ...

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

    说明 本案例实现内容:GoogleEarth瓦片地图的获取.在ArcGIS Server Manger中发布下载好的影像瓦片数据. 本实例使用软件版本:ArcGIS10.2, 水经注万能地图下载器 . ...

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

    今天我们讲一下使用 mapserver 发布 OGC 的三大网络地图服务的最后一个 - WCS,wcs 主要是规定了通过网络提供访问 coverage 数据的标准,那么什么是 coverage 数据呢 ...

  4. 开源地图服务器 网站,开源WebGIS:地图发布与地图服务

    开源WebGIS:地图发布与地图服务 语音 编辑 锁定 讨论 上传视频 上传视频 本词条缺少信息栏.概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! <开源WebGIS:地图发布与 ...

  5. 多种方式发布WebGIS地图服务以及显示

    目录 一.WebGIS基础 1. 什么是WebGIS?(WebGIS的介绍.技术.架构.功能/应用.产品) 2. OGC规范 3. 主流WebGIS架构 4. 主流GIS服务器 4.1 ArcGIS ...

  6. 地图服务 WMS WFS WCS TMS

    常见地图服务(WMS.WFS.WCS.TMS.WMTS 1.网络地图服务(WMS) 网络地图服务(WMS)利用具有地理空间位置信息的数据制作地图.其中将地图定义为地理数据可视的表现.能够根据用户的请求 ...

  7. arcgis中如何导出奥维可识别的图_如何在奥维中加载ArcGIS发布的地图服务

    在工作中,您可能有大量的航拍图需要在奥维中加载显示,但直接导入航拍图的数据处理量较大.对电脑硬件的要求较高.因此,您可以通过ArcGIS将航拍图发布成地图服务,在奥维中以在线自定义地图的形式加载. 1 ...

  8. 傻瓜教程:使用GeoServer发布离线地图服务

    一.离线地图下载 离线地图分为两种:一种叫"金字塔瓦片"数据,一种叫"矢量地图数据".我们看的在线地图比如,百度,谷歌,高德等等网页上的地图,都是金字塔瓦片:另 ...

  9. 使用超图桌面版制作点图层并发布为地图服务

    现在要用超图桌面版本制作点图层:并发布为地图服务: 进入超图桌面版本:新建文件型数据源: 保存文件型数据源,后缀名如图: 在数据源下新建数据集: 新建数据集对话框:选择创建类型为点:输入数据集名称: ...

最新文章

  1. java实现微信企业付款到银行卡_微信企业付款到银行卡实现方式 - 黎明互联-官方博客 - 黎明互联 - 区块链培训,PHP培训,IT培训,职业技能培训,追求极致!改变您的职业生涯!...
  2. Tips5:通过 alt+鼠标左键 来完全展开或收缩层级
  3. 开发健壮的企业级应用的研究
  4. JDK源码分析——Java的SPI机制分析与实战
  5. 华为云客户端_效果图云渲染已成趋势,云渲染如何选择?
  6. 将时间戳转为年月日时分秒格式
  7. 1000道Python题库系列分享13(22道填空题)
  8. dell笔记本插上耳机没有声音_跑男的耳机没有声音,沙溢只用一句话诈出来,不愧是《王牌》常客...
  9. c语言字符括号怎么表示什么意思,请问C语言中的bioskey(0)是啥意思,括号里的值又有啥用?...
  10. FabFilter Pro-R 混响效果器
  11. 上位机、下位机、单片机的关系
  12. 免费的静态网页托管_如何使用自动管道免费托管静态站点
  13. 中国传媒大学计算机课程表,中国传媒大学播本课表.pdf
  14. RayVentory updated
  15. 一个假程序员的心里话---有良知
  16. 魔力宝贝服务器修改技能经验,【石器时代】 GM添加、命令使用、经验及倍数设置、宠添加、查找及修改【附图】...
  17. php遵义旅游管理系统 毕业设计-附源码091801
  18. 拆迁安置用房如何办理产权证
  19. 求推荐一款带日历的电脑桌面记事便签
  20. 【IOS】自己写的一个舒尔特方格app

热门文章

  1. 365资讯简报 每日精选12条新闻简报 每天一分钟 知晓天下事10月12日
  2. 我的大学 --- 郭天祥【4】
  3. 软工网络15个人作业3——案例分析
  4. 快速构建一个简单的对话+问答AI (上)
  5. 易语言取php网页数据,易语言爬取网页内容方法
  6. 业务开发平台与SOA的统一论
  7. 课程向:深度学习与人类语言处理 ——李宏毅,2020 (P9)
  8. 亚马逊aws 服务器删除_亚马逊aws服务器免费套餐及被扣款怎么办
  9. 解决使用mp4v2封装的mp4文件在Wowza的hls上无法播放问题
  10. 物流管理python实践报告_Python程序设计 实验报告6