惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
M
MIT News - Artificial intelligence
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
F
Fortinet All Blogs
L
LangChain Blog
D
Docker
G
Google Developers Blog
B
Blog RSS Feed
Google DeepMind News
Google DeepMind News
Vercel News
Vercel News
Recent Announcements
Recent Announcements
MyScale Blog
MyScale Blog
Microsoft Azure Blog
Microsoft Azure Blog
A
About on SuperTechFans
T
The Blog of Author Tim Ferriss
Recorded Future
Recorded Future
I
InfoQ
博客园 - 【当耐特】
The Cloudflare Blog
P
Proofpoint News Feed
GbyAI
GbyAI
博客园 - 司徒正美
U
Unit 42
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
H
Hackread – Cybersecurity News, Data Breaches, AI and More
B
Blog
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
Stack Overflow Blog
Stack Overflow Blog
Microsoft Security Blog
Microsoft Security Blog
爱范儿
爱范儿
Jina AI
Jina AI
量子位
阮一峰的网络日志
阮一峰的网络日志
月光博客
月光博客
有赞技术团队
有赞技术团队
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
Y
Y Combinator Blog
Apple Machine Learning Research
Apple Machine Learning Research
V
V2EX
大猫的无限游戏
大猫的无限游戏
F
Full Disclosure
雷峰网
雷峰网
美团技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
S
SegmentFault 最新的问题

博客园 - 我才是银古

第16章:常见问题、排错与最佳实践 第15章:扩展生态、MCAD 与外部集成 第12章:实战案例:机械结构与 3D 打印零件 第14章:构建、测试、调试与贡献流程 第13章:OpenSCAD 源码架构与核心执行流程 第11章:预览、渲染、网格精度与性能优化 第09章:列表推导、递归与算法建模 第08章:参数化零件库与复用设计 第10章:导入导出、命令行与自动化 第06章:CSG 布尔建模方法 第07章:二维图形、拉伸、旋转与投影 第05章:基础几何、坐标系与变换 第04章:参数、变量、函数、模块与作用域 OpenSCAD 教程目录 第03章:OpenSCAD 语言基础 第02章:安装、环境配置与开发工作流 第01章:OpenSCAD 项目全景与学习路线 第02章:源码获取、编译与开发环境配置 第01章:OCCT项目全景与学习路线 第18章:二次开发实战与综合案例 第18章:综合实战案例 第17章:数据交换与协同 第16章:源码架构与二次开发 第15章:插件与自定义工作台开发 第14章:Python脚本宏与自动化 第13章:FEM仿真分析 第12章:CAM数控加工 第11章:SurfaceMesh与逆向工程 第10章:Draft二维绘图与BIM建筑 第09章:工程图TechDraw 第07章:参数化表达式与Spreadsheet 第08章:装配设计Assembly 第06章:Part工作台与几何内核 第05章:PartDesign实体特征建模 第04章:草图Sketcher约束建模 第02章:安装版本与工作环境配置 第03章:界面工作台与基础操作 第01章:项目全景与学习路线 第十二章:插件开发、研究功能与最佳实践 第十章:定时任务与自动化(Cron) 第七章:技能、记忆与自学习闭环 第八章:MCP 集成与上下文文件 第六章:工具系统与终端后端 第五章:模型供应商与配置体系 Hermes Agent 教程目录 第十一章:语音、视觉、浏览器与子代理协作 第四章:CLI/TUI 与会话管理 第十二章:学习路线、实战方案与最佳实践 第十一章:源码结构、开发调试与插件开发 第十章:自动化、远程访问、日志与排障 第九章:Control UI、节点、Canvas 与语音能力 第七章:工具、技能、插件与能力扩展 第八章:安全模型、访问控制与沙箱实践 第六章:Agent 工作区、会话与多智能体路由 第五章:多通道消息接入与聊天平台配置 第四章:配置体系、模型接入与认证管理 第三章:Gateway 架构、协议与运行机制 第二章:安装、环境准备与快速上手 第一章:OpenClaw 项目概览与核心定位 oh-my-openagent 教程目录 09-命令模型回退与配置参考 10-实战案例最佳实践与故障排除 05-工作模式-Ultrawork-Prometheus-Atlas 08-Hooks与MCP系统 06-Category与Skill系统 07-核心工具链 04-智能体全景详解 03-安装与环境配置 02-整体架构与多模型编排机制 01-项目简介与核心理念 01-项目概览与学习路线 02-安装部署与工具适配 03-Skill机制与using-superpowers 05-TDD系统化调试与完成前验证 04-需求澄清方案设计与计划编写 07-并行智能体子智能体与Git-Worktree 第六章:代码审查、反馈处理与分支收尾 08-中国特色Skills与本土团队落地 09-MCP构建工作流执行与自定义Skill 第23章:FreeCAD-Python-API Clipper2 C# 源码解读教程 第19章:PolyTree 多边形树结构 第20章:实际应用与最佳实践 第18章:Minkowski 和与差 第17章:RectClip 矩形裁剪优化 第16章:ClipperOffset 偏移类详解 第15章:填充规则详解 第14章:布尔运算执行流程 第13章:ClipperD 浮点裁剪类 第11章:OutRec 与 OutPt 输出结构 第9章:Active 活动边结构 第10章:Vertex 顶点与 LocalMinima 局部极小值 第12章:Clipper64 裁剪类详解 第7章:高精度运算与128位整数 第8章:ClipperBase 基类详解 第5章:枚举类型与常量定义 第6章:InternalClipper 内部工具类 第2章:核心数据结构 - Point64、PointD 第3章:路径与多边形表示 - Path64、PathD、Paths64、PathsD 第4章:矩形边界 - Rect64、RectD
第5章 地图样式与SLD
我才是银古 · 2026-06-23 · via 博客园 - 我才是银古

