在Unix上编译

作者

霍华德巴特勒

联系

位于gmail.com的Hobu.inc

作者

托马斯堡

联系

gmail.com的thomas.bonfort

作者

杰夫麦克纳

联系

jmckenna在gatewaygeomatics.com

最后更新

2021-03-27

介绍

明尼苏达大学的MapServer是一个开源的免费的网络地图绘制引擎。由于其开源特性,它可以在各种平台和操作系统上编译。我们将重点讨论如何在类Unix平台上获取、编译和安装MapServer。

备注

详细的配置选项保存在 INSTALL.CMAKE 打包在源目录根目录下的文件:

小技巧

从MapServer 7.6.0版本开始,所需的最低CMake版本为3.0

您也可以检查 MapServerCompilation 有关其他信息的wiki页面。

编译器要求

从MapServer8.0开始,构建MapServer需要具有C++11和C99能力的编译器。这意味着例如使用GCC 4.8或更近的版本,或者clang3.3或更近的版本。

获取必要的软件

您可以从 下载 部分。

您还可以从 GitHub .

保护您的安装

在安装和配置期间,强烈建议查看的安全步骤 MAP= 通过设置来调用MapServer可执行文件 MS_MAP_PATTERNMS_MAP_NO_PATH 或者隐藏 MAP= 参数,如本文档中所建议的 限制 Mapfile 访问 。中列出了保护服务器安全的所有可能环境变量 环境变量

所需的外部库

  • GDAL: GDAL库允许MapServer读取各种地理空间栅格格式(GDAL)和矢量格式(OGR)。它可以在https://gdal.org/上下载。(一些平台将此库称为 libgdal-dev

  • PROJ: PROJ为MapServer提供投影支持。需要4.4.6或更高版本。

  • libpng :默认情况下,libpng应在您的系统上。回到1.2.7版本应该可以工作。

  • FreeType: 需要2.x或更高版本。

  • libjpeg :libjpeg允许mapserver以jpeg格式呈现图像。默认情况下,系统上应该安装足够的版本(可能是1998年以后的6B版本)。

    警告

    在MapServer 5.8+中,不推荐使用直接的jpeg支持,现在您应该依靠gdal在MapServer中提供栅格读取支持。但是,在生成(即写入)图像时,仍需要jpeg支持。

  • zlib: 默认情况下,Zlib应该在您的系统上。虽然不是由MapServer直接使用,但它是libpng的强制依赖项。

可选外部库

  • GEOS:

    4.10 新版功能.

    GEOS允许MapServer执行空间谓词和代数运算(内、触等&并、差、交)。

  • libxml:

    4.10 新版功能.

    需要libxml才能使用 OGC SOS MapServer中的支持

  • Oracle Spatial OCI :您平台的客户端库可从Oracle网站下载。理想情况下,您的客户机库与您查询的数据库相匹配,但这不是一个困难的需求。

  • libpq :libpq需要支持在PostgreSQL数据库中使用PostGIS几何图形。理想情况下,您的客户机库与您正在查询的数据库相匹配。

  • giflib LIGBIF/ libgif 用于读取用作像素地图符号的GIF文件。

  • FastCGI :fastcgi是用于将mapserver与各种Web服务器连接的常用协议。您需要安装开发包。下面是有关如何在MapServer中使用此功能的详细信息 FASTCGI . 在Ubuntu上,应该是:

    $ apt-get -y install libfcgi-dev
    
  • Cairo (SVG, PDF) support :此库需要生成PDF和SVG输出。如果你在一个Ubuntu系统上,它可以安装“apt-get-install-y libcairo2 dev”

  • KML support :此呈现程序没有外部依赖项。

  • HarfBuzz:

    7.0 新版功能.

    支持复杂的文字整形(简化:在字符之间插入连字的工具)。Harfbuzz算法将应用于已被确定为不是拉丁文的文本字符串(即,harfbuzz引起的减慢仅限于那些实际需要整形的语言)。要求 FriBidi

  • mysql:支持加入mysql(with_mysql选项)。

