开始一项工作的时候建立初始的运行环境是令人烦燥的,尤其是当依照步骤一步一步操作,但是基本的“Hello World”还是迟迟不出现,甚至会令人抓狂。搭建运行环境需要综合技术,一些经验,也需要一点运气。不要小看配置运行环境的能力,很多的程序员是无法自行搭建开发环境的,更遑论真正的生产环境。
MapServer是使用C语言编写的开源软件,它本身又依赖一些开源的或免费的库,如Shapelib, FreeType, Proj.4, GDAL/OGR,GD Library,Regex。MapServer由C写成,它依赖的子项目都有相应的C语言实现版本。在运行 MapServer 时,必须得把相关的类库安装好,有时候还依赖于某些类库的特定版本。当编译安装 MapServer 时,需要对这些类库有一定的了解。
通过了解这些类库,你能够减少要安装的功能,而简化了安装过程。尽管你只是安装MapServer的一个基本版本,但是它仍然有能力创建一个强大强大的应用。在对MapServer熟悉后,你可以添加想要的其它功能。
MapServer 本身是生成地图的程序,但是提供了 CGI 接口(MapServer CGI 的运行依赖于 PHP),可以通过 Web 访问来调用相关的功能。所以很多时候为了运行 MapServer , 需要安装 Web 服务器(如 Apache 2),以及 让应用程序 (MapServer )与 Web 服务器(Apache)通信的工具(如 FastCGI)。Apache 2 默认情况下未开启 CGI 。
GD是一个图像程序库。由于Mapserver使用GD来进行图像的渲染,所以必须安装它。GD有它自己的依赖类库,有zlib、libpng、FreeType2.x及libJPEG。这些类型使得GD能够进行影像压缩(对于支持的数据),来渲染PNG图像,来使用TrueType字体,及渲染JPEG图像。由于关于GIF的授权许可已经过期了,所以它现在也可以使用了。
在 MapServer 7.0 中删除了 GD 支持。
FreeType是一个字体渲染引擎。 它并不是直接由Mapserver引用的,而是被GD使用来进行字体的渲染。由于TrueType比Mapserver提供的位图字体更有吸引力, 所以值得包括这个类库。
libPNG使得Mapserver能够渲染JPEG图像。 一个新的版本自2001年已经发行了。一般来讲,机器上应该已经安装了这个库。 如果没有,可以自行安装。libpng使用MapServer能够渲染PNG图像。它并不是直接由MapServer使用的,而是由GD使用的。 libpng需要库zlib。
zlib是一个数据压缩库,由GD使用。
GDAL是栅格数据的转换类库。它提供了导入及对具有地理投影的栅格影像的投影。在本书中,你不会使用那些功能, 但是这个库对于安装基本的Mapserver是必需的。它还包含OGR库。
OGR库提供了读取及写入一些矢量格式的功能。在本书中你会使用OGR提供的一些功能。
Proj.4是一个进行制图投影的程序。 它可以由Mapserver来调用,也可以单独对整个的数据库进行投影操作。
shapelib是一个C程序,来生成及处理Shape文件。你可以使用这个类库提供的有用的工具,而不必自己写任何C代码。它具有生成shape文件(包括DBF文件),销毁shape文件及DBF文件的内容,及更改shape文件的投影。 其中的的一些功能基于Proj.4。
libcurl是一个支持FTP、FTPS、HTTP、HTTPS、GOPHER、TELNET、DICT、FILE及LDAP的URL转换的客户端类库。如果你想提供WMS支持的话,会需要这个类库。WMS协议用来通过网络传输地图影像及文件数据。为了保持Mapserver环境的简单,你不必安装它。
SDE客户端库是ESRI的空间数据仓库的一部分。如果你希望Mapserver能够访问它,你需要编译这个库。
PostgreSQL客户端库提供了使用Mapserver能够访问PostGIS数据的功能。它们提供了与ESRI产品类似的功能,但它们不是开源的。
Oracle Spatial客户端库使得用户能够使用MapServer访问Oralce空间数据仓库。它们提供了与ESRI产品类似的功能。
Ming使得MapServer能够创建SWF视频。它能够提供一些有趣的功能。
PDFLib使用MapServer能够以PDF格式输出,也很有用。
Debian / Ubuntu 是我最常用的 Linux 发布版本,其良好设计的包管理工具真是让人非常愉悦。安装 MapServer 只需要运行下面的安装命令(需要有管理员权限):
在 Debian 9中:
apt install -y apache2 php7.0 libapache2-mod-fcgid cgi-mapserver \
mapserver-bin libapache2-mod-php
a2enmod authnz_fcgi
a2enmod cgi
service apache2 restart
在 Ubuntu 18.04 中:
apt install -y apache2 php7.2 libapache2-mod-fcgid cgi-mapserver \
mapserver-bin libapache2-mod-php
a2enmod authnz_fcgi
a2enmod cgi
service apache2 restart
几乎没有不同,只不过 Ubuntu 18.04中使用了较新的 php 7.2
版本。在安装这些软件包时,如果缺少相应的依赖会自动安装。
在安装完成后,可以在终端输入如下命令来查看结果:
$ mapserv -v
MapServer version 7.0.4 OUTPUT=PNG OUTPUT=JPEG OUTPUT=KML SUPPORTS=PROJ
SUPPORTS=AGG SUPPORTS=FREETYPE SUPPORTS=CAIRO SUPPORTS=SVG_SYMBOLS
SUPPORTS=RSVG SUPPORTS=ICONV SUPPORTS=FRIBIDI SUPPORTS=WMS_SERVER
SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT
SUPPORTS=WCS_SERVER SUPPORTS=SOS_SERVER SUPPORTS=FASTCGI
SUPPORTS=THREADS SUPPORTS=GEOS INPUT=JPEG INPUT=POSTGIS
INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE
关于 FastCGI 要进行一点说明。
CGI(公共网关接口)定义了 WEB 服务器与外部内容生成程序之间交互的方法,通常是指CGI程序或者CGI脚本,它是在网站上实现动态页面的最简单和常用的方法,使外部程序与Web服务器之间交互成为可能。但早期的 CGI 程序运行在独立的进程中,并对每个Web请求创建一个进程,这种方法非常容易实现,但效率很差,难以扩展。面对大量请求,进程的大量创建和消亡使操作系统性能大大下降,此外由于地址空间无法共享,也限制了资源重用。
FastCGI使用持续的(守护)进程来处理一连串的请求,这些进程由FastCGI服务器管理,而不是 Web 服务器。当进来一个请求时,Web 服务器把环境变量和这个页面请求通过一个 socket 比如 FastCGI 进程与 Web 服务器(都位于本地) 或者一个TCP connection(FastCGI进程在远端的server farm)传递给FastCGI进程。
在 Windows 下面安装 MapServer ,也是需要安装 Apache2 , CGI,以及 MapServer 程序,这些也都有 Windows 下面的二进制软件包,但是这样一步一步安装是比较麻烦的,很容易出现问题。这里推荐使用 MS4W
(MapServer 4 Windows ),
链接为: https://www.ms4w.com/ 。