MapServer Configuring with IIS
一、前言
1.MapServer簡介
MapServer是一個用C語言編寫的開源地理數據呈現引擎。除了瀏覽地理信息系統數據之外,MapServer還允許您創建“地理圖像地圖”,即可以引導用戶訪問內容的地圖。
MapServer最初是由明尼蘇達大學(UMN)Fornet項目與美國宇航局和明尼蘇達自然資源部(MNDNR)合作開發的。后來,它由Terrasip項目主辦,這是一個由美國國家航空航天局贊助的UMN和一個土地管理利益聯盟之間的項目。
MAPServer是OsGeo基金會的創始項目之一,並由越來越多的開發者(從世界各地接近20)維護。它得到了各種組織的支持,這些組織為增強和維護提供資金,並且由由開發人員和其他貢獻者組成的MapServer項目指導委員會在OSGEO內進行管理。所有源代碼都可以通過Github公開使用。
高級制圖輸出
與比例相關的特征繪制和應用程序執行
功能標簽,包括標簽沖突調解
完全可定制的模板驅動輸出
TrueType字體
地圖元素自動化(比例尺、參考地圖和圖例)
使用基於邏輯或正則表達式類的主題映射
支持流行的腳本和開發環境
PHP、Python、Perl、Ruby、Java和.NET
跨平台支撐
Linux、Windows、Mac OS X、Solaris等
支持眾多開放地理空間聯盟(OGC)標准
WMS(客戶機/服務器)、非事務性WFS(客戶機/服務器)、WMC、WCS、過濾器編碼、SLD、GML、SOS、OM
多種光柵和矢量數據格式
tiff/geotiff、netcdf、mrsid、ecw和許多其他通過gdal
esri shapfiles、postgis、spaceialite、esri arcsde、oracle spatial、mysql以及許多其他通過ogr的軟件。
地圖投影支持
通過PROJ.4庫進行1000秒的動態地圖投影
2.MapServer與MS4W的區別
ms4w:mapserver for window,本質上就是windows下的MapServer集成,並且附帶如Geomoose、Openlayers等。
ms4w的包含內容:
-
- Apache version 2.4.37
- PHP version 5.6.40
- MapServer 7.0.7 CGI and MapScript
- GDAL 2.2.4 and bindings
- MapCache 1.6.1
- mapserver utilities
- gdal/ogr utilities
- proj.4 utilities
- shp2tile utility
- shapelib utilities
- shpdiff utility
- avce00 utilities
- spatialite utilities
- unixutils
- OWTChart 1.2.0
- H264 Streaming Module for Apache
由於是做.net開發,不需要Apache,顧單獨下載MapServer。
二、准備工作
1.下載release-1911-x64-gdal-2-3-3-mapserver-7-2-1.zip
2.解壓安裝