可选功能

  • Cairo SVG parser support :WITH_SVGCAIRO选项是改进SVG支持的建议的一部分。使用此功能需要安装libsvg-cairo库,可从以下位置获得:https://www.cairographics.org/snapshots/。您将需要编译和安装cairo、libsvg和libsvg-cairo。

  • SVG支持可以通过未维护的libsvg/libsvg cairo组合来启用,也可以通过librsvg(with_rsvg选项)来启用,但需要付出更多的依赖性。如果您的发行版为librsvg提供了一个包,请使用librsvg;如果编译librsvg依赖项的成本太重要,请返回libsvgcairo。

防颗粒几何支撑

由于版本5.0 MapServer支持agg渲染后端。MapServer5.6+将它直接嵌入到源树中,您不必做任何特殊的事情来支持它。

OGC支持

MapServer为许多 OGC specifications. For an overview, see MapServer OGC规范支持.

WMS支持

WMS服务器

支持 WMS server

您可以通过在配置输出中查找以下内容来检查它:

--   * WMS SERVER: ENABLED

如果出于某种原因您不需要WMS支持,可以使用“-dwith_wms=off”将其强制关闭。

有关使用此功能的详细信息,请参阅 WMS服务器 .

WMS客户端

还支持级联。这允许MapServer通过WMS透明地获取远程层,基本上充当客户端,并将它们与其他层组合以生成最终地图。

要启用此功能,您需要将with_client_wms选项传递到配置脚本。MapServer将自动查找libcurl,这也是必需的。

要验证此功能是否已启用,请检查以下项的配置输出:

--   * WMS CLIENT: ENABLED

备注

此功能在默认情况下是禁用的,您必须特别请求它。

有关使用此功能的详细信息,请参阅 WMS客户端 .

WFS支持

WFS服务器

支持 WFS server 默认情况下启用。需要GDAL(实际上是OGR)和PROJ支持。

要验证此功能是否已启用,请检查以下项的配置输出:

--   * WFS SERVER: ENABLED

如果出于某种原因您不需要WFS支持,可以使用“-dwith_w wfs=off”将其强制关闭。

有关使用此功能的详细信息,请参阅 WFS服务器 .

WFS客户端

MapServer还可以充当WFS客户机。这实际上意味着MapServer从远程服务器的WFS输出中读取数据并将其呈现到映射中,就像从shapefile中读取数据时一样。

为了启用此功能,您需要确保使用Xerces支持和PROJ支持构建了GDAL(实际上是OGR),并将with_CLIENT_WFS选项传递给配置脚本。MapServer将自动查找libcurl,这也是必需的。

要验证此功能是否已启用,请检查以下项的配置输出:

--   * WFS CLIENT: ENABLED

备注

此功能在默认情况下是禁用的,您必须特别请求它。

有关使用此功能的详细信息,请参阅 WFS客户端 .

WCS服务器

支持 WCS server WCS服务器 .

要验证此功能是否已启用,请检查以下项的配置输出:

--   * WCS SERVER: ENABLED

如果出于某种原因您不需要WCS支持,您可以使用“-dwith_wcs=off”将其强制关闭。

SOS服务器

通过使用with_sos选项启用对SoS的支持。有关此服务的详细信息,请访问 SOS服务器 .

要验证此功能是否已启用,请检查以下项的配置输出:

--   * SOS SERVER: ENABLED

备注

此功能在默认情况下是禁用的,您必须特别请求它。

空间仓储

MapServer可以使用各种数据输入源。越来越受欢迎的解决方案之一是使用支持空间的数据库来存储数据,并直接使用它们来为Web绘制地图。

在这里,您将了解如何使MapServer能够与这些产品之一对话。有关如何使用这些工具的更多详细信息,请参阅MapFile参考。本节仅详细介绍如何编译MapServer以供其使用。

邮政地理信息系统

PostGIS 将对地理对象的支持添加到 PostgreSQL 对象关系数据库。实际上,postgis“在空间上启用”了postgresql服务器,允许它用作地理信息系统(gis)的后端空间数据库,就像esri的sde或Oracle的空间扩展。Postgis包含在许多发行版的包装系统中,但如果需要,您也可以自己滚动。

