天天看点

使用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;

以上这些只是最基本的设置,当然还可以做一些更复杂的设计,如给图层配置符号、设计可见比例尺等。