GeoServer中利用SLD配图之矢量图层配图

本文介绍了如何使用SLD( Styled Layer Descriptor)在GeoServer中为地图图层创建自定义样式,包括颜色填充、图片填充、注记显示、属性渲染和分级渲染等,通过示例详细解析了SLD文件的结构和参数设置,帮助读者理解并实现地图图层的个性化视觉效果。

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:李晓晖 - 博客园

 

1 背景

        我们在ArcMap中可以直接通过symbol功能对图层进行定制化配图。但是,如果我们将配好图的shp图层在GeoServer中发布时,会发现图层样式完全丢失了。其实原因很简单,用ArcMap配好的图层,其样式文件并不是保存在shp中,而是保存在mxd或者msd中。

        那么如何才能让GeoServer发布的图层也能达到定制化配图的效果呢?

2 SLD简介

        SLD是风格化图层描述器(Styled Layer Descriptor)的简称,是2005年OGC提出的一个标准,这个标准在一定条件下允许WMS服务器对地图可视化的表现形式进行扩展。在没有SLD之前,只能使用一些已经在服务器上规定好的样式来对地图进行可视化。而当使用了实现了SLD标准之后,它允许我们从客户端来对地图进行定义自己的样式,分级显示等操作,极大的扩展了地图可视化的灵活性。

        该SLD-规范是采用XML定义地图显示样式,通过自定义SLD来配置地图图层渲染的可视化风格,可以设置过滤器,自定义图例等。rule是SLD最重要的一个元素,因为她允许根据给定的某个参数(使用过滤器)对数据集进行分类,所有的与分类有关的重要参数都必须在rule元素中设置。

        对于使用SLD来进行地图的自定义样式,则必须结合使用SE(Symbology Encoding)这个标准。SE是OGC的另一个标准,这个也是基于XML模式定义的,这个标准允许我们自定义不同的符号样式来表达地图上不同的要素。SLD文件使用这种语言,这样在地图渲染时地图服务可以解释由用户定义的样式。

SLD文档的元素架构如下:

      

                 

一个SLD样式文档一般包含一个部分,而最重要的如下:

FeatureTypeStyle:这一部分是整个样式文档的根节点,并说明什么是它的样式将被应用的特征类型。FeatureTypeStyle包含一个或者多个Rule元素,Rule元素允许有条件的映射。

RULE(规则):规则是根据属性条件和地图比例尺来对要素进行分组渲染,一般RULE中只允许渲染一种类型的要素,即点,线,面等其中的一种,但是可以和注记同时使用。

Symbolizer(符号):Symbolizer指定数据应该如何可视化,在1.0的标准中包含五忠类型的Symbolizer,分别是PointSymbolizer(点符号)、LineSymbolizer(线符号)、PloygonSymbolizer(面符号)、TextSymbolizer(注记)、RasterSymbolizer(栅格)。

通过SLD可以设置的不仅仅是简单的颜色和厚度。点可以设置成常用的形状,如圆形,方形,星形,甚至可以是自定义的图片图形或文字来指定;线可以渲染成虚线或者点虚线等,多边形可以填充自定义的平铺图像,样式可以基于数据的属性给定,以至于要素能够

被渲染成不同的风格。

常用参数说明:

符号

含义

<Name>

样式名称

<FeatureTypeStyle>

要素样式

<Rule>

规则

<ogc:Filter>

过滤器

<ogc:PropertyIsBetween>

用来定义在两个属性值之间的过滤器

<ogc:PropertyIsLessThan>

用来定义在小于某个属性值的过滤器

<ogc:PropertyIsGreaterThan>

用来定义在大于某个属性值的过滤器

<ogc:PropertyName>

属性字段名

<ogc:Literal>

属性值

<PointSymbolizer>

点标记器

<LineSymbolizer>

线标记器

<PolygonSymbolizer>

面标记器

<CssParameter   name="fill">

填充颜色

<CssParameter   name="font-family">

字体

<CssParameter   name="font-style">

字体样式

<CssParameter   name="font-size">

字体大小

3 以polygon图层为例,详细讲解

3.1基本颜色填充

3.1.1 结构

PolygonSymbolizer

 

……Fill

填充

………CssParameter  name="fill"

颜色

………CssParameter  name="fill-opacity"

透明度

……Stroke

边界

………CssParameter  name="stroke"

颜色

………CssParameter  name="stroke-width"

宽度

3.1.2示例

带有边界透明的多边形

SLD:

