图层样式
概览
本章主要讲述Geoserver中如何对图层进行样式设置。包括:
- SLD样式说明
- 点、线、面、栅格数据样式设置
- css插件添加与使用
- 样式生成工具的介绍与使用
一、SLD介绍
在Geoserver中,图层样式的设置是通过一种基于XML标记语言SLD(Styled Layer Descriptor)来完成的。如下所示为一个SLD的基本结构。
<?xml version="1.0" encoding="UTF-8"?>
<StyledLayerDescriptor version="1.0.0"
xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd"
xmlns="http://www.opengis.net/sld"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- a Named Layer is the basic building block of an SLD document -->
<NamedLayer>
<!-- 图层名称 -->
<Name>layer_name</Name>
<UserStyle>
<!-- 样式标题和摘要 -->
<Title>样式标题</Title>
<Abstract>样式摘要</Abstract>
<!-- 要素样式 -->
<FeatureTypeStyle>
<Rule>
<!-- 规则名称、标题和摘要 -->
<Name>规则名称</Name>
<Title>规则标题</Title>
<Abstract>规则摘要</Abstract>
<!-- 具体的样式设定 -->
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
在SLD文档中,一些标记有前缀,如ogc:
。这是因为它们在XML名称空间中定义。顶层StyledLayerDescriptor
标记(第2-7行)指定了两个XML名称空间,一个称为xmlns
,另一个称为xmlns:ogc
。第一个名称空间是文档的默认名称空间,因此属于它的标记不需要前缀。属于第二种类型的标签需要前缀ogc:
。
一种比较快速了解SLD的方式是学习样式示例,如下所示为基本点、线、面和栅格的样式。
1. 点样式
<?xml version="1.0" encoding="UTF-8"?>
<StyledLayerDescriptor version="1.0.0"
xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd"
xmlns="http://www.opengis.net/sld"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- a Named Layer is the basic building block of an SLD document -->
<NamedLayer>
<Name>default_point</Name>
<UserStyle>
<!-- Styles can have names, titles and abstracts -->
<Title>Red Square Point</Title>
<Abstract>A sample style that draws a red square point</Abstract>
<!-- FeatureTypeStyles describe how to render different features -->
<!-- A FeatureTypeStyle for rendering points -->
<FeatureTypeStyle>
<Rule>
<Name>rule1</Name>
<Title>Red Square Point</Title>
<Abstract>A 6 pixel square with a red fill and no stroke</Abstract>
<PointSymbolizer>
<Graphic>
<Mark>
<WellKnownName>square</WellKnownName>
<Fill>
<CssParameter name="fill">#FF0000</CssParameter>
</Fill>
</Mark>
<Size>6</Size>
</Graphic>
</PointSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
上述为一个基本的点的样式,如下为一个点相对比较完成的样式设置,包括点样式如大小、填充颜色、填充透明度、边框大小、边框颜色,标注样式如字体大小、字体颜色、字体描边等。
<?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>capital</sld:Name>
<sld:FeatureTypeStyle>
<sld:Name>group0</sld:Name>
<sld:FeatureTypeName>Feature</sld:FeatureTypeName>
<sld:SemanticTypeIdentifier>generic:geometry</sld:SemanticTypeIdentifier>
<sld:SemanticTypeIdentifier>simple</sld:SemanticTypeIdentifier>
<sld:Rule>
<sld:Name>default rule</sld:Name>
<sld:PointSymbolizer>
<sld:Graphic>
<sld:Mark>
<sld:WellKnownName>circle</sld:WellKnownName>
<sld:Fill>
<sld:CssParameter name="fill">#FF0000</sld:CssParameter>
</sld:Fill>
<sld:Stroke>
<sld:CssParameter name="stroke">#0000FF</sld:CssParameter>
<sld:CssParameter name="stroke-width">2.0</sld:CssParameter>
</sld:Stroke>
</sld:Mark>
<sld:Size>10</sld:Size>
</sld:Graphic>
</sld:PointSymbolizer>
<sld:TextSymbolizer>
<sld:Label>
<ogc:PropertyName>name</ogc:PropertyName>
</sld:Label>
<sld:Font>
<sld:CssParameter name="font-family">微软雅黑</sld:CssParameter>
<sld:CssParameter name="font-size">11.0</sld:CssParameter>
<sld:CssParameter name="font-style">normal</sld:CssParameter>
<sld:CssParameter name="font-weight">bold</sld:CssParameter>
</sld:Font>
<sld:LabelPlacement>
<sld:PointPlacement>
<sld:AnchorPoint>
<sld:AnchorPointX>0.5</sld:AnchorPointX>
<sld:AnchorPointY>1.0</sld:AnchorPointY>
</sld:AnchorPoint>
<sld:Displacement>
<sld:DisplacementX>0.0</sld:DisplacementX>
<sld:DisplacementY>-10.0</sld:DisplacementY>
</sld:Displacement>
</sld:PointPlacement>
</sld:LabelPlacement>
<sld:Halo>
<sld:Radius>1</sld:Radius>
<sld:Fill>
<sld:CssParameter name="fill">#FFFFFF</sld:CssParameter>
</sld:Fill>
</sld:Halo>
<sld:Fill>
<sld:CssParameter name="fill">#FF0000</sld:CssParameter>
</sld:Fill>
</sld:TextSymbolizer>
</sld:Rule>
</sld:FeatureTypeStyle>
</sld:UserStyle>
</sld:UserLayer>
</sld:StyledLayerDescriptor>
2. 线样式
<?xml version="1.0" encoding="UTF-8"?>
<StyledLayerDescriptor version="1.0.0"
xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd"
xmlns="http://www.opengis.net/sld"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- a Named Layer is the basic building block of an SLD document -->
<NamedLayer>
<Name>default_line</Name>
<UserStyle>
<!-- Styles can have names, titles and abstracts -->
<Title>Blue Line</Title>
<Abstract>A sample style that draws a line</Abstract>
<!-- FeatureTypeStyles describe how to render different features -->
<!-- A FeatureTypeStyle for rendering lines -->
<FeatureTypeStyle>
<Rule>
<Name>rule1</Name>
<Title>Blue Line</Title>
<Abstract>A solid blue line with a 1 pixel width</Abstract>
<LineSymbolizer>
<Stroke>
<CssParameter name="stroke">#0000FF</CssParameter>
</Stroke>
</LineSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
如上为线基本的样式设置,如下为一个相对比较完整的线的样式,如:线宽、颜色、透明度、虚线、标注等。
<?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>road</sld:Name>
<sld:FeatureTypeStyle>
<sld:Name>group0</sld:Name>
<sld:FeatureTypeName>Feature</sld:FeatureTypeName>
<sld:SemanticTypeIdentifier>generic:geometry</sld:SemanticTypeIdentifier>
<sld:SemanticTypeIdentifier>simple</sld:SemanticTypeIdentifier>
<sld:Rule>
<sld:Name>default rule</sld:Name>
<sld:LineSymbolizer>
<sld:Stroke>
<sld:CssParameter name="stroke">#FF0000</sld:CssParameter>
<sld:CssParameter name="stroke-linecap">round</sld:CssParameter>
<sld:CssParameter name="stroke-linejoin">round</sld:CssParameter>
<sld:CssParameter name="stroke-width">2.0</sld:CssParameter>
<sld:CssParameter name="stroke-dasharray">10.0 5.0</sld:CssParameter>
</sld:Stroke>
</sld:LineSymbolizer>
<sld:TextSymbolizer>
<sld:Label>
<ogc:PropertyName>type</ogc:PropertyName>
</sld:Label>
<sld:Font>
<sld:CssParameter name="font-family">Arial</sld:CssParameter>
<sld:CssParameter name="font-size">12.0</sld:CssParameter>
<sld:CssParameter name="font-style">normal</sld:CssParameter>
<sld:CssParameter name="font-weight">bold</sld:CssParameter>
</sld:Font>
<sld:LabelPlacement>
<sld:LinePlacement>
<sld:PerpendicularOffset>10.0</sld:PerpendicularOffset>
</sld:LinePlacement>
</sld:LabelPlacement>
<sld:Halo>
<sld:Radius>1</sld:Radius>
<sld:Fill>
<sld:CssParameter name="fill">#FFFFFF</sld:CssParameter>
</sld:Fill>
</sld:Halo>
<sld:Fill>
<sld:CssParameter name="fill">#000000</sld:CssParameter>
</sld:Fill>
<sld:VendorOption name="followLine">true</sld:VendorOption>
</sld:TextSymbolizer>
</sld:Rule>
</sld:FeatureTypeStyle>
</sld:UserStyle>
</sld:UserLayer>
</sld:StyledLayerDescriptor>
3. 面样式
<?xml version="1.0" encoding="UTF-8"?>
<StyledLayerDescriptor version="1.0.0"
xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd"
xmlns="http://www.opengis.net/sld"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- a Named Layer is the basic building block of an SLD document -->
<NamedLayer>
<Name>default_polygon</Name>
<UserStyle>
<!-- Styles can have names, titles and abstracts -->
<Title>Default Polygon</Title>
<Abstract>A sample style that draws a polygon</Abstract>
<!-- FeatureTypeStyles describe how to render different features -->
<!-- A FeatureTypeStyle for rendering polygons -->
<FeatureTypeStyle>
<Rule>
<Name>rule1</Name>
<Title>Gray Polygon with Black Outline</Title>
<Abstract>A polygon with a gray fill and a 1 pixel black outline</Abstract>
<PolygonSymbolizer>
<Fill>
<CssParameter name="fill">#AAAAAA</CssParameter>
</Fill>
<Stroke>
<CssParameter name="stroke">#000000</CssParameter>
<CssParameter name="stroke-width">1</CssParameter>
</Stroke>
</PolygonSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
上面示例为基本的面的样式,下面展示了一个相对比较完整的面的样式。
<?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>province</sld:Name>
<sld:FeatureTypeStyle>
<sld:Name>group0</sld:Name>
<sld:FeatureTypeName>Feature</sld:FeatureTypeName>
<sld:SemanticTypeIdentifier>generic:geometry</sld:SemanticTypeIdentifier>
<sld:SemanticTypeIdentifier>simple</sld:SemanticTypeIdentifier>
<sld:Rule>
<sld:Name>default rule</sld:Name>
<sld:PolygonSymbolizer>
<sld:Fill>
<sld:CssParameter name="fill">#FF0000</sld:CssParameter>
<sld:CssParameter name="fill-opacity">0.2</sld:CssParameter>
</sld:Fill>
<sld:Stroke>
<sld:CssParameter name="stroke">#FF0000</sld:CssParameter>
<sld:CssParameter name="stroke-width">2.0</sld:CssParameter>
</sld:Stroke>
</sld:PolygonSymbolizer>
<sld:TextSymbolizer>
<sld:Label>
<ogc:PropertyName>NAME</ogc:PropertyName>
</sld:Label>
<sld:Font>
<sld:CssParameter name="font-family">微软雅黑</sld:CssParameter>
<sld:CssParameter name="font-size">12.0</sld:CssParameter>
<sld:CssParameter name="font-style">normal</sld:CssParameter>
<sld:CssParameter name="font-weight">bold</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:PointPlacement>
</sld:LabelPlacement>
<sld:Halo>
<sld:Radius>1</sld:Radius>
<sld:Fill>
<sld:CssParameter name="fill">#FFFFFF</sld:CssParameter>
</sld:Fill>
</sld:Halo>
<sld:Fill>
<sld:CssParameter name="fill">#FF0000</sld:CssParameter>
</sld:Fill>
</sld:TextSymbolizer>
</sld:Rule>
</sld:FeatureTypeStyle>
</sld:UserStyle>
</sld:UserLayer>
</sld:StyledLayerDescriptor>
4. 栅格样式
<?xml version="1.0" encoding="UTF-8"?>
<StyledLayerDescriptor version="1.0.0"
xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd"
xmlns="http://www.opengis.net/sld"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- a Named Layer is the basic building block of an SLD document -->
<NamedLayer>
<Name>default_raster</Name>
<UserStyle>
<!-- Styles can have names, titles and abstracts -->
<Title>Opaque Raster</Title>
<Abstract>A sample style that draws a raster, good for displaying imagery</Abstract>
<!-- FeatureTypeStyles describe how to render different features -->
<!-- A FeatureTypeStyle for rendering rasters -->
<FeatureTypeStyle>
<Rule>
<Name>rule1</Name>
<Title>Opaque Raster</Title>
<Abstract>A raster with 100% opacity</Abstract>
<RasterSymbolizer>
<Opacity>1.0</Opacity>
</RasterSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
上述为一个简单的栅格样式,如下样式根据高程对DEM进行分段设色。
<?xml version="1.0" ?>
<sld:StyledLayerDescriptor
xmlns="http://www.opengis.net/sld"
xmlns:sld="http://www.opengis.net/sld"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:gml="http://www.opengis.net/gml"
version="1.0.0">
<sld:UserLayer>
<sld:LayerFeatureConstraints>
<sld:FeatureTypeConstraint/>
</sld:LayerFeatureConstraints>
<sld:UserStyle>
<sld:Name>shenzhen</sld:Name>
<sld:Description>Generated by SLD4raster - https://cbsuygulama.wordpress.com/sld4raster</sld:Description>
<sld:Title/>
<sld:FeatureTypeStyle>
<sld:Name/>
<sld:Rule>
<sld:RasterSymbolizer>
<sld:Geometry>
<ogc:PropertyName>grid</ogc:PropertyName>
</sld:Geometry>
<sld:Opacity>1</sld:Opacity>
<sld:ColorMap>
<sld:ColorMapEntry color="#2b83ba" quantity="0" label="0" opacity="1.0"/>
<sld:ColorMapEntry color="#abdda4" quantity="314.25" label="314" opacity="1.0"/>
<sld:ColorMapEntry color="#ffffbf" quantity="628.5" label="629" opacity="1.0"/>
<sld:ColorMapEntry color="#fdae61" quantity="942.75" label="943" opacity="1.0"/>
<sld:ColorMapEntry color="#d7191c" quantity="1257" label="1257" opacity="1.0"/>
</sld:ColorMap>
</sld:RasterSymbolizer>
</sld:Rule>
</sld:FeatureTypeStyle>
</sld:UserStyle>
</sld:UserLayer>
</sld:StyledLayerDescriptor>
二、图层样式管理
1. 样式列表
点击左侧功能菜单数据——>样式
进入工作区管理界面,如下图所示。样式列表展示样式操作(添加样式和删除已选样式)和已添加样式的列表,列表包括样式名称和工作区。点击样式名称可进入样式编辑页面。
2. 添加或编辑样式
点击添加样式
按钮,进入样式编辑页面,如下图所示。新增样式的时候需要填写的信息包括:样式数据和样式内容。样式数据包括样式名称、工作区、格式;样式内容有三种操作:基于基本样式、基于已有样式、基于自定义样式。点击下面的Validate
可对样式的正确性进行校验;点击Apply
可引用样式并进入编辑模式,进入编辑模式后多出几个tab,发布、图层预览、图层属性,如下图所示;点击保存
保存样式。
在发布
tab可设置该样式默认或要发布的图层,如下图所示。
在图层预览
tab可直接预览该样式在图层中的效果,如下图所示。
在图层属性
tab可对图层的属性进行预览,并返回第一个要素的值为示例,如下图所示。
3. 删除样式
在样式列表中选中样式,点击删除选中的样式
,弹出确认对话框,点击“确认”删除样式。
三、css插件
1. 安装
在介绍安装部分的时候,提到了插件的下载地方,下载插件并解压到geoserver\WEB-INF\lib
目录下,重启Tomcat或Geoserver。重启后,在添加或编辑样式时Format(格式)
便会多一个css
的格式。
2. 样式编辑
在添加或编辑样式时选择Format(格式)
为css
。
/* 设置边框和填充 */
* {
stroke: #ff0000;
stroke-width: 1;
fill: #ff0000;
fill-opacity: 0.1;
}
如下图所示,为简单的样式设置:
2.1 css属性
常见的css的属性有:
- mark:符号
symbol(star)
(有:circle
、square
、cross
、star
、arrow
)或者图标url - mark-size:符号大小
- stroke:边框颜色
- stroke-width:边框宽度
- stroke-opacity:边框透明度
- stroke-dasharray:边框虚线
- fill:填充颜色
- fill-opacity:填充透明度
- label: 标注,引用字段则用
[]
括起来,如label:[name]
,如为固定值,在其后面直接写,如label: Hello World
; - label-anchor: 对齐方式,
0.5 0.5
表示居中,0 0
表示左上角,1 1
表示右下角 - label-offset: 标注偏移量;
- label-rotation:标注旋转角度,顺时针;
- font-family:字体名称;
- font-size:字体大小;
- font-fill:字体颜色;
- font-weight:
bold
时表示字体加粗; - font-opacity:字体透明度;
- halo-color:描边颜色;
- halo-radius:描边宽度;
- halo-opacity:描边透明度;
- raster-opacity:栅格透明度;
如下为点、线、面、栅格常用的样式实例:
/* 点 */
* {
mark: symbol(circle);
mark-size: 5;
label: [name];
label-anchor: 0.5 1;
label-offset: 0 -6;
font-fill: #ff0000;
font-family: '微软雅黑';
}
:mark {
stroke: #ff0000;
fill: #ff0000;
fill-opacity: 0.5;
}
/* 线 */
* {
stroke: #ff0000;
stroke-width: 2;
stroke-opacity: 0.5;
stroke-dasharray: 5, 5;
label: [name];
font-family: '微软雅黑';
}
/* 面 */
* {
fill: #ff0000;
fill-opacity: 0.5;
stroke: #ff0000;
stroke-width: 2;
stroke-opacity: 0.5;
stroke-dasharray: 5, 5;
label: [name];
font-family: '微软雅黑';
}
/* 栅格 */
* {
raster-opacity: 0.5;
}
2.2 根据条件符号化
根据条件符号化,即根据字段值的不同,使用不同的符号化样式。实现示例可如下:
* {
stroke: black;
stroke-width: 0.2;
fill-opacity: 0.7;
/* @title Population < 2M */
[PERSONS < 2000000] {
fill: #4DFF4D;
};
/* @title 2M < Population < 4M */
[PERSONS >= 2000000] [PERSONS < 4000000] {
fill: #FF4D4D;
};
/* @title Population > 4M */
[PERSONS >= 4000000] {
fill: #4D4DFF;
};
/* Labelling */
[@sd < 20M] {
label: [STATE_ABBR];
label-anchor: 0.5 0.5;
font-family: "Times New Roman";
font-fill: black;
font-style: normal;
font-size: 14;
}
}
上述代码图例预览如下:
2.3 根据比例尺符号化
可根据比例尺进行符号化,实现不同比例尺下符号的变化。实现示例可如下:
/* @title scale < 4000000 */
[@scale < 4000000] {
mark-size: 3;
}
/* @title scale > 4000000 and scale < 8000000 */
[@scale > 4000000] [@scale < 8000000] [SCALERANK < 7] {
mark-size: 6;
}
/* @title scale > 17000000 */
[@scale > 17000000] [SCALERANK < 1] {
mark-size: 9;
}
* {
mark: symbol(circle);
}
:mark {
stroke: #ff0000;
fill: #ff0000;
fill-opacity: 0.5;
}
2.4 设置图例标题
图例标题通过注释/* @title scale < 4000000 */
实现。
四、SLD工具
SLD可借助uDig
或QGIS
生成。