第5章 地图样式与SLD

5.1 SLD标准介绍

5.1.1 什么是SLD

Styled Layer Descriptor(SLD)是OGC制定的地图样式描述标准,用于定义如何渲染地理数据。SLD使用XML语法描述地图的视觉呈现方式,包括颜色、符号、线型、填充等。

SLD的核心价值:

  • 标准化:作为OGC标准,SLD在不同GIS软件间具有互操作性
  • 灵活性:可以定义复杂的样式规则,包括条件渲染
  • 分离关注点:将数据和样式分离,便于管理和重用

5.1.2 SLD文档结构

一个典型的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">
  
  <NamedLayer>
    <Name>图层名称</Name>
    <UserStyle>
      <Name>样式名称</Name>
      <Title>样式标题</Title>
      <FeatureTypeStyle>
        <Rule>
          <Name>规则名称</Name>
          <Title>规则标题</Title>
          <!-- 过滤条件 -->
          <ogc:Filter>...</ogc:Filter>
          <!-- 比例尺条件 -->
          <MinScaleDenominator>1000</MinScaleDenominator>
          <MaxScaleDenominator>100000</MaxScaleDenominator>
          <!-- 符号化器 -->
          <PointSymbolizer>...</PointSymbolizer>
          <LineSymbolizer>...</LineSymbolizer>
          <PolygonSymbolizer>...</PolygonSymbolizer>
          <TextSymbolizer>...</TextSymbolizer>
          <RasterSymbolizer>...</RasterSymbolizer>
        </Rule>
      </FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
</StyledLayerDescriptor>

5.1.3 SLD核心元素

NamedLayer vs UserLayer:

  • NamedLayer:引用GeoServer中已发布的图层
  • UserLayer:使用内联数据或外部数据源

FeatureTypeStyle:

  • 定义要素类型的样式
  • 可以包含多个Rule
  • 多个FeatureTypeStyle会依次渲染

Rule:

  • 定义一条样式规则
  • 可以包含过滤条件
  • 可以包含比例尺范围
  • 可以包含一个或多个符号化器

5.1.4 GeoServer样式管理

创建新样式:

  1. 进入"数据" > "样式"
  2. 点击"添加新样式"
  3. 填写样式信息:
    • 名称:样式的唯一标识符
    • 工作区:样式所属工作区(可选)
    • 格式:SLD、CSS、YSLD等
  4. 在编辑器中输入样式代码
  5. 点击"验证"检查语法
  6. 点击"提交"保存