2.1打開SDKShell.bat文件查看內容
@echo off
set SDK_ROOT=%~dp0
set SDK_ROOT=%SDK_ROOT:\\=\%
echo %SDK_ROOT%
if "%1" == "setenv" goto setenv
%comspec% /k "%SDK_ROOT%SDKShell.bat" setenv %1
goto exit
:setenv
@echo Setting environment for using the GDAL and MapServer tools.
if "%2"=="hideoci" goto hideoci
set ocipath=0
set _path="%PATH:;=" "%"
for %%p in (%_path%) do if not "%%~p"=="" if exist %%~p\oci.dll set ocipath=1
if "%ocipath%"=="0" goto hideoci
@echo WARNING: If you encounter problems with missing oci libraries then type:
@echo SDKShell hideoci
goto setenv2
:hideoci
@echo Hiding the OCI plugin library.
if not exist "%SDK_ROOT%bin\gdal\plugins-optional" mkdir "%SDK_ROOT%bin\gdal\plugins-optional"
if exist "%SDK_ROOT%bin\gdal\plugins\ogr_OCI.dll" move "%SDK_ROOT%bin\gdal\plugins\ogr_OCI.dll" "%SDK_ROOT%bin\gdal\plugins-optional\ogr_OCI.dll"
if exist "%SDK_ROOT%bin\gdal\plugins\gdal_GEOR.dll" move "%SDK_ROOT%bin\gdal\plugins\gdal_GEOR.dll" "%SDK_ROOT%bin\gdal\plugins-optional\gdal_GEOR.dll"
:setenv2
SET "PATH=%SDK_ROOT%bin;%SDK_ROOT%bin\gdal\python\osgeo;%SDK_ROOT%bin\proj\apps;%SDK_ROOT%bin\gdal\apps;%SDK_ROOT%bin\ms\apps;%SDK_ROOT%bin\gdal\csharp;%SDK_ROOT%bin\ms\csharp;%SDK_ROOT%bin\curl;%PATH%"
SET "GDAL_DATA=%SDK_ROOT%bin\gdal-data"
SET "GDAL_DRIVER_PATH=%SDK_ROOT%bin\gdal\plugins"
SET "PYTHONPATH=%SDK_ROOT%bin\gdal\python;%SDK_ROOT%bin\ms\python"
SET "PROJ_LIB=%SDK_ROOT%bin\proj\SHARE"
:exit
2.2這個批處理的命令含義為:
1.獲取當前SDKShell.bat文件所在路徑
2.執行 SDKShell.bat 並傳參 setenv
3.如果參數1=="setenv",則跳轉到 :setenv
4.如果參數2=="hideoci",則跳轉到:hideoci
5.跳轉到:setenv后,判斷是否有參數2"hideoci",就是相關邏輯跳轉
6.判斷環境變量中的路徑文件夾中是否有oci.dll(Oracle Call Interface),如果沒有,則跳轉到:hideoci,執行隱藏OCI plugin library操作;如果有,則跳轉到:setenv2,添加相關環境變量。
7.:hideoci,即移動相關文件到指定的文件夾(一般電腦上面安裝了oracle的均由oci.dll)
2.3 執行SDKShell.bat文件
添加的環境變量
注意:%SDK_ROOT%表示的是你的SDKShell.bat文件目錄。我的是在 E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1
PATH中添加:%SDK_ROOT%bin;%SDK_ROOT%bin\gdal\python\osgeo;%SDK_ROOT%bin\proj\apps;%SDK_ROOT%bin\gdal\apps;%SDK_ROOT%bin\ms\apps;%SDK_ROOT%bin\gdal\csharp;%SDK_ROOT%bin\ms\csharp;%SDK_ROOT%bin\curl;
注意,%SDK_ROOT%bin;表示:E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\bin;
新建環境變量:
GDAL_DATA=%SDK_ROOT%bin\gdal-data
GDAL_DRIVER_PATH=%SDK_ROOT%bin\gdal\plugins
PYTHONPATH=%SDK_ROOT%bin\gdal\python;%SDK_ROOT%bin\ms\python
PROJ_LIB=%SDK_ROOT%bin\proj\SHARE
創建相關環境變量后(本機win10_x64,我執行SDKShell.bat后並沒有添加相關環境變量,不知道是什么問題,可能bat命令的版本不正確,重啟后也沒有,於是手動添加。),在cmd命令行里面執行:mapserv -v,驗證是否安裝成功

OUTPUT=PNG
OUTPUT=JPEG
OUTPUT=KML
SUPPORTS=PROJ
SUPPORTS=AGG
SUPPORTS=FREETYPE
SUPPORTS=CAIRO
SUPPORTS=SVG_SYMBOLS
SUPPORTS=SVGCAIRO
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
SUPPORTS=PBF
INPUT=JPEG
INPUT=POSTGIS
INPUT=OGR
INPUT=GDAL
INPUT=SHAPEFILE
這是安裝安裝成功,MapServer相關的輸入輸出以及支持項功能。
三、配置對IIS的支持
1.基本要求和注意項
1.1 你的IIs必須是ii7版本或更高
1.2 MapServer使用的默認站點位置在C:\Inetpub\wwwroot
1.3 所有的命令和操作請“以管理員方式運行”
2.將安裝目錄下面bin\ms\apps\中的所有文件復制到bin文件夾中
可通過cmd命令:xcopy E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\bin\ms\apps\* E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\bin
紅色標記部分路徑,根據你解壓的實際路徑修改。




3.創建C:\Inetpub\wwwroot\mapserver

4.在C:\Inetpub\wwwroot\mapserver目錄下面創建一個web.congif文件
web.config文件是站點控制文件,做.net開大的應該都知道,里面的內容如下
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="MapServerFastCgi" path="*" verb="*" type="" modules="FastCgiModule" scriptProcessor="E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\mapserv.exe" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition="" />
</handlers>
<caching enabled="true" enableKernelCache="true" />
</system.webServer>
</configuration>
注意:紅色路徑部分按照你安裝的mapserver實際路徑填寫
5.在IIS網站名稱為“Default Web Site”的默認80端口網站下面添加虛擬目錄,名稱為mapserver
在cmd命令中執行:"%systemroot%\system32\inetsrv\appcmd" add app /site.name:"Default Web Site" /path:/mapserver /physicalPath:"C:\Inetpub\wwwroot\mapserver"
或者你手動添加

6.確保IIS安裝了 ISAPI 服務器擴展 以及 CGI 模塊
ISAPI(Internet Server Application Programming Interface):可以被 HTTP 服務器加載和調用的 DLL。Internet 服務器擴展也稱為 Internet 服務器應用程序 (ISA),用於增強符合 Internet 服務器 API (ISAPI) 的服務器的功能。ISA 通過瀏覽器應用程序調用,並且將相似的功能提供給通用網關接口 (CGI) 應用程序。
CGI(Common Gateway Interface):服務器運行時外部程序的規范,按CGI 編寫的程序可以擴展服務器功能。CGI應用程序能與瀏覽器進行交互,還可通過數據庫API與數據庫服務器等外部數據源進行通信,從數據庫服務器中獲取數據。格式化為HTML文檔后,發送給瀏覽器,也可以將從瀏覽器獲得的數據放到數據庫中。