MapServer可以使用PostGIS作为数据源。Postgis支持在默认情况下启用。

要验证此功能是否已启用,请检查以下项的配置输出:

--   * POSTGIS: /usr/local/pgsql/lib/libpq.so

如果出于某种原因不需要PostGIS支持,可以使用“-DWITH_POSTGIS=OFF”强制关闭它。为了帮助CMake找到您的PostGIS安装,您可以使用CMAKE_PREFIX_PATH选项(例如“-DCMAKE_PREFIX_PATH=/usr/local/pgsql”)。

空间数据库

MapServer也支持Oracle的Spatial。为了连接到它,您需要使用WITHORACLESPATIC选项根据Oracle库编译MapServer。您很可能需要设置一个Oracle_HOME环境变量,以使其正确配置。

要验证此功能是否已启用,请检查以下项的配置输出:

--   * Oracle Spatial: <path to oracle spatial shared library>

编译

在尝试编译MapServer之前,首先要确保安装了所有必需的和/或推荐的库,从而做好准备。这会使你的生活不那么复杂;)。这是我通常使用的顺序:

  1. 编译GDAL。描述如何编译GDAL超出了本文的范围。如果您有很多不同格式的需求,请确保首先安装这些库。我经常发现,构建GDAL库通常需要编译MapServer本身的时间!

  2. 编译项目。项目(以前 PROJ.4 )是一个直接的configure/make/make安装库。

  3. 编译libcurl。libcurl是一个直接配置/生成/生成安装库。此库仅与其他功能一起使用,因此“-with curl config”不会执行任何操作,除非同时选择“-with wmsclient”或“-with wfsclient”。

    备注

    如果要将MapServer配置为在访问WMS/WFS服务器时使用SSL,则必须使用“--with ssl”选项配置/编译libcurl。有关如何设置此设置的详细信息,请参阅 通过HTTPS访问OGC服务 .

  4. 编译/安装可选库。这些可能包括Postgis、Oracle Spatial、Agg、Ming、Pdflib或Mygis。根据需要进行混合和匹配。

  5. 将MapServer tarball和CD解压到MapServer目录::

    $ tar -zxvf mapserver-X.Y.Z.tar.gz
    
  6. 创建构建目录并配置环境。

    创建生成目录:

    $ cd mapserver-X.Y.Z
    $ mkdir build
    $ cd build
    

    使用“cmake”(这是一个示例)配置环境:

    $ cmake -DCMAKE_INSTALL_PREFIX=/opt \
            -DCMAKE_PREFIX_PATH=/usr/local/pgsql/91:/usr/local:/opt \
            -DWITH_CLIENT_WFS=ON \
            -DWITH_CLIENT_WMS=ON \
            -DWITH_CURL=ON \
            -DWITH_SOS=ON \
            -DWITH_PHP=ON \
            -DWITH_PERL=ON \
            -DWITH_RUBY=ON \
            -DWITH_JAVA=ON \
            -DWITH_CSHARP=ON \
            -DWITH_PYTHON=ON \
            -DWITH_SVGCAIRO=ON \
            -DWITH_ORACLESPATIAL=ON \
            -DWITH_MSSQL2008=ON \
            ../ >../configure.out.txt
    

    备注

    从MapServer 7.4.0开始,您可以通过 --WITH_PHPNG=ON 通过 SWIG API .

    默认情况下启用以下选项(7.0版:带_-proj,带_-wms,带_-fribidi,带_-harfbuzz,带_-iconv,带_-cairo,带_-fcgi,带_-geos,带_-postgis,带_-gdal,带_-ogr,带_-wfs,带_-wcs,带_-libxml2,带_-gif。

    如果还想构建库的静态版本,可以使用build_static和link_static_libmapserver选项,

    还有许多其他选项可供选择。有关可用CMake选项的最新列表,请参阅CMakeLists.txt。

    最好将配置命令放在一个文件中,并将其模式更改为可执行(+X),以保存键入内容并记录MapServer的配置方式。

  7. 既然您已经配置了构建选项并选择了希望MapServer使用的所有库,您就可以编译源代码了。

    这实际上很简单,只需执行“make”::

    $ make
    
  8. 安装MapServer库::

    # make install
    

    为了确保一切顺利,请查找名为 MAPSERV公司: :

    $ ls -al mapserv
    -rwxr-xr-x  1 user user 13745 mars  11 17:45 mapserv
    

    一个简单的测试是尝试并运行它:

    $ ./mapserv
    This script can only be used to decode form results and
    should be initiated as a CGI process via a httpd server.
    

    上面的信息是完全正常的,并且准确地表达了它所说的意思。如果你还有别的事,事情就大错特错了。

安装

MapServer二进制

mapserver程序本身只包含一个文件,即“mapserv”二进制可执行文件。这是一个CGI可执行文件,打算由Web服务器调用和运行。

在本节中,我们假设您在/usr/local/apache2中的默认目录结构下运行apache。您可能需要有权限编辑httpd.conf(主要的Apache配置文件),或者让某人(如您的网站管理员)帮助您了解配置详细信息。

如果您没有安装Apache,并且您想要Apache、PHP、FastCGI等,那么可能看起来像这样:

$ apt-get install -y apache2 apache2-mpm-worker libapache2-mod-fastcgi
$ a2enmod actions fastcgi alias
$ apt-get install libapache2-mod-php5 php5-common php5-cli php5-fpm php5

主要目标是将“mapserv”二进制文件安装到一个可公开访问的目录中,该目录被配置为运行CGI程序和脚本。

  1. 找到你的CGI bin目录。在默认配置下,cgi目录是“/usr/local/apache2/cgi-bin”(redhat:“/home/httpd/cgi-bin”,debian:“/usr/lib/cgi-bin”)。如果您使用的是Apache,那么在http.conf或默认站点中应该有一个scriptaalias指令,比如:

    $ cat /etc/apache2/sites-available/default | grep 'cgi-bin'
    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    
  2. 找到新编译的mapserv可执行文件的安装路径。当您运行“make install”时会显示如下内容:

    -- Installing: /usr/local/bin/mapserv
    -- Set runtime path of "/usr/local/bin/mapserv" to
          "/usr/local/lib:/usr/local/pgsql/91/lib"
    
  3. 您将要从CGI bin目录设置指向该可执行文件的符号链接:

    # ln -s /usr/local/bin/mapserv /usr/lib/cgi-bin/mapserv
    

    警告

    确保链接到已安装的mapserv文件(运行“make install”之后),而不是源树中编译该文件的位置。

测试新安装

将mapserv文件放在此目录中,可以通过以下URL访问它:“http://yourhostname.com/cgi-bin/mapserv”。当通过Web客户机访问此URL时,如果一切正常,您应该期望得到以下输出:“没有要解码的查询信息。查询字符串已设置,但为空。“如果收到此消息,则说明已完成安装MapServer。

常见问题

文件权限

尝试安装二进制文件时最常见的问题是权限问题:

  • 您没有写入Web服务器的CGI目录的权限。请您的网站管理员为您安装该文件。

  • Web服务器向您提供“403权限被拒绝”错误。确保Web服务器以“无人”身份运行的用户对二进制可执行文件具有执行权限。使文件世界可执行是完全正确和安全的:::

    $ chmod o+x mapserv
    

阿帕奇错误

如果Web服务器配置不正确,也可能会收到一些不同类型的错误:

  • 500内部服务器错误:这是一条非常普通的错误消息。它基本上告诉您的是Web服务器在运行程序时失败。您必须查阅Web服务器的错误日志以了解更多信息,并且可能需要获得您的网站管理员/系统管理员的帮助。Apache文档也有指针 setting up cgi-bin .

    ::

    检查服务器日志$tail/var/log/apache2/error.log

一旦你把它编好了,你该去哪里?

这个 MapServer简介 文档提供了良好的MapServer入门介绍。