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