关联样式到图层:

  1. 进入图层编辑页面
  2. 在"发布"标签页找到"WMS设置"
  3. 设置"默认样式"
  4. 在"附加样式"中添加可选样式

5.2 点要素样式设计

5.2.1 基本点样式

使用简单的圆形符号:

<?xml version="1.0" encoding="UTF-8"?>
<StyledLayerDescriptor version="1.0.0"
  xmlns="http://www.opengis.net/sld"
  xmlns:ogc="http://www.opengis.net/ogc">
  <NamedLayer>
    <Name>points</Name>
    <UserStyle>
      <Title>Simple Point</Title>
      <FeatureTypeStyle>
        <Rule>
          <PointSymbolizer>
            <Graphic>
              <Mark>
                <WellKnownName>circle</WellKnownName>
                <Fill>
                  <CssParameter name="fill">#FF0000</CssParameter>
                </Fill>
                <Stroke>
                  <CssParameter name="stroke">#000000</CssParameter>
                  <CssParameter name="stroke-width">1</CssParameter>
                </Stroke>
              </Mark>
              <Size>10</Size>
            </Graphic>
          </PointSymbolizer>
        </Rule>
      </FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
</StyledLayerDescriptor>

5.2.2 预定义符号

GeoServer支持以下预定义符号(WellKnownName):

符号 说明
circle 圆形
square 正方形
triangle 三角形
star 五角星
cross 十字
x X形
diamond 菱形
arrow 箭头

5.2.3 使用图标

使用外部图像文件作为点符号:

<PointSymbolizer>
  <Graphic>
    <ExternalGraphic>
      <OnlineResource xlink:type="simple" 
        xlink:href="http://localhost:8080/geoserver/styles/icons/hospital.png"/>
      <Format>image/png</Format>
    </ExternalGraphic>
    <Size>24</Size>
  </Graphic>
</PointSymbolizer>

使用相对路径:

<ExternalGraphic>
  <OnlineResource xlink:type="simple" 
    xlink:href="icons/hospital.png"/>
  <Format>image/png</Format>
</ExternalGraphic>

图标文件应放在GeoServer数据目录的styles文件夹下。

5.2.4 点符号分类

根据属性值使用不同的符号:

<FeatureTypeStyle>
  <!-- 医院 -->
  <Rule>
    <Name>Hospital</Name>
    <ogc:Filter>
      <ogc:PropertyIsEqualTo>
        <ogc:PropertyName>type</ogc:PropertyName>
        <ogc:Literal>hospital</ogc:Literal>
      </ogc:PropertyIsEqualTo>
    </ogc:Filter>
    <PointSymbolizer>
      <Graphic>
        <ExternalGraphic>
          <OnlineResource xlink:type="simple" xlink:href="icons/hospital.png"/>
          <Format>image/png</Format>
        </ExternalGraphic>
        <Size>20</Size>
      </Graphic>
    </PointSymbolizer>
  </Rule>
  
  <!-- 学校 -->
  <Rule>
    <Name>School</Name>
    <ogc:Filter>
      <ogc:PropertyIsEqualTo>
        <ogc:PropertyName>type</ogc:PropertyName>
        <ogc:Literal>school</ogc:Literal>
      </ogc:PropertyIsEqualTo>
    </ogc:Filter>
    <PointSymbolizer>
      <Graphic>
        <ExternalGraphic>
          <OnlineResource xlink:type="simple" xlink:href="icons/school.png"/>
          <Format>image/png</Format>
        </ExternalGraphic>
        <Size>20</Size>
      </Graphic>
    </PointSymbolizer>
  </Rule>
</FeatureTypeStyle>

5.2.5 点大小分级

根据数值属性设置符号大小:

<PointSymbolizer>
  <Graphic>
    <Mark>
      <WellKnownName>circle</WellKnownName>
      <Fill>
        <CssParameter name="fill">#3366FF</CssParameter>
      </Fill>
    </Mark>
    <Size>
      <ogc:Mul>
        <ogc:Div>
          <ogc:PropertyName>population</ogc:PropertyName>
          <ogc:Literal>100000</ogc:Literal>
        </ogc:Div>
        <ogc:Literal>5</ogc:Literal>
      </ogc:Mul>
    </Size>
  </Graphic>
