Mapserver的Windows版本編譯

Mapserver的Windows版本編譯

重要說明

gisinternals官網(wǎng)上提供的包也不能保證編譯出來完全正確能用。

經(jīng)實驗release-1911-gdal-2-4-4-mapserver-7-4-3的x86版本在vs2017下編譯出來的東西能正常使用

準備工作

下載并安裝windows版的cmake工具,下載地址:https://cmake.org/,安裝的時候記得勾選將路徑添加到環(huán)境變量選項。
安裝Visual Studios 2017,根據(jù)版本情況選擇vs的版本,安裝后會有幾個命令行工具,使用“VS 2017的開發(fā)人員命令提示符”
vs工具可以微軟官網(wǎng)下載,community社區(qū)版可免費使用,下載地址(要先登錄微軟官網(wǎng)):https://my.visualstudio.com/Downloads?q=Visual%20Studio%202017

需要下載的內容

gdal源代碼:gdal244.zip

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

開發(fā)包: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位的時候需要在命令行加什么參數(shù),可能是需要采用另一個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經(jīng)常在更新,但是對xml模式的支持做得還不夠好,官方代碼包里的xmlmapfile/mapfile.xsl文件中少了個結束符,導致使用xml模式文件時報錯,實際使用時應該加上。

mapfile.xsl默認讀取地址

在命令行中使用xml模式地圖配置文件時,mapfile.xsl有一個默認讀取地址,它是從windows環(huán)境變量獲取的,經(jīng)測local.xml配置文件里面schemaLocation屬性實際并不起作用。

根據(jù)mapserver官方要求,需要自己手動配置添加一個windows的環(huán)境變量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

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容