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语言实现版本。
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(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服务访问接口
3、 接下来定义layer的来源,这里来源于PostgreSQL/PostGIS图层,连接和读取的配置
4、 接下来定义样式元素,定义图层的配色,边界的颜色,透明度
5、 接下来我们希望给每个国家加一个标签,显示每个国家的名称
6、 最后,闭合layer和Map标签
最后是用特定的方法来进行访问,OGC的WMS规范规定访问WMS服务要支持HTTP GET方法,HTTP GET是在URL明文传输数据,主要是以key=value形式,规范还定义了构造访问URL的方法:
接受请求的程序是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,图片的颜色就是配置的颜色。但是我们看到,我们配置的显示标签并没有成功,为什么呢?我们看一下配置文件:
2、 改变图层尺寸以显示标签
现在我们改变一下图层尺寸:
查看效果:
那像百度地图和高德地图可以随意缩放和平移,是什么原理呢?原理很简单,就是不断地请求,不断地刷新,但是并不见百度和高德会刷新页面,其实这里就是用到了AJAX,AJAX应用的如此广泛,竟无处不在。
利用JavaScript就可以做到,HTML中定义一个DIV元素,然后将请求返回的图片显示到相应的DIV中,然后定义一些HTML元素作为控件,并使用JavaScript绑定一些事件,触发请求MapServer服务即可,而且请求是AJAX形式,这样就实现了地图缩放和平移。
著名的Web GIS的JavaScript库OpenLayers就是这个原理,但是OpenLayers支持更多的图层类型。
如果每次都这么请求,每次MapServer都要进行渲染过程,那么效率就太低了,于是就想到将经常请求的图层直接做成图片切片,存储在相应的目录,每次访问,直接越过MapServer直接读取现成的图片,这样就省去了渲染过程,减小了服务器的开销。
WMS服务就是一个将地理信息生成图片(包含空间信息的图片—地图)的web服务,同时定义了访问的规则,各个地图服务器软件实现可能略有不同,但是大体的原理都是一样一样的!
其它地图服务器软件,如ArcGIS for Server和GeoServer,不同之处在于,ArcGIS for Server封装了这些复杂的底层操作,更像一个商业化的软件,GeoServer是另一个开源的地图服务器软件,用Java实现,也将复杂的配置,变成了图形化的管理界面。这两个软件有点相似,有一个在浏览器中运行的管理界面,可视化地配置发布WMS服务。