</PointSymbolizer>

5.3 线要素样式设计

5.3.1 基本线样式

简单的实线样式:

<LineSymbolizer>
  <Stroke>
    <CssParameter name="stroke">#FF0000</CssParameter>
    <CssParameter name="stroke-width">2</CssParameter>
    <CssParameter name="stroke-linecap">round</CssParameter>
    <CssParameter name="stroke-linejoin">round</CssParameter>
  </Stroke>
</LineSymbolizer>

线条属性说明:

属性 说明 可选值
stroke 线条颜色 十六进制颜色值
stroke-width 线条宽度 像素值
stroke-opacity 透明度 0-1
stroke-linecap 线端样式 butt, round, square
stroke-linejoin 连接样式 miter, round, bevel
stroke-dasharray 虚线模式 如 "5 2"
stroke-dashoffset 虚线偏移 像素值

5.3.2 虚线和点线

<!-- 虚线 -->
<LineSymbolizer>
  <Stroke>
    <CssParameter name="stroke">#333333</CssParameter>
    <CssParameter name="stroke-width">2</CssParameter>
    <CssParameter name="stroke-dasharray">10 5</CssParameter>
  </Stroke>
</LineSymbolizer>

<!-- 点线 -->
<LineSymbolizer>
  <Stroke>
    <CssParameter name="stroke">#333333</CssParameter>
    <CssParameter name="stroke-width">2</CssParameter>
    <CssParameter name="stroke-dasharray">2 5</CssParameter>
    <CssParameter name="stroke-linecap">round</CssParameter>
  </Stroke>
</LineSymbolizer>

<!-- 点划线 -->
<LineSymbolizer>
  <Stroke>
    <CssParameter name="stroke">#333333</CssParameter>
    <CssParameter name="stroke-width">2</CssParameter>
    <CssParameter name="stroke-dasharray">10 5 2 5</CssParameter>
  </Stroke>
</LineSymbolizer>

5.3.3 双线(套壳线)

通过多个符号化器实现套壳线效果:

<FeatureTypeStyle>
  <Rule>
    <!-- 底层宽线(外边框) -->
    <LineSymbolizer>
      <Stroke>
        <CssParameter name="stroke">#000000</CssParameter>
        <CssParameter name="stroke-width">5</CssParameter>
        <CssParameter name="stroke-linecap">round</CssParameter>
      </Stroke>
    </LineSymbolizer>
    <!-- 顶层窄线(内部填充) -->
    <LineSymbolizer>
      <Stroke>
        <CssParameter name="stroke">#FFFF00</CssParameter>
        <CssParameter name="stroke-width">3</CssParameter>
        <CssParameter name="stroke-linecap">round</CssParameter>
      </Stroke>
    </LineSymbolizer>
  </Rule>
</FeatureTypeStyle>

5.3.4 道路样式分类

根据道路等级显示不同样式:

<FeatureTypeStyle>
  <!-- 高速公路 -->
  <Rule>
    <Name>Highway</Name>
    <ogc:Filter>
      <ogc:PropertyIsEqualTo>
        <ogc:PropertyName>road_class</ogc:PropertyName>
        <ogc:Literal>highway</ogc:Literal>
      </ogc:PropertyIsEqualTo>
    </ogc:Filter>
    <LineSymbolizer>
      <Stroke>
        <CssParameter name="stroke">#E34234</CssParameter>
        <CssParameter name="stroke-width">6</CssParameter>
      </Stroke>
    </LineSymbolizer>
    <LineSymbolizer>
      <Stroke>
        <CssParameter name="stroke">#FF6B5B</CssParameter>
        <CssParameter name="stroke-width">4</CssParameter>
      </Stroke>
    </LineSymbolizer>
  </Rule>
  
  <!-- 主干道 -->
  <Rule>
    <Name>Primary</Name>
    <ogc:Filter>
      <ogc:PropertyIsEqualTo>
        <ogc:PropertyName>road_class</ogc:PropertyName>
        <ogc:Literal>primary</ogc:Literal>
      </ogc:PropertyIsEqualTo>
    </ogc:Filter>
    <LineSymbolizer>
      <Stroke>
        <CssParameter name="stroke">#FFA500</CssParameter>
        <CssParameter name="stroke-width">4</CssParameter>
      </Stroke>
    </LineSymbolizer>
  </Rule>
  
  <!-- 次要道路 -->
  <Rule>
    <Name>Secondary</Name>
    <ogc:Filter>
      <ogc:PropertyIsEqualTo>
        <ogc:PropertyName>road_class</ogc:PropertyName>
        <ogc:Literal>secondary</ogc:Literal>
      </ogc:PropertyIsEqualTo>
    </ogc:Filter>
    <LineSymbolizer>
      <Stroke>
        <CssParameter name="stroke">#FFD700</CssParameter>
        <CssParameter name="stroke-width">2</CssParameter>
      </Stroke>
    </LineSymbolizer>
  </Rule>
