天天看点

使用c#开发mapserver之七symbolObj

Mapserver中的symbol对象用来定义符号,symbol对象只包含了符号的形状,其它的颜色尺寸等都需要在style中设置,因此它需要与style对象配合使用才有效。每一个style对象都必须包含一个symbol对象,如果你没有为style指定symbol,style会使用默认的symbol, 对于点对象,Symbol 0是单个像素,对于面对象,Symbol 0是一个实体填充,对于线对象,Symbol 0是一个单像素宽度的线。

不推荐使用csharp_mapscript来动态的创建symbol对象,最好是预先定义好再使用,在csharp_mapscript中创建symbol不是太灵活,我只找到了创建image类型的symbol的方法。

    symbolObj pSymbolObj = new symbolObj(symbolname, imagefilePath);

预定义symbol对象有两种方式,可以直接在mapfile中定义,也可以在一个外部文件中定义然后在mapfile中引用。

第一种方式,就是在map对象内中以symbol标签开始定义一个symbol对象,例如:

MAP

  EXTENT 550000 3380000 590000 3420000

  FONTSET "/GIS/fonts/fonts.list"

  IMAGECOLOR 230 234 237

  IMAGETYPE jpeg

  SIZE 400 800

  UNITS METERS

  OUTPUTFORMAT

    NAME "jpeg"

    MIMETYPE "image/jpeg"

    DRIVER "GD/JPEG"

    EXTENSION "jpg"

    IMAGEMODE "RGB"

    TRANSPARENT FALSE

  END

  SYMBOL

    NAME "circle"

    TYPE ELLIPSE

    FILLED TRUE

    POINTS

      1 1

    END

  END

  SYMBOL

    NAME "dashed"

    TYPE ELLIPSE

    POINTS

      1 2

    END

    PATTERN

      2 2 2 2

    END

  END

另外一种方法是在一个外部文件中定义symbol,然后在mapfile中的map对象中,使用SYMBOLSET关键字来引用这个外部符号文件,例如:

SYMBOLSET "../etc/symbols.sym"

Symbols.sym中的内容就是一系列的symbol对象定义,如下例:

  SYMBOL

    NAME "circle"

    TYPE ELLIPSE

    FILLED TRUE

    POINTS

      1 1

    END

  END

  SYMBOL

    NAME "dashed"

    TYPE ELLIPSE

    POINTS

      1 2

    END

    PATTERN

      2 2 2 2

    END

  END

要说明的是,无论map对象中是否定义了symbollist关键字,Mapserver在读取mapfile创建map对象时,都会在map对象内定义一个symbolset对象,默认对将mapfile内部定义的symbol和外部symbollist中定义的symbol对象都加入到symbollist对象中。这两种方式定义的symbol使用起来完全一样,唯一的差别就是其属性值inmapfile不同,在mapfile中定义的symbol对象,inmapfile属性为true,而symbolset中定义的symbol该属性为false。

目前mapserver官方发布的c#mapscript对象中的symbolobj并没有暴露inmapfile属性,因此无法使用代码向map对象中增加symbol对象,只能将symbol对象加入到symbolset然后保存到外部符号文件中。我重新编译了c#mapscript暴露出了symbolobj的inmapfile属性,有需要的新编译类库的朋友可以给我发邮件:[email protected]。