利用geotools生成点线面和注记的sld样式(二)

      接上一部分,我们可以用Filter来区分多个Rule,SLD除了可以设置要素厚度和颜色外,还可以用圆形、方形、自定义的图片图形或文字等设置Point,LineString可以渲染成各种线条等,Polygon可以填充自定义的平铺图像,将要素渲染成不同的风格。
  • 注记显示
      TextSymolizer注记符号可以和PolygonSymbolizer、LineSymbolizer、PointSymbolizer在同一Rule下,下面是一个注记SLD:

<?xml version="1.0" encoding="UTF-8"?>
<sld:StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xmlns:sld="http://www.opengis.net/sld"
                           xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc"
                           version="1.0.0">
    <sld:UserLayer>
        <sld:LayerFeatureConstraints>
            <sld:FeatureTypeConstraint/>
        </sld:LayerFeatureConstraints>
        <sld:UserStyle>
            <sld:Name>vf</sld:Name>
            <sld:FeatureTypeStyle>
                <sld:Name>name</sld:Name>
                <sld:Rule>
                    <sld:Name>rule 1</sld:Name>
                    <sld:LineSymbolizer>
                        <sld:Geometry>
                            <ogc:PropertyName>the_geom</ogc:PropertyName>
                        </sld:Geometry>
                        <sld:Stroke>
                            <sld:CssParameter name="stroke">#00FF00</sld:CssParameter>
                            <sld:CssParameter name="stroke-width">2.0</sld:CssParameter>
                        </sld:Stroke>
                    </sld:LineSymbolizer>
                    <sld:TextSymbolizer>
                        <sld:Geometry>
                            <ogc:Function name="centroid">
                                <ogc:PropertyName>the_geom</ogc:PropertyName>
                            </ogc:Function>
                        </sld:Geometry>
                        <sld:Label>中国</sld:Label>
                        <sld:Font>
                            <sld:CssParameter name="font-family">宋体</sld:CssParameter>
                            <sld:CssParameter name="font-size">22</sld:CssParameter>
                            <sld:CssParameter name="font-style">Regular</sld:CssParameter>
                            <sld:CssParameter name="font-weight">normal</sld:CssParameter>
                        </sld:Font>
                        <sld:LabelPlacement>
                            <sld:PointPlacement>
                                <sld:AnchorPoint>
                                    <sld:AnchorPointX>0.0</sld:AnchorPointX>
                                    <sld:AnchorPointY>0.0</sld:AnchorPointY>
                                </sld:AnchorPoint>
                                <sld:Displacement>
                                    <sld:DisplacementX>0.0</sld:DisplacementX>
                                    <sld:DisplacementY>0.0</sld:DisplacementY>
                                </sld:Displacement>
                                <sld:Rotation>-45</sld:Rotation>
                            </sld:PointPlacement>
                        </sld:LabelPlacement>
                        <sld:Halo>
                            <sld:Radius>5</sld:Radius>
                            <sld:Fill>
                                <sld:CssParameter name="fill">#F0F408</sld:CssParameter>
                            </sld:Fill>
                        </sld:Halo>
                        <sld:Fill>
                            <sld:CssParameter name="fill">#0551F5</sld:CssParameter>
                        </sld:Fill>
                    </sld:TextSymbolizer>
                </sld:Rule>
            </sld:FeatureTypeStyle>
        </sld:UserStyle>
    </sld:UserLayer>
</sld:StyledLayerDescriptor>

sf是StyleFactory实例,ff是FilterFactory2 实例,我们以LineString为例创建样式。

首先创建TextSymbolizer:

TextSymbolizer textSymbolizer = sf.createTextSymbolizer();

设置字体样式:

Fill textFill = sf.createFill(ff.literal(Color.decode("#0551F5")),ff.literal(0.5));  //颜色 不透明度
Font font = sf.createFont(ff.literal("宋体"),ff.literal("Regular"),ff.literal("normal"),ff.literal(22));

字体边缘:

Halo halo = sf.createHalo(sf.createFill(ff.literal(Color.decode("#F0F408"))),ff.literal(5));

注记文字可以设置字段属性和固定文本:

Expression exp = ff.literal("中国");  //显示固定文本
// Expression exp = ff.property("Name");  //Name字段

设置注记锚点、偏移和旋转:

AnchorPoint anchorPoint = sf.createAnchorPoint(ff.literal(0.0),ff.literal(0.0));
Displacement displacement = sf.createDisplacement(ff.literal(0.0),ff.literal(0.0)); 
Expression rotation = ff.literal(-45);  //旋转-45度
LabelPlacement placement = sf.createPointPlacement(anchorPoint,displacement,rotation);  //这里没用sf.createLinePlacement(...)

将信息加入textSymbolizer:

textSymbolizer.setFont(font);
textSymbolizer.setFill(textFill);
textSymbolizer.setLabel(exp);
textSymbolizer.setHalo(halo);
textSymbolizer.setLabelPlacement(placement);

最后将textSymbolizer添加到Rule:

rule.symbolizers().add(textSymbolizer);  //规则rule
  • WMS预览:

       

     另外,还可以有分级显示等其他与注记美观的设置。所有上述代码,很轻松就可以实现各种形式的SLD样式,只要定义一种前台传来JSON格式,后台就可以实现样式的生成,web端图层样式设置就方便很多。

转载自:https://blog.csdn.net/aliasone/article/details/79879751

You may also like...