</FeatureTypeStyle>

5.3.5 线上符号

在线上重复显示符号:

<LineSymbolizer>
  <Stroke>
    <GraphicStroke>
      <Graphic>
        <Mark>
          <WellKnownName>circle</WellKnownName>
          <Fill>
            <CssParameter name="fill">#000000</CssParameter>
          </Fill>
        </Mark>
        <Size>6</Size>
      </Graphic>
    </GraphicStroke>
    <CssParameter name="stroke-dasharray">12 12</CssParameter>
  </Stroke>
</LineSymbolizer>

5.4 面要素样式设计

5.4.1 基本面样式

简单的填充和边框:

<PolygonSymbolizer>
  <Fill>
    <CssParameter name="fill">#00FF00</CssParameter>
    <CssParameter name="fill-opacity">0.5</CssParameter>
  </Fill>
  <Stroke>
    <CssParameter name="stroke">#000000</CssParameter>
    <CssParameter name="stroke-width">1</CssParameter>
  </Stroke>
</PolygonSymbolizer>

5.4.2 图案填充

使用图案进行填充:

<PolygonSymbolizer>
  <Fill>
    <GraphicFill>
      <Graphic>
        <Mark>
          <WellKnownName>shape://slash</WellKnownName>
          <Stroke>
            <CssParameter name="stroke">#000000</CssParameter>
            <CssParameter name="stroke-width">1</CssParameter>
          </Stroke>
        </Mark>
        <Size>8</Size>
      </Graphic>
    </GraphicFill>
  </Fill>
  <Stroke>
    <CssParameter name="stroke">#000000</CssParameter>
    <CssParameter name="stroke-width">1</CssParameter>
  </Stroke>
</PolygonSymbolizer>

预定义填充图案:

  • shape://slash:斜线
  • shape://backslash:反斜线
  • shape://vertline:竖线
  • shape://horline:横线
  • shape://plus:加号
  • shape://times:乘号

5.4.3 分级色彩

根据数值属性进行颜色分级:

<FeatureTypeStyle>
  <!-- 第一级 -->
  <Rule>
    <Name>Low</Name>
    <ogc:Filter>
      <ogc:PropertyIsLessThan>
        <ogc:PropertyName>population</ogc:PropertyName>
        <ogc:Literal>100000</ogc:Literal>
      </ogc:PropertyIsLessThan>
    </ogc:Filter>
    <PolygonSymbolizer>
      <Fill>
        <CssParameter name="fill">#FFFFB2</CssParameter>
      </Fill>
    </PolygonSymbolizer>
  </Rule>
  
  <!-- 第二级 -->
  <Rule>
    <Name>Medium</Name>
    <ogc:Filter>
      <ogc:And>
        <ogc:PropertyIsGreaterThanOrEqualTo>
          <ogc:PropertyName>population</ogc:PropertyName>
          <ogc:Literal>100000</ogc:Literal>
        </ogc:PropertyIsGreaterThanOrEqualTo>
        <ogc:PropertyIsLessThan>
          <ogc:PropertyName>population</ogc:PropertyName>
          <ogc:Literal>500000</ogc:Literal>
        </ogc:PropertyIsLessThan>
      </ogc:And>
    </ogc:Filter>
    <PolygonSymbolizer>
      <Fill>
        <CssParameter name="fill">#FECC5C</CssParameter>
      </Fill>
    </PolygonSymbolizer>
  </Rule>
  
  <!-- 第三级 -->
  <Rule>
    <Name>High</Name>
    <ogc:Filter>
      <ogc:PropertyIsGreaterThanOrEqualTo>
        <ogc:PropertyName>population</ogc:PropertyName>
        <ogc:Literal>500000</ogc:Literal>
      </ogc:PropertyIsGreaterThanOrEqualTo>
    </ogc:Filter>
    <PolygonSymbolizer>
      <Fill>
        <CssParameter name="fill">#FD8D3C</CssParameter>
      </Fill>
    </PolygonSymbolizer>
  </Rule>