<FeatureTypeStyle>
    <Rule>
        <PolygonSymbolizer>
        <Fill>
         <CssParameter   name="fill">#AAAAAA</CssParameter>
         <CssParameter   name="fill-opacity">0.5</CssParameter>
       </Fill>
       <Stroke>
        <CssParameter   name="stroke">#000000</CssParameter>
        <CssParameter   name="stroke-width">1</CssParameter>
      </Stroke>
     </PolygonSymbolizer>
    </Rule>
   </FeatureTypeStyle>

效果:

 

3.2图片填充

3.2.1结构

PolygonSymbolizer

 

……Fill

………GraphicFill

…………Graphic

……………ExternalGraphic

………………OnlineResource

图片来源

………………Format

图片格式

……………Size

大小

3.2.2示例

带有使用图片填充的多边形

SLD:

<FeatureTypeStyle>
    <Rule>
       <PolygonSymbolizer>

            <Fill>

              <GraphicFill>

                <Graphic>

                    <ExternalGraphic>

                     <OnlineResource xlink:type="simple"   xlink:href="20101.gif" />

                   <Format>image/gif</Format>

                    </ExternalGraphic>

                    <Size>20</Size>

                </Graphic>

              </GraphicFill>

            </Fill>

            <Stroke>

              <CssParameter   name="stroke">#000000</CssParameter>

              <CssParameter   name="stroke-width">1</CssParameter>

            </Stroke>

        </PolygonSymbolizer>

  </Rule>
   </FeatureTypeStyle>

效果:

 

3.3注记显示

3.2.1结构

TextSymbolizer

 

……Label

………ogc:PropertyName

注记的属性字段名称

……Font

字体

………CssParameter  name="font-family"

字体类型

………CssParameter  name="font-size"

字体大小

………CssParameter  name="font-style"

字体样式

………CssParameter  name="font-weight"

字体加粗

……LabelPlacement

注记的位置

………PointPlacement

注记点位置

…………AnchorPoint

……………AnchorPointX

……………AnchorPointY

…………Displacement

……………Displacement X

……………Displacement Y

…………Rotation

设置旋转角度

……Fill

填充

………CssParameter  name="fill"

填充颜色

3.2.2示例

带有注记的填充色透明的多边形

SLD:

 <TextSymbolizer>
         <Label>
             <ogc:PropertyName>COMNAME</ogc:PropertyName>
         </Label>
         <Font>
             <CssParameter name="font-family">
微软雅黑</CssParameter>
             <CssParameter name="font-size">15</CssParameter>
             <CssParameter name="font-style">normal</CssParameter>
             <CssParameter name="font-weight">bold</CssParameter>
         </Font>
         <LabelPlacement>
             <PointPlacement>
                  <AnchorPoint>
               <AnchorPointX>0.5</AnchorPointX>
               <AnchorPointY>0.5</AnchorPointY>
               </AnchorPoint>
             </PointPlacement>
         </LabelPlacement>
         <Fill>
             <CssParameter name="fill">#FF5226</CssParameter>
         </Fill>
         <VendorOption name="followLine">true</VendorOption>
    </TextSymbolizer> 

 

 

效果:

 

3.4 分属性渲染

3.4.1结构

PolygonSymbolizer

 

……Rule

………Filter

………PolygonSymbolizer

………TextSymbolizer

3.4.2示例

根据属性字段值范围用不同颜色渲染。

SLD:

<FeatureTypeStyle>

<Rule>

<Name>SmallCOMM</Name>

<Title>Less Than 510104024008</Title>

<ogc:Filter>

<ogc:PropertyIsLessThan>

<ogc:PropertyName>COMID</ogc:PropertyName>

<ogc:Literal>510104024008</ogc:Literal>

</ogc:PropertyIsLessThan>

</ogc:Filter>

<PolygonSymbolizer>

  <Fill>

 <CssParameter   name="fill">#66FF66</CssParameter>

 </Fill>

 </PolygonSymbolizer>

</Rule>

<Rule>

<Name>MediumCOMM</Name>

<Title>510104024008 to 510104024011</Title>

<ogc:Filter>

<ogc:And>

<ogc:PropertyIsGreaterThanOrEqualTo>

<ogc:PropertyName>COMID</ogc:PropertyName>

<ogc:Literal>510104024008</ogc:Literal>

</ogc:PropertyIsGreaterThanOrEqualTo>

<ogc:PropertyIsLessThan>

<ogc:PropertyName>COMID</ogc:PropertyName>

<ogc:Literal>510104024011</ogc:Literal>

