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]。