1. 程式人生 > >MapServer Tutorial——MapServer7.2.1教程學習——第一節用例實踐:Example1.1 A map with single layer

MapServer Tutorial——MapServer7.2.1教程學習——第一節用例實踐:Example1.1 A map with single layer

svn 輕松 自己 types 標註 path 程序 目前 resource

MapServer Tutorial——MapServer7.2.1教程學習——第一節用例實踐:Example1.1 A map with single layer

一、前言

  開始MapServer用例實踐之旅,做項目算是可以比喻為考試,但是考試之前,還是以做練習題模擬考為主。下面實踐一下官網的第一個例子:Example1.1 A map with single layer(官網地址:https://www.mapserver.org/tutorial/example1-1.html#example1-1)

二、簡介

  1.打開案例相關介紹

    1.1.MapServer能夠創建圖像並投影到本地目錄或者直接的投影到你所使用請求的瀏覽器上面。本用例你可以通過瀏覽器直接打開:http://localhost/cgi-bin/mapserv?map=/ms4w/apps/tutorial/htdocs/example1-1.map&layer=states&mode=map查看。

      註意:這個位置的地址是按照官網上面翻譯的地址,如果是根據自己的個人安裝環境以及建站配置等設置的,需要修改。

    1.2.當前URL分為兩個部分

      第一部分:"http://localhost/cgi-bin/mapserv?"部分,調用MapServer CGI進程。如果你在瀏覽器中打開http://localhost/cgi-bin/mapserv?,會出現“No query information to decode. QUERY_STRING is set, but empty”。

      第二部分:URL中的三個參數 map、layer、mode

        map=/ms4w/apps/tutorial/htdocs/example1-1.map:此處表示告訴MapServer的CGI進程去解析哪一個map文件。可以是絕對路徑,也可以是相對路徑(相對路徑是針對mapserv.exe而言的)。

        layer=states:此處告訴MapServer“打開”layer狀態,回調時,我們命名layer對象為“states”

        mode=map:告訴MapServer對mapfile文件的輸出格式,這裏是告訴MapServer直接將圖像投影到瀏覽器,無需先在服務器端創建零時的圖像。

      註意:mapserver模式cgi變量采用的值不是map。例如,如果使用mode=browse,mapserver將把映像轉儲到服務器上的臨時目錄。瀏覽模式現在不起作用,但稍後我們將再次實踐。

  2.mapfile的文件結構

    官網用例“Example1.1 A map with single layer

”的mapfile文件結構請查看此鏈接:https://www.mapserver.org/tutorial/example1-1-map.html#example1-1-map

    技術分享圖片

    MapFile文件介紹請查看此鏈接:https://www.mapserver.org/mapfile/index.html#mapfile

      後續再添加一篇文章,對MapFile做詳細介紹。

    Mapefile是MapServer的基礎配置機制(個人理解就是告訴MapServer的站點是如何運行的)。它有對象組成,如:LAYERT。每個對象有自己的關鍵之,並可以包含其他對象。它包含的對象有一定的層次結構,如:LAYER對象中包含CLASS,CLASS是屬於LAYER的。

    當前是一個非常簡單的文件結構,當學習完其他用例時,你會了解更復雜的mapfile層次結構。

    我們定義mapfile中的內容時,以對象名稱開頭,END結尾;#表示註釋。

    目前的層次結構為:

      MAP

        |----LAYER

          |----CLASS

            |----STYLE

  3.Mapfile中的對象解釋

    3.1Map對象

      MAP:每個mapfile均以MAP開頭,END結尾。只有這樣格式的文件才會被識別為mapfile文件。

      IMAGETYPE:圖片類型,imagetype為mapserver的CGI定義輸出圖片格式。當前樣例使用PNG作為輸出格式(老版本用GIF)。如果需要使用GIF,在編譯源碼時,需要開啟GIF,WBMP或 JPEG 支持(在cmd裏面輸入mapserv -v可以查看輸出的格式支持)。

             當然也能夠指定輸出其他格式,如:PDF、SWF、GeoTIFF等。只要編譯的時候在OUTPUTFORMAT加上相關的支持即可。輸出支持詳見:https://mapserver.org/documentation.html#output

      EXTENT:此參數指定地圖的輸出範圍-初始地圖的邊界框。範圍值的格式如:<Lower Left X> <Lower Left Y> <Upper Right X> <Upper Right Y>

           每個值用空格分開。這需要與數據使用相同的單位,或者,如果指定了不同的輸出投影,則需要與輸出投影使用相同的單位。

           在這個例子中,我們的數據是地理投影的,所以單位是十進制的。

           你可以使用ogrinfo(官網:http://gdal.org/ogrinfo.html)提供的工具,其作為GDAL/OGR二級制包的一部分,作為shapefile數據集的一部分(或者其他支持向量格式數據集)。

           使用cmd命令定位到.shp文件所在目錄,輸入:ogrinfo -al -so states_ugl.shp 查看 states_ugl.shp 文件信息(紅色部分根據實際查看文件信息填寫)

           運行此命令的先決條件是,你安裝了MapServer,同時環境變量中添加了GDAL

           技術分享圖片

           當然,你也可以使用ArcView或者其他開元GIS軟件查看,比如QGIS、Thuban 等。請隨意更改範圍的值,以便更好地了解範圍如何更改地圖。

      SIZE:表示MapServer生成map圖片的大小,但是為像素。當前例子是寬400像素,高300像素。在mapfile中修改這個值,可以查看在地圖中的變化。

      SHAPEPATH:圖層數據的路徑。可以是絕對路徑,也可以是mapfile的相對路徑(如:../data 或 E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\apps\Example1.1\data)。

             此路徑不需要通過web訪問,通常根本不需要對其訪問,除非你願意提供給別人下載你的原始數據。在web瀏覽器上面,它沒有任何作用,所以不要考慮提供下載此源文件的URL。

             只需要保證你的應用程序池可以訪問到此shape文件(在Unix上面,是“nobdy”或“Apache”用戶組),並對其讀取權限。

      IMAGECOLOR:地圖的背景顏色。使用RGB值組成。

    3.2 LAYER對象

      LAYER:map對象圖層的開始標簽,詳見:https://www.mapserver.org/mapfile/layer.html#layer。你可以指定多個layer對象。

      NAME:NAME是LAYER對象的唯一標識符。MapServer通過NAME控制LAYER的開關。這個案例中LAYER的STATUS為默認值,所以NAME是無法控制工作的。後續案例中再做詳細介紹。

      DATA:數據的名稱(當前案例中是shape文件的數據名稱)。MapServer通過OGR(GDAL庫的一部分)庫支持ESRI的shapefile格式以及以外的矢量數據解析。你可以通過訪問GDAL數據支持學習MapServer所支持的不同的矢量數據格式(http://gdal.org/ogr_formats.html)。

          然後官網上面也有相關的數據支持文檔guide to using vector data for MapServer.

      TYPE:數據是什麽類型的?如果是矢量數據,你可以指定為POLYGON(多邊形),LINE(線)(即使是POLYLINE在技術上也可以使用LINE),或者POINT(點)。你也可以指定為RASTER(柵格)或ANNOTATION(標註)數據。當前案例是POLYGON(多邊形)。

      STATUS:層級(layers)是通過他們的STATUS來設置開關的。DEFAULT 狀態默認是打開的。層級(layers)的開關控制是通過URL中LAYER的名稱參數控制的。

    3.3 CLASS 對象

      CLASS:在LAYER對象中,以CLASS標簽開始,END結尾。你可以在一個layer中指定多個CLASS。

      NAME:CLASS對象的唯一標識符。一個layer對象可以有多個class對象,就像一個MAP對象可以有多個layer對象一樣。MapServer通過CLASS對象的NAME標記命名CLASS等對象,所以最好給每個CLASS對象有一個適當的名稱描述。

    3.4 STYLE 對象

      STYLE:一個CLASS對象中可以定義多個style對象。可以通過一個style覆蓋或重載其他style。

      CLOLR:多邊形的填充顏色。如果是線形(TYPE值為LINE),則表示線的顏色。COLOR是一個RGB格式顏色值。

      OUTLINECOLOR:多邊形的邊線顏色。RGB顏色值格式。默認情況下,MapServer不會繪制多邊形(TYPE值為POLYGON)的邊線。如果你想查看多邊形的邊界,你需要在mapfile中定義OUTLINECOLOR參數。

  最後,你可以在mapfile中修改相關參數值,以便讓你更加輕松的學習相關關鍵之的用法。

三、根據用例創建自己實際運行的站點應用

  1. 觀察URL根據自己的實際情況加以調整

    1.1 新建一個自己的 Example1.1 A map with single layer 站點

      根據map參數的相對路徑是基於mapserv.exe的相對路徑所決定的。我建議將站點建立在E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\apps目錄下。

      這樣發布站點時,URL中的map參數可以為相對路徑。mapfile中SHAPEPATH也使用相對路徑比較方便。

      

      後續所有的案例均放在apps文件夾下面,每個案例的命名規則為Example + section + 編號 + . + 案例編號。所以第一節第一個案例的目錄名稱為:Example1.1

      在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

      在cmd中輸入:md Example1.1

      在cmd中輸入:cd Example1.1

      在cmd中輸入:cd.>web.config

      以上操作是創建相關文件夾以及web.config文件。

      在web.config文件呢中天下如下內容,配置FastCGI指向。(詳情請參考《MapServer Configuring with IIS》)      

1 <?xml version="1.0" encoding="UTF-8"?>
2 <configuration>
3     <system.webServer>
4         <handlers>
5             <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\bin\mapserv.exe" resourceType="Unspecified" requireAccess="Script" allowPathInfo="false" preCondition=""  />
6         </handlers>
7         <caching enabled="true" enableKernelCache="true" />
8     </system.webServer>
9 </configuration>

      其中“scriptProcessor”的實際路徑根據你安裝的MapServer填寫。

      站點的物理文件路徑為:E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\apps\Example1.1

      端口為:8011

      應用程序池名稱為:Example1.1

    1.2 配置當前 Example1.1 站點

      其中,當前站點需要運行,涉及到:mapfile文件、shape文件等存放。

      在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\Example1.1

      在cmd中輸入:md data

      在cmd中輸入:md logs

      在cmd中輸入:cd.>example1_1.map

      創建相關文件夾和數據存放文件夾,日誌記錄文件夾,以及Example1.1站點運行時調用MapServer的mapfile文件。

      將tutorial\data文件夾裏面的states_ugl.dbf、states_ugl.shp、states_ugl.shx拷貝到“E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\apps\Example1.1\data”文件夾下面。

      輸入文件詳見:https://www.mapserver.org/input/vector/format_types.html。這裏解釋了上個文件的類型。

      修改example1_1.map文件,內容如下:

 1 MAP
 2   IMAGETYPE      PNG
 3   EXTENT         -97.238976 41.619778 -82.122902 49.385620
 4   SIZE           400 300
 5   SHAPEPATH      "./data" #可以使exmaple1_1.map的相對路徑,也可以是絕對路徑 E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\apps\Example1.1\data
 6   IMAGECOLOR     255 255 255
 7 
 8   LAYER 
 9     NAME         states
10     DATA         states_ugl
11     STATUS       OFF
12     TYPE         POLYGON
13 
14     CLASS
15       NAME       "The Upper Great Lakes States"
16 
17       STYLE
18         COLOR        232 232 232
19         OUTLINECOLOR 32 32 32
20       END
21     END
22   END 
23   DEBUG 5 
24   CONFIG "MS_ERRORFILE" "logs\ms.log"
25 END 

    配置web站點程序池對日誌文件讀寫權限

     在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\Example1.1\logs" /grant "IIS AppPool\Example1.1":(OI)(CI)RW

    技術分享圖片

    測試站點能否訪問,在瀏覽器中輸入:http://localhost:8011/mapserv?map=../apps/Example1.1/example1_1.map&layer=states&mode=map

    技術分享圖片

    map=../apps/Example1.1/example1_1.map 表示 MapServer 與 mapfile (example1_1.map)的相對路徑

    mapfile (example1_1.map)中 SHAPEPATH "./data" 也是使用的相對路徑。

    兩處均使用了相對路徑。這樣URL顯得比較安全,畢竟沒有路徑盤符信息了。

後記

  在寫此案例的過程中,遇到了一些相對路徑的問題。修修改改,總算完成,其中也有很多不懂的知識,但是就像做題一樣,做錯了,就能馬上知道自己錯了。然後找答案,查詢知識點。就能一一解決。

  下一篇按照大綱接續寫。

MapServer Tutorial——MapServer7.2.1教程學習——第一節用例實踐:Example1.1 A map with single layer