</ogc:PropertyIsLessThan>

</ogc:And>

</ogc:Filter>

<PolygonSymbolizer>

<Fill>

<CssParameter name="fill">#33CC33</CssParameter>

</Fill>

</PolygonSymbolizer>

</Rule>

<Rule>

<Name>LargeCOMM</Name>

<Title>Greater Than 510104024011</Title>

<ogc:Filter>

<ogc:PropertyIsGreaterThan>

<ogc:PropertyName>COMID</ogc:PropertyName>

<ogc:Literal>510104024011</ogc:Literal>

</ogc:PropertyIsGreaterThan>

</ogc:Filter>

<PolygonSymbolizer>

<Fill>

<CssParameter name="fill">#009900</CssParameter>

</Fill>

</PolygonSymbolizer>

</Rule>

</FeatureTypeStyle>

效果:

     

                  

在SLD中还根据3.3的注记写法,增加了注记的显示。

3.5分级渲染

3.5.1结构

PolygonSymbolizer

 

……Rule

………MinScaleDenominator

………MaxScaleDenominator

………PolygonSymbolizer

………TextSymbolizer

3.5.2示例

通过设置不同比例尺时的显示颜色,展示不同的效果。

SLD:

<FeatureTypeStyle>

<Rule>

<Name>Large</Name>

<MaxScaleDenominator>5746</MaxScaleDenominator>

<PolygonSymbolizer>

<Fill>

<CssParameter name="fill">#CCCCCC</CssParameter>

</Fill>

<Stroke>

<CssParameter name="stroke">#000000</CssParameter>

<CssParameter name="stroke-width">7</CssParameter>

</Stroke>

</PolygonSymbolizer>

</Rule>

<Rule>

<Name>Medium</Name>

<MinScaleDenominator>5746</MinScaleDenominator>

<MaxScaleDenominator>12000</MaxScaleDenominator>

<PolygonSymbolizer>

<Fill>

<CssParameter name="fill">#0000CC</CssParameter>

</Fill>

<Stroke>

<CssParameter name="stroke">#000000</CssParameter>

<CssParameter name="stroke-width">4</CssParameter>

</Stroke>

</PolygonSymbolizer>

</Rule>

<Rule>

<Name>Small</Name>

<MinScaleDenominator>12000</MinScaleDenominator>

<PolygonSymbolizer>

<Fill>

<CssParameter name="fill">#0000CC</CssParameter>

</Fill>

<Stroke>

<CssParameter name="stroke">#000000</CssParameter>

<CssParameter name="stroke-width">1</CssParameter>

</Stroke>

</PolygonSymbolizer>

</Rule>

</FeatureTypeStyle>

效果图:

 

4 注意

4.1 注记渲染时某些注记未显示

初始时,某个要素的注记无法显示:

 

放大后其又可以出现:

 

出现这种情况,往往是因为注记显示的地方在另外一个要素下面。

解决方法比较简单,利用LabelPalcement元素调整注记显示的地方便可解决。例如:

 <LabelPlacement>
         <PointPlacement>
           <AnchorPoint>
               <AnchorPointX>0.5</AnchorPointX>
               <AnchorPointY>0.5</AnchorPointY>
           </AnchorPoint>
         </PointPlacement>
       </LabelPlacement>

4.2 中文出现乱码


出现这样的情况,一般是SLD中未进行正确的格式编码赋值。

首先将编码改成GB2312。例如:

<?xml version="1.0" encoding="GB2312"?>

如果发现还是乱码,则很有可能是目前字体不支持中文。

例如当字体是Arial时,不支持中文:

<CssParameter name="font-family">Arial</CssParameter>

将字体改成微软雅黑,则注记不再重现乱码:

<CssParameter name="font-family">微软雅黑</CssParameter>

5 总结

对Point和Line图层的SLD文件编写,其格式和内容与Polygon大体相似,不再累述。GeoServer不仅支持对矢量图层的渲染,还支持对栅格图层的渲染。在以后的章节中我会跟大家继续一起探讨。