</FeatureTypeStyle>

5.4.4 颜色插值

使用函数进行连续颜色渐变:

<PolygonSymbolizer>
  <Fill>
    <CssParameter name="fill">
      <ogc:Function name="Interpolate">
        <ogc:PropertyName>population</ogc:PropertyName>
        <ogc:Literal>0</ogc:Literal>
        <ogc:Literal>#FFFFB2</ogc:Literal>
        <ogc:Literal>500000</ogc:Literal>
        <ogc:Literal>#FD8D3C</ogc:Literal>
        <ogc:Literal>1000000</ogc:Literal>
        <ogc:Literal>#BD0026</ogc:Literal>
        <ogc:Literal>color</ogc:Literal>
      </ogc:Function>
    </CssParameter>
  </Fill>
</PolygonSymbolizer>

5.5 文本标注与注记

5.5.1 基本文本标注

<TextSymbolizer>
  <Label>
    <ogc:PropertyName>name</ogc:PropertyName>
  </Label>
  <Font>
    <CssParameter name="font-family">Arial</CssParameter>
    <CssParameter name="font-size">12</CssParameter>
    <CssParameter name="font-style">normal</CssParameter>
    <CssParameter name="font-weight">bold</CssParameter>
  </Font>
  <Fill>
    <CssParameter name="fill">#000000</CssParameter>
  </Fill>
</TextSymbolizer>

5.5.2 文字描边(Halo)

添加白色描边使文字在复杂背景上更清晰:

<TextSymbolizer>
  <Label>
    <ogc:PropertyName>name</ogc:PropertyName>
  </Label>
  <Font>
    <CssParameter name="font-family">Arial</CssParameter>
    <CssParameter name="font-size">14</CssParameter>
  </Font>
  <Halo>
    <Radius>2</Radius>
    <Fill>
      <CssParameter name="fill">#FFFFFF</CssParameter>
    </Fill>
  </Halo>
  <Fill>
    <CssParameter name="fill">#333333</CssParameter>
  </Fill>
</TextSymbolizer>

5.5.3 标注位置控制

点要素标注位置:

<TextSymbolizer>
  <Label>
    <ogc:PropertyName>name</ogc:PropertyName>
  </Label>
  <LabelPlacement>
    <PointPlacement>
      <AnchorPoint>
        <AnchorPointX>0.5</AnchorPointX>
        <AnchorPointY>0</AnchorPointY>
      </AnchorPoint>
      <Displacement>
        <DisplacementX>0</DisplacementX>
        <DisplacementY>10</DisplacementY>
      </Displacement>
      <Rotation>0</Rotation>
    </PointPlacement>
  </LabelPlacement>
  <Font>
    <CssParameter name="font-family">Arial</CssParameter>
    <CssParameter name="font-size">12</CssParameter>
  </Font>
  <Fill>
    <CssParameter name="fill">#000000</CssParameter>
  </Fill>
</TextSymbolizer>

线要素标注位置:

<TextSymbolizer>
  <Label>
    <ogc:PropertyName>name</ogc:PropertyName>
  </Label>
  <LabelPlacement>
    <LinePlacement>
      <PerpendicularOffset>5</PerpendicularOffset>
    </LinePlacement>
  </LabelPlacement>
  <Font>
    <CssParameter name="font-family">Arial</CssParameter>
    <CssParameter name="font-size">10</CssParameter>
  </Font>
  <Fill>
    <CssParameter name="fill">#333333</CssParameter>
  </Fill>
  <VendorOption name="followLine">true</VendorOption>
  <VendorOption name="maxAngleDelta">30</VendorOption>