在cmd中輸入:start /w pkgmgr /iu:IIS-CGI;IIS-ISAPIExtensions;IIS-ISAPIFilter;
請重啟電腦。
7.設置mapserver.exe為FastCGI,並允許其在IIS下運行
在cmd中執行以下兩個命令:
命令1:"%systemroot%\system32\inetsrv\appcmd" set config -section:system.webServer/fastCgi /+"[fullPath='E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\bin\mapserv.exe']" /commit:apphost
注意紅色文字部分按照你的實際安裝位置填寫

打開C:\Windows\System32\inetsrv\Config\applicationHost.config文件,你可以發現添加的改變

命令2:"%systemroot%\system32\inetsrv\appcmd" set config /section:isapiCgiRestriction /+"[path='E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\bin\mapserv.exe',description='MapServer',allowed='True']"
注意:紅色標記部分按照實際路徑填寫

節點修改的位置

8.打開http://localhost/mapserver/可以查看站點

顯示:“No query information to decode. QUERY_STRING is set, but empty.”表示mapserver已經在iis里面成功配置為 FastCGI應用。
四、設置一個應用
1. 在安裝目錄下面創建文件夾apps\test\
打開cmd輸入:md E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\apps\test




2.在test文件夾中創建test.map文件,並填寫如下內容
2.1創建test.map文件
在cmd命令中輸入:cd /d E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\apps\test
主要:紅色文字部分按照實際安裝路徑填寫
在cmd命令中輸入:cd.>test.map
用來創建test.map


2.填寫test.map文件內容
MAP
EXTENT -180 -90 180 90
# Set the path to where the map projections are stored
# 設置地圖項目的存儲位置
CONFIG "PROJ_LIB" "E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\bin\proj\SHARE"
NAME "TestMap"
WEB
METADATA
"ows_enable_request" "*"
END
END
PROJECTION
"init=epsg:4326"
END
LAYER
NAME "country_bounds"
TYPE RASTER
CONNECTION "http://demo.mapserver.org/cgi-bin/wms?"
CONNECTIONTYPE WMS
METADATA
"wms_srs" "EPSG:4326"
"wms_name" "country_bounds"
"wms_server_version" "1.1.1"
"wms_format" "image/png"
END
END
END
注意:紅色標記部分按照實際路徑填寫

3.通過下面的路徑,打開你所創建的基於IIS的WMS服務應用
路徑:http://localhost/mapserver/mapserv?map=E:/SvnWorkspace/LY_WEB_GIS/branches/Documents/ms4w-mapserver-for-wimdows/release-1911-x64-gdal-2-3-3-mapserver-7-2-1/apps/test/test.map&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=country_bounds&STYLES=&CRS=EPSG:4326&BBOX=-180,-90,180,90&WIDTH=400&HEIGHT=300&FORMAT=image/png
注意:紅色部分根據實際路徑填寫

五、添加日志記錄
1.在test.map文件下面添加如下內容
# DEBUG a value from 0 (OFF) to 5 (detailed)
# DEBUG a ,0-5之間,0關閉日志,5最詳細
DEBUG 5
CONFIG "MS_ERRORFILE" "logs\ms.log"

2.創建文件夾logs
cmd輸入:cd /d E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\apps\test
cmd輸入:md logs
注意:紅色路徑部分按照實際路徑填寫
因為日志文件時根據map文件相對路徑決定的,所以測試項目的這個logs文件夾建立在test.map通目錄
3.根據當前站點應用程序池設置IIS對logs文件夾的讀寫權限
cmd輸入:icacls "E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\apps\test\logs" /grant "IIS AppPool\DefaultAppPool":(OI)(CI)RW
注意:紅色部分根據實際路徑填寫


或者你右鍵點擊log文件夾,在安全中添加IIS NETWORK對象有相關權限。
刷新站點,自動創建ms.log文件。說明權限正確,已經開啟日志記錄
總結
其實我就是個搬磚的,按照官網說明文檔一步一步來。官網的文檔比較老了,所以在配置test.map文件時出現了點問題。
其中,OUTPUT並不包含GIF,而官網的test.map內容中有"wms_format" "image/gif",官網配置樣例版本的MapServer版本比較老,新版本已經不支持gif,或者說你可以重新編譯源代碼,使其支持gif輸出。
詳情可看源碼release-1911-x64-gdal-2-3-3-mapserver-7-2-1-src.zip中的nmake.opt文件,其中214行寫到“Historical defines to use GIF as a result of the old Unisys patent”
如何添加其他輸入輸出,請見官網文檔,如添加PDF格式輸出。https://www.mapserver.org/output/pdf.html
Gis門外漢,歡迎拍磚。