<think>嗯,用户的问题是关于如何在QGIS完成配图后,将矢量图层数据和工程发布到GeoServer,并设置图层的可见比例尺。首先,我需要回顾一下之前提供的引用内容,看看有没有相关的信息可以利用。 根据引用[1],用户提到QGIS可以生成SLD文件,然后通过GeoServer样式管理导入。这可能涉及到在QGIS中导出SLD样式,然后在GeoServer中应用这个样式到对应的图层。然后,引用[3]详细说明了如何在SLD中使用PolygonSymbolizer来设置图片填充,这可能与设置比例尺无关,但说明SLD文件的结构,可能包含比例尺相关的参数。 用户的需求包括发布数据和设置可见比例尺。我需要分步骤思考:首先,如何将矢量数据从QGIS发布到GeoServer?可能需要将数据存储在PostgreSQL数据库中,因为引用[2]提到使用PostgreSQL+QGIS+GeoServer的工作流程。所以数据应该先导入PostGIS,然后在GeoServer中配置数据存储。 其次,关于设置可见比例尺,这在GeoServer中通常通过SLD的ScaleDenominator标签来实现。比如在Rule元素中添加MinScaleDenominator和MaxScaleDenominator,这样可以根据比例尺范围控制图层的显示。但用户可能不知道如何在QGIS生成的SLD中添加这些参数,或者是否需要手动编辑SLD文件。 另外,用户可能已经使用QGIS配置好了样式,并导出为SLD,但需要进一步调整SLD以包含比例尺设置。因此,步骤可能包括:导出SLD、手动编辑SLD添加比例尺规则、在GeoServer中创建图层并应用该样式。 还需要考虑数据发布的步骤:确保数据在PostGIS中,GeoServer连接该数据库,发布图层,然后应用样式。可能还需要验证QML到SLD的转换是否会影响比例尺设置,或者是否需要额外步骤。 可能的问题点:用户是否已经将数据导入PostGIS?如果没有,需要指导数据导入步骤。此外,用户可能对SLD的编辑不太熟悉,需要详细说明如何添加比例尺范围参数。 总结步骤:1. 准备数据到PostGIS;2. QGIS配图导出SLD;3. 编辑SLD添加比例尺规则;4. GeoServer中发布数据并应用样式;5. 设置图层比例尺范围。需要详细说明每一步,特别是编辑SLD的部分,可能给出示例代码,如如何在Rule中添加Min和Max ScaleDenominator。</think>### QGIS配图发布GeoServer设置可见比例尺教程 #### 一、数据准备与发布 1. **PostGIS数据导入** - 将矢量数据导入PostgreSQL/PostGIS数据库,使用QGIS的*DB Manager*工具或*导入矢量图层*功能 - 确保数据表包含空间字段(geometry)和坐标系定义(如EPSG:4326) 2. **GeoServer数据源配置** - 登录GeoServer后台,进入`数据存储`-`添加新的数据存储` - 选择`PostGIS`类型,填写数据库连接参数(主机、端口、数据库名、用户名、密码) - 测试连接成功后保存配置[^2] #### 二、样式导出与比例尺设置 1. **QGIS导出SLD样式** - 完成符号化配置后,右键图层进入`属性`-`符号化`标签 - 点击样式按钮选择`保存样式`,格式选择`SLD文件`[^1] 2. **手动添加比例尺规则** - 用文本编辑器打开导出的SLD文件,在需要设置可见范围的`<Rule>`标签内添加: ```xml <MinScaleDenominator>50000</MinScaleDenominator> <MaxScaleDenominator>1000000</MaxScaleDenominator> ``` - 示例:设置1:5万到1:100万可见 ```xml <Rule> <Name>中比例显示</Name> <MinScaleDenominator>50000</MinScaleDenominator> <MaxScaleDenominator>1000000</MaxScaleDenominator> <PolygonSymbolizer>...</PolygonSymbolizer> </Rule> ``` #### 三、GeoServer图层发布 1. **创建新图层** - 进入`图层`-`添加新的资源`,选择已配置的PostGIS数据源 - 选择要发布的数据库表,设置坐标系与数据一致 2. **应用SLD样式** - 进入`样式`菜单上传修改后的SLD文件 - 在图层编辑页面的`发布`标签中,将样式关联到图层 - 通过`图层预览`验证显示效果[^3] 3. **比例尺验证** - 使用OpenLayers预览时,通过地图缩放观察图层显示/隐藏变化 - 计算公式:`比例尺分母 = 分辨率 * 像素密度 / 0.0254`(通常直接使用预设阈值) #### 四、工程级发布(可选) 1. **QGIS工程发布** - 使用`QGIS Server`插件生成QGIS项目文件(.qgs) - 通过GeoServer的`WMS`服务加载QGIS工程(需配置QGIS Server环境) $$ \text{比例尺阈值} = \frac{\text{实际距离}}{\text{地图单位距离}} \times \text{DPI系数} $$
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值