美文网首页GIS
Mapserver的Windows版本编译

Mapserver的Windows版本编译

作者: 开源GIS地图与信创 | 来源:发表于2021-10-14 10:08 被阅读0次

    Mapserver的Windows版本编译

    重要说明

    gisinternals官网上提供的包也不能保证编译出来完全正确能用。

    经实验release-1911-gdal-2-4-4-mapserver-7-4-3的x86版本在vs2017下编译出来的东西能正常使用

    准备工作

    下载并安装windows版的cmake工具,下载地址:https://cmake.org/,安装的时候记得勾选将路径添加到环境变量选项。
    安装Visual Studios 2017,根据版本情况选择vs的版本,安装后会有几个命令行工具,使用“VS 2017的开发人员命令提示符”
    vs工具可以微软官网下载,community社区版可免费使用,下载地址(要先登录微软官网):https://my.visualstudio.com/Downloads?q=Visual%20Studio%202017

    需要下载的内容

    gdal源代码:gdal244.zip

    mapserver源代码:MapServer-rel-7-4-3.zip

    开发包:release-1911-dev.zip

    gdal和mapserver编译好的dll文件:release-1911-gdal-2-4-4-mapserver-7-4-3.zip

    gdal和mapserver的依赖包:release-1911-gdal-2-4-4-mapserver-7-4-3-libs.zip

    注意事项

    release-1911-dev.zip中有一个lib文件夹,release-1911-gdal-2-4-4-mapserver-7-4-3-libs.zip中也有一个,实际证明两个文件夹是可以合并的,合并为小写的lib文件夹,合并时部分文件可能冲突,直接覆盖就行。

    release-1911-dev.zip和release-1911-gdal-2-4-4-mapserver-7-4-3.zip的ECW5License.rtf、FileGDBLicense.rtf等文件会冲突,但是这些文件对于编译没有影响,所以直接覆盖合并就行。

    比较新的版本中,regex-0.12这个包在解压出来的support文件夹里,老版本中在release-1911-dev.zip一级目录里。

    cmake弄配置的时候要注意路径不要用反斜杠,以免被转义了不能正确识别。

    指南里面的

    4. Configure:
      cmake .. -G "NMake Makefiles" -DBUILD_SHARED_LIBS=1 -DCMAKE_BUILD_TYPE=Release -Wno-dev
      cmake .. -DCMAKE_PREFIX_PATH=C:\dev\work\release-1700-gdal-2-1-2-mapserver-7-0-2;C:\dev\work\release-1700-gdal-2-1-2-mapserver-7-0-2\bin;C:\dev\work\release-1700-gdal-2-1-2-mapserver-7-0-2\lib;C:\dev\work\release-1700-gdal-2-1-2-mapserver-7-0-2\include
      cmake .. -DREGEX_DIR=C:\dev\work\release-1700-gdal-2-1-2-mapserver-7-0-2\regex-0.12
      cmake .. -DWITH_POSTGIS=0 -DWITH_SOS=1 -DWITH_KML=1
      cmake .. -DWITH_CLIENT_WMS=1 -DWITH_CLIENT_WFS=1
      cmake .. -DWITH_THREAD_SAFETY=1 -DWITH_FCGI=1
      cmake .. -DWITH_CAIRO=1 -DCAIRO_LIBRARY=C:\dev\work\release-1700-gdal-2-1-2-mapserver-7-0-2\lib\cairo.lib
      cmake .. -DWITH_SVGCAIRO=1 -DSVGCAIRO_LIBRARY=C:\dev\work\release-1700-gdal-2-1-2-mapserver-7-0-2\lib\libsvg-cairo.lib
      cmake .. -DSVG_LIBRARY=1 -DSVG_LIBRARY=C:\dev\work\release-1700-gdal-2-1-2-mapserver-7-0-2\lib\libsvg.lib
    
    

    实际使用时要去掉后面的cmake .. ,把命令拼成一条。并且需要添加-DWITH_PROTOBUFC=0,以保证在找不到protobuf的包里能正确编译。
    或者把PROTOBUFC这个包找到,并指定路径,它实际在include目录下有。

    64位的编译好像有问题,不太清楚是官方给的代码包有问题还是编译64位的时候需要在命令行加什么参数,可能是需要采用另一个vs2017命令行工具编译。

    release-1928-gdal-3-3-1-mapserver-7-6-4这个版本编译出来会一直提示无法解析map文件,所以推断此版本可能有问题。

    包重复引入

    在某些版本里面会报包重复引入的错误

    把官方教程里面的-DWITH_SVGCAIRO=0,-DSVG_LIBRARY=0两个都设置为0即可。

    mapserver调试模式启动

    -DMS_ENABLE_CGI_CL_DEBUG_ARGS=1启动调试模式,不论编译了的exe文件哪里有问题都能直接提示错误原因,方便排查。

    官方mapfile.xsl文件错误

    虽然mapserver经常在更新,但是对xml模式的支持做得还不够好,官方代码包里的xmlmapfile/mapfile.xsl文件中少了个结束符,导致使用xml模式文件时报错,实际使用时应该加上。

    mapfile.xsl默认读取地址

    在命令行中使用xml模式地图配置文件时,mapfile.xsl有一个默认读取地址,它是从windows环境变量获取的,经测local.xml配置文件里面schemaLocation属性实际并不起作用。

    根据mapserver官方要求,需要自己手动配置添加一个windows的环境变量MS_XMLMAPFILE_XSLT为D:\software\nginx-1.13.4\html\GISToolServer\xmlmapfile\mapfile.xsl

    mvt类型支持

    报错

    Could NOT find ProtobufC (missing: PROTOBUFC_COMPILER PROTOBUFC_INCLUDE_DIR)
    CMake Error at CMakeLists.txt:73 (message):
      PROTOBUFC library/component/dependency could not be found.
    
        HINTS:
        - disable PROTOBUFC support by adding -DWITH_PROTOBUFC=0
        - add the PROTOBUFC install directory to the CMAKE_PREFIX_PATH variable (-DCMAKE_PREFIX_PATH="/path/to/PROTOBUFC-install-dir;/path/to/other/dirs"
    Call Stack (most recent call first):
      CMakeLists.txt:293 (report_optional_not_found)
    

    如果要支持mvt类型则需要开启PROTOBUFC,设置-DWITH_PROTOBUFC=1

    -DPROTOBUFC_INCLUDE_DIR是指protobuf-c的目录,通常在include目录下

    -DPROTOBUFC_COMPILER是指protobufc的编译器地址,通常在bin目录下,叫:protoc.exe

    最终编译脚本如下:

    cmake .. -G "NMake Makefiles" -DMS_ENABLE_CGI_CL_DEBUG_ARGS=1 -DBUILD_SHARED_LIBS=1 -DCMAKE_BUILD_TYPE=Release -Wno-dev -DCMAKE_PREFIX_PATH=D:/mapserver-build/libxslt-1.1.26.win32;D:/mapserver-build/release-1911-gdal-2-4-4-mapserver-7-4-3;D:/mapserver-build/release-1911-gdal-2-4-4-mapserver-7-4-3/bin;D:/mapserver-build/release-1911-gdal-2-4-4-mapserver-7-4-3/lib;D:/mapserver-build/release-1911-gdal-2-4-4-mapserver-7-4-3/include -DREGEX_DIR=D:/mapserver-build/release-1911-gdal-2-4-4-mapserver-7-4-3/regex-0.12 -DWITH_POSTGIS=0 -DWITH_SOS=1 -DWITH_KML=1 -DWITH_PROTOBUFC=1 -DPROTOBUFC_COMPILER=D:/mapserver-build/release-1911-gdal-2-4-4-mapserver-7-4-3/bin/protoc.exe -DPROTOBUFC_INCLUDE_DIR=D:/mapserver-build/release-1911-gdal-2-4-4-mapserver-7-4-3/include/protobuf-c -DWITH_XMLMAPFILE=1 -DWITH_CLIENT_WMS=1 -DWITH_CLIENT_WFS=1 -DWITH_THREAD_SAFETY=1 -DWITH_FCGI=1 -DWITH_CAIRO=1 -DCAIRO_LIBRARY=D:/mapserver-build/release-1911-gdal-2-4-4-mapserver-7-4-3/lib/cairo.lib -DWITH_SVGCAIRO=0 -DSVGCAIRO_LIBRARY=D:/mapserver-build/release-1911-gdal-2-4-4-mapserver-7-4-3/lib/libsvg-cairo.lib -DSVG_LIBRARY=1 -DSVG_LIBRARY=D:/mapserver-build/release-1911-gdal-2-4-4-mapserver-7-4-3/lib/libsvg.lib
    

    编译成功了之后要把release-1928-gdal-3-3-1-mapserver-7-6-4.zip里的bin目录里的内容拷到build目录内,生成的mapserv.exe文件才不会缺少依赖。

    要启用xmlmapfile首先要在配置文件启用相应功能:-DWITH_XMLMAPFILE=1
    文档中提到要先安装libxslt或libexslt
    libxslt下载地址(libexslt只是libxslt的一个扩展):https://www.zlatkovic.com/projects/libxml/
    libxslt在-DCMAKE_PREFIX_PATH中的路径配置不需要到bin目录,直接到根目录就行(libxslt不需要安装,解压就可以使用)。
    编译完了之后同样需要把libexslt.dll和libxslt.dll两个文件拷备到mapserv.exe同级目录下,解决依赖问题。

    最终测试命令:

    mapserv.exe  -nh QUERY_STRING="map=../local-demo/local.xml&layers=ocean&mode=map&map_imagetype=png&mapext=-180.3006+-120.2004+180.3006+120.2004&imgext=-180.3006+-120.2004+180.3006+120.2004&map_size=600+400&imgx=300&imgy=200&imgxy=600+400" > atest.png
    

    local.xml文件内容:

    
    <?xml version="1.0" encoding="UTF-8"?>
    <Map name="xmlmapfile" xmlns="http://www.mapserver.org/mapserver" status="ON" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="./xmlmapfile/mapfile.xsd" version="5.6.0">
        <size x="600" y="400"></size>
      <extent>-180.0 -90.0 180.0 90.0</extent>
      <units>DD</units>
      <shapePath>./data</shapePath>
      <imageColor red="255" green="255" blue="255"></imageColor>
      <OutputFormat name="PNG">
        <driver>AGG/PNG</driver>
        <extension>png</extension>
        <formatOption>GAMMA=0.75</formatOption>
        <imageMode>RGBA</imageMode>
        <mimeType>image/png</mimeType>
        <transparent>ON</transparent>
      </OutputFormat>
      <Layer name="ocean" type="POLYGON" status="ON">
        <connectionType>OGR</connectionType>
        <connection>demo.db</connection>
        <data>ocean</data>
        <Class name="class1Layer1" status="ON">
          <Style>
            <color red="134" green="204" blue="249"></color>
          </Style>
        </Class>
      </Layer>
    </Map>
    
    

    参考文档:

    https://github.com/MapServer/MapServer/blob/main/README.WIN32

    相关文章

      网友评论

        本文标题:Mapserver的Windows版本编译

        本文链接:https://www.haomeiwen.com/subject/ncbyoltx.html