使用c#開發mapserver之layerObj

 layerObj就是mapserver中的圖層對象,該對象在mapscript中重要程度僅次於mapObj。學過GIS的人都會了解,組成一個地圖最重要的東西是什麼,當然是圖層了!


layerObj的創建有兩種方法,一種是從mapObj對象中獲取,是由mapfile中配置的Layer標籤中的內容組成,在mapserver打開mapfile時自動生成的。還有一種方法就是創建一個新的layerObj對象。我們可以在程序中通過操作layerObj來動態的增刪修改mapObj中的圖層。


Ø         mapObj中獲取


layerObj pLayer = m_pMap.getLayer(0);

該方法可以獲取mapObj中已有的圖層,可以對已有圖層進行修改。


Ø         創建新圖層


該方法可以爲mapObj創建一個新的圖層,如下:

layerObj pNewLayer = new layerObj(pMap);


pMap是一個mapObj對象,如果參數pMap不爲空,就默認給該mapObj對象增加了一個新圖層,也就是說新創建的圖層屬於該pMap對象,如果參數pMap爲空,那麼就創建一個獨立存在的layerObj,當然layerObj獨立存在也沒什麼意義,必須要將其添加到mapObj中才能使用,可以通過如下方法將獨立圖層加入mapObj:


layerObj pNewLayer = new layerObj(null);

m_pMap.insertLayer(pNewLayer, 0);


參數一pNewlayer就是我們新創建的獨立圖層,0的意思是我們要將圖層插入到mapObj中的index位置。

對於新創建的layerObj還需要設置一些參數纔可以在mapserver中使用。layerObj有着豐富的方法和屬性,具體可以參考以下mapfile的說明文檔,其中layer部分有詳細的介紹。大多數的參數在創建layerObj的時候都會有默認值。有幾個參數是必需要設置的,否則就無法正常的顯示數據,如下:


Ø         Connectiontype


首先要告訴Mapserver你添加的這個圖層使用的是什麼數據源,也可以理解爲輸入的數據格式,mapserver目前支持多種的數據源,在MS_CONNECTION_TYPE枚舉變量中列舉了目前支持的所有格式,但一數據源具體能不能使用還要取決於編譯mapserver時是否包含了該格式。

pLayer.connectiontype = MS_CONNECTION_TYPE.MS_SHAPEFILE;

可以以下枚舉值中任選其一。

public enum MS_CONNECTION_TYPE

    {

        MS_INLINE = 0,

        MS_SHAPEFILE = 1,

        MS_TILED_SHAPEFILE = 2,

        MS_SDE = 3,

        MS_OGR = 4,

        MS_UNUSED_1 = 5,

        MS_POSTGIS = 6,

        MS_WMS = 7,

        MS_ORACLESPATIAL = 8,

        MS_WFS = 9,

        MS_GRATICULE = 10,

        MS_MYGIS = 11,

        MS_RASTER = 12,

        MS_PLUGIN = 13,

}


Ø         Data


數據的路徑信息,對於不同的數據有着不同的格式;

如果是shapefile數據,可以直接輸入一個數據路徑就可以,如:pLayer.data = @D:/gmap-ms46/data/ province.shp;或者是結合SHAPEPATH中設置的路徑,直接設置寫一個數據名就可以:pLayer.data = province


Ø         CONNECTION


該參數主要用於數據庫數據的讀取,例如:對於postgis數據源,不是在data參數可以簡單的設置一個數據名字就可以使用的,還需要設置connection參數來指明數據庫的位置。

CONNECTION "user=%uid% password=%passwd% dbname=postgis"


Ø         Type


該參數是設置數據的格式,如點、線、面等。Mapserver不會自動識別你添加的數據格式,需要我們手工設置纔可以。

我們怎麼知道數據的格式呢?這個可以通過其它gis軟件來獲取,比如arcgis什麼的,也可以通過第三方庫來獲取,我是使用Ogr來獲取數據的信息,然後將其賦值給layerObj

目前支持如下的格式:

public enum MS_LAYER_TYPE

    {

        MS_LAYER_POINT = 0,

        MS_LAYER_LINE = 1,

        MS_LAYER_POLYGON = 2,

        MS_LAYER_RASTER = 3,

        MS_LAYER_ANNOTATION = 4,

        MS_LAYER_QUERY = 5,

        MS_LAYER_CIRCLE = 6,

        MS_LAYER_TILEINDEX = 7,

        MS_LAYER_CHART = 8,

}

Mapserver對數據格式的限制不是太嚴格,例如一個面層你可以設置將其顯示爲一個線層或點層。文檔中有部分介紹具體可以查閱。

mapObj添加一個新圖層的代碼如下(shapefile爲例)

layerObj pLayer = new layerObj(m_pMap);

pLayer.status = 1;           

pLayer.name = yourlayername;

pLayer.group = yourgroupname;

pLayer.connectiontype = MS_CONNECTION_TYPE.MS_SHAPEFILE;

pLayer.data = @D:/gmap-ms46/data/ province.shp;

pLayer.type = MS_LAYER_TYPE.MS_LAYER_POLYGON;

 

以上這些只是最基本的設置,當然還可以做一些更復雜的設計,如給圖層配置符號、設計可見比例尺等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章