</TextSymbolizer>

5.5.4 标注冲突处理

GeoServer提供了丰富的标注冲突处理选项:

<TextSymbolizer>
  <Label>
    <ogc:PropertyName>name</ogc:PropertyName>
  </Label>
  <Font>
    <CssParameter name="font-family">Arial</CssParameter>
    <CssParameter name="font-size">12</CssParameter>
  </Font>
  <!-- 允许重叠 -->
  <VendorOption name="conflictResolution">false</VendorOption>
  <!-- 允许部分标注显示在地图外 -->
  <VendorOption name="partials">true</VendorOption>
  <!-- 标注优先级 -->
  <Priority>
    <ogc:PropertyName>population</ogc:PropertyName>
  </Priority>
  <!-- 标注间距 -->
  <VendorOption name="spaceAround">10</VendorOption>
  <!-- 多边形标注重复 -->
  <VendorOption name="repeat">200</VendorOption>
</TextSymbolizer>

5.5.5 中文字体配置

在Linux服务器上使用中文字体:

  1. 安装中文字体:
# Ubuntu/Debian
sudo apt install fonts-wqy-microhei fonts-wqy-zenhei

# CentOS/RHEL
sudo yum install wqy-microhei-fonts wqy-zenhei-fonts
  1. 在SLD中使用中文字体:
<Font>
  <CssParameter name="font-family">WenQuanYi Micro Hei</CssParameter>
  <CssParameter name="font-size">12</CssParameter>
</Font>
  1. 重启GeoServer使字体生效

5.6 复杂样式与规则

5.6.1 比例尺依赖样式

根据地图比例尺显示不同样式:

<FeatureTypeStyle>
  <!-- 小比例尺(大范围) -->
  <Rule>
    <Name>Small Scale</Name>
    <MinScaleDenominator>100000</MinScaleDenominator>
    <PointSymbolizer>
      <Graphic>
        <Mark>
          <WellKnownName>circle</WellKnownName>
          <Fill>
            <CssParameter name="fill">#FF0000</CssParameter>
          </Fill>
        </Mark>
        <Size>5</Size>
      </Graphic>
    </PointSymbolizer>
  </Rule>
  
  <!-- 大比例尺(小范围) -->
  <Rule>
    <Name>Large Scale</Name>
    <MaxScaleDenominator>100000</MaxScaleDenominator>
    <PointSymbolizer>
      <Graphic>
        <Mark>
          <WellKnownName>circle</WellKnownName>
          <Fill>
            <CssParameter name="fill">#FF0000</CssParameter>
          </Fill>
        </Mark>
        <Size>15</Size>
      </Graphic>
    </PointSymbolizer>
    <TextSymbolizer>
      <Label>
        <ogc:PropertyName>name</ogc:PropertyName>
      </Label>
      <Font>
        <CssParameter name="font-family">Arial</CssParameter>
        <CssParameter name="font-size">12</CssParameter>
      </Font>
    </TextSymbolizer>
  </Rule>
</FeatureTypeStyle>

5.6.2 ElseFilter

使用ElseFilter处理未匹配的要素:

<FeatureTypeStyle>
  <Rule>
    <Name>Highway</Name>
    <ogc:Filter>
      <ogc:PropertyIsEqualTo>
        <ogc:PropertyName>type</ogc:PropertyName>
        <ogc:Literal>highway</ogc:Literal>
      </ogc:PropertyIsEqualTo>
    </ogc:Filter>
    <LineSymbolizer>
      <Stroke>
        <CssParameter name="stroke">#FF0000</CssParameter>
        <CssParameter name="stroke-width">4</CssParameter>
      </Stroke>
    </LineSymbolizer>
  </Rule>
  
  <!-- 其他所有道路 -->
  <Rule>
    <Name>Other Roads</Name>
    <ElseFilter/>
    <LineSymbolizer>
      <Stroke>
        <CssParameter name="stroke">#999999</CssParameter>
        <CssParameter name="stroke-width">1</CssParameter>
      </Stroke>
    </LineSymbolizer>
  </Rule>
</FeatureTypeStyle>

5.6.3 渲染顺序控制

使用多个FeatureTypeStyle控制渲染顺序:

<UserStyle>
  <!-- 第一层:填充 -->
  <FeatureTypeStyle>
    <Rule>
      <PolygonSymbolizer>
        <Fill>
          <CssParameter name="fill">#AAFFAA</CssParameter>
        </Fill>
      </PolygonSymbolizer>
    </Rule>
  </FeatureTypeStyle>
  
  <!-- 第二层:边框 -->
  <FeatureTypeStyle>
    <Rule>
      <PolygonSymbolizer>
        <Stroke>
          <CssParameter name="stroke">#006600</CssParameter>
          <CssParameter name="stroke-width">2</CssParameter>
        </Stroke>
      </PolygonSymbolizer>
    </Rule>
  </FeatureTypeStyle>
  
  <!-- 第三层:标注 -->
  <FeatureTypeStyle>
    <Rule>
      <TextSymbolizer>
        <Label>
          <ogc:PropertyName>name</ogc:PropertyName>
        </Label>
      </TextSymbolizer>
    </Rule>
  </FeatureTypeStyle>
</UserStyle>

5.7 CSS样式扩展

5.7.1 CSS样式简介

GeoServer支持CSS样式语言,提供了更简洁的样式定义方式:

/* 点样式 */
* {
  mark: symbol(circle);
  mark-size: 10;
  :mark {
    fill: #FF0000;
    stroke: #000000;
  }
}

/* 线样式 */
* {
  stroke: #0000FF;
  stroke-width: 2;
}

/* 面样式 */
* {
  fill: #00FF00;
  fill-opacity: 0.5;
  stroke: #000000;
}

5.7.2 CSS属性选择器

/* 属性等于 */
[type = 'highway'] {
  stroke: #FF0000;
  stroke-width: 4;
}

/* 属性大于 */
[population > 1000000] {
  fill: #FF0000;
}

/* 属性模糊匹配 */
[name like '%Beijing%'] {
  mark-size: 20;
}

/* 多条件 */
[type = 'primary'][lanes > 2] {
  stroke-width: 4;
}

5.7.3 CSS比例尺条件

/* 在指定比例尺范围内 */
[@scale < 100000] {
  mark-size: 15;
  label: [name];
}

[@scale >= 100000] {
  mark-size: 5;
}

5.7.4 CSS标注

* {
  label: [name];
  font-family: "Arial";
  font-size: 12;
  font-fill: #333333;
  halo-color: white;
  halo-radius: 2;
  label-offset: 0 10;
}

/* 线沿线标注 */
[type = 'road'] {
  label: [name];
  label-follow-line: true;
  label-max-angle-delta: 30;
}

5.7.5 CSS vs SLD

方面 CSS SLD
语法复杂度 简洁 冗长
学习曲线 较低 较高
功能完整性 略有限制 完整
互操作性 GeoServer特有 OGC标准
性能 运行时转换为SLD 直接使用

建议:对于简单样式使用CSS,对于复杂样式或需要互操作性的场景使用SLD。

本章小结

本章详细介绍了GeoServer的地图样式系统:

  1. SLD基础:理解SLD的结构和核心元素
  2. 点样式:学会使用符号和图标渲染点要素
  3. 线样式:掌握线条样式、虚线和套壳线的设计
  4. 面样式:学会填充、图案和分级色彩的应用
  5. 文本标注:掌握标注的字体、位置和冲突处理
  6. 高级样式:理解比例尺依赖和渲染顺序控制
  7. CSS样式:了解CSS样式扩展的使用方法

良好的地图样式设计是制作专业地图的关键。通过灵活运用SLD和CSS,可以创建美观且信息丰富的地图可视化效果。

在下一章中,我们将学习GeoServer的安全管理,包括用户认证、访问控制和数据安全。

思考与练习

  1. 创建一个SLD样式,使用不同颜色渲染不同类型的道路。
  2. 设计一个分级色彩地图,根据人口数量显示不同颜色。
  3. 为点要素添加图标,并实现比例尺依赖的符号大小。
  4. 创建带有文字描边的标注样式。
  5. 将一个SLD样式转换为等效的CSS样式。
  6. 设计一个完整的地图样式,包含道路、建筑和标注。