告别繁琐XML!GeoServer+CSS,地图样式居然可以这么简单又强大!

0 阅读8分钟

^ 关注我,带你一起学GIS ^

前言

GeoServer 是一个基于Java的GIS服务器,它使用户能够查看和编辑地理空间数据。GeoServer遵循开放地理空间联盟(OGC)制定的开放标准,在地图创建和数据共享方面提供了极大的灵活性。

文中以GeoServer2.28.2为例进行讲解。

如果你还没有看过,建议从以上内容开始。

1. 软件环境

本文使用如下软件环境,以供参考,因为GeoSever的运行依赖于JDK,所以还需在服务器安装JDK并配置环境变量。

  • GeoServer 使用环境

时间:2026年

系统:Windows 11

openjdk: 17.0.14

GeoServer:3.0-RC

  • GeoServer 默认账号信息

访问地址:http://localhost:8080/geoserver

端口:8080

账户: admin

密码:geoserver

cmd窗口输入java -version命令,检查是否输出JDK版本信息。

如果没有,请先安装JDK。

2. 使用 CSS 语法

Cascading Style Sheet (CSS)  GeoServer扩展用于使用Web开发人员更熟悉的语法来生成SLD文件。使用CSS扩展来定义样式,可以使示例更简洁,更易于理解,并且随时可以查看生成的SLD文件。

2.1. 主要属性

在我们学习CSS样式示例的过程中,需要注意一些关键属性的使用,这是构成SLD文件的核心。

属性名称属性描述
strokeColor (or graphic) for LineString or Polygon border(边线:用于设置线或者面边框颜色)
fillColor (or graphic) for Polygon Fill(填充:用于设置面填充颜色)
markWell-known Mark or graphic used for Point(标注:用于标记点)
labelText expression labeling(标签:用于文字标注)
halo-radiusSize of halo used to outline label(晕圈:用于设置标签晕圈大小)

使用这些关键属性和"*"选择器,你就能实现矢量数据的可视化。

例如,以下是一个关键属性stroke,它为线条或多边形数据提供了一种灰色表现形式:

* {
  stroke: gray;
}

以下是为多边形数据提供蓝色填充的关键属性fill

* {
  fill: #2020ED;
}

以下是一个关键属性mark,展示了使用正方形标注点数据:

*{
  mark: symbol(square)
}

以下是一个关键属性label,展示了如何使用要素名称标注CITY_NAME属性。

*{
  label:[CITY_NAME]
}

以下是一个关键属性halo-radius,展示了如何文字标签生成晕眩半径。

*{
  label:[CITY_NAME]
    halo-radius:2.5
}

2.2. 语法规则

如上已经演示了由单一规则构成的CSS样式:

*{
  mark: symbol(circle)
}

可以设置只适用于特定FeatureType的规则。

populated_places {
  mark: symbol(triangle);
}

也可以制定一个包含多条规则的样式,为每条规则精心选择选择器。在本例中,我们使用选择器为首都城市设置带星号的样式,为非首都城市设置带圆圈的样式:

[ FEATURECLA = 'Admin-0 capital' ] {
  mark: symbol(star);
  mark-size: 6px;
}

[ FEATURECLA <> 'Admin-0 capital' ] {
  mark: symbol(circle);
  mark-size: 6px;
}

上述执行的特征属性测试使用了约束查询语言(Constraint Query Language (CQL))。这种语法可用于定义筛选条件以选择内容,类似于使用SQL的WHERE语句。它还可以用于定义表达式以访问属性值,从而在定义样式属性时使用这些属性值。

规则选择器也可以根据渲染引擎的状态来触发。在本例中,我们仅在满足指定比例尺条件时显示标签:

[@scale < 20000000] {
  label: [ NAME ];
}

在上述示例中,标签是使用CQL表达式NAME定义的。这产生了一种动态样式,该样式会根据具体情况逐一生成每个标签,并用特征属性NAME填充标签。

2.3. 使用 CSS 级联

在上述示例中的特性属性选择中,重复了信息。可以利用CSS层叠,将共有的属性提取到一个公共规则中:

[ FEATURECLA = 'Admin-0 capital' ] {
  mark: symbol(star);
}

[ FEATURECLA <> 'Admin-0 capital' ] {
  mark: symbol(circle);
}

* {
  mark-size: 6px;
}

2.4. 使用伪类选择器

到目前为止,以上内容一直在对单个特征进行样式化,并记录每个形状是如何表示的。

当形状以符号形式呈现时,将会面临第二个挑战:记录符号的颜色和外观

CSS扩展提供了一个伪选择器,允许将更多属性应用于符号。

以下是使用伪类选择器的示例:

* {
  mark: symbol(circle);
}

:mark {
  fill: black;
  stroke: white;
}

在此示例中,使用了:mark伪选择器来选择圆圈标记,并在渲染时为其提供了填充描边

以下是伪类选择器及其渲染内容。

伪类选择器应用特征
:markpoint markers
:strokestroke patterns
:fillfill patterns
:shieldlabel shield
:symbolany use

上述伪类选择器适用于所有符号,但具体来说,可以使用语法nth-symbol(1)

* {
  mark: symbol(circle);
}

:nth-mark(1) {
  fill: black;
  stroke: white;
}

3. CSS 与 SLD 样式比较

CSS扩展基于相同的GeoServer渲染引擎构建,可访问SLD的所有功能(以及用于精细控制标签的供应商选项)。这两种方法使用的术语略有不同:SLD使用地图专业人员熟悉的术语,而CSS则使用网页开发人员熟悉的术语。

3.1. SLD 样式

SLD利用一系列规则来选择要显示的内容。内容是通过支持属性、空间和时间查询的过滤器来选择的。

一旦选定,内容将被转换为某种形状,并使用符号化器进行绘制。符号化器通过CSS属性进行配置,以记录如fillopacity等设置。

内容可以由多条规则共同绘制,从而产生一系列效果。

以下是一个SLD文件示例。

<?xml version="1.0" encoding="ISO-8859-1"?>
<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>airports</Name>
    <UserStyle>
      <Title>Airports</Title>
      <FeatureTypeStyle>
        <Rule>
          <Name>airports</Name>
          <Title>Airports</Title>
          <PointSymbolizer>
            <Graphic>
              <ExternalGraphic>
                <OnlineResource xlink:type="simple"
                  xlink:href="airport.svg" />
                <Format>image/svg</Format>
              </ExternalGraphic>
              <ExternalGraphic>
                <OnlineResource xlink:type="simple"
                  xlink:href="airport.png" />
                <Format>image/png</Format>
              </ExternalGraphic>
              <Mark>
                <WellKnownName>triangle</WellKnownName>
                <Fill>
                  <CssParameter name="fill">#000000</CssParameter>
                </Fill>
                <Stroke>
                  <CssParameter name="stroke">#FFFFFF</CssParameter>
                  <CssParameter name="stroke-opacity">0.50</CssParameter>
                </Stroke>
              </Mark>
              <Size>16</Size>
            </Graphic>
          </PointSymbolizer>
        </Rule>
      </FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
</StyledLayerDescriptor>

3.2. CSS 样式

CSS也可以利用规则,每条规则都利用选择器来筛选要显示的内容。每个选择器都使用一个支持属性、空间和时间查询的CQL过滤器。一旦被选中,就会使用CSS属性来描述内容的呈现方式。

内容不会由多条规则共同绘制。当内容满足多条规则的条件时,会使用一种称为继承的过程来合并生成的属性。这种为特定情况细化通用规则的技术,正是层叠样式表(Cascading Style Sheet)中“层叠”概念的来源。

以下是使用CSS的示例。

* {
  mark: url(airport.svg);
  mark-mime: "image/svg";
}

在此规则中,选择器"*"用于匹配所有内容。该规则定义了表明如何对此内容进行样式设置的属性。 属性mark用于表明希望将此内容绘制为

属性值url(airport.svg)是一个指向影像文件的URL地址,用于表示么个点。属性mark-mime表示影像文件期望格式。

4. 实践操作

打开GeoServer主界面,导航到样式界面,点击添加一个新样式。

在新建样式界面填写样式名称,并选择格式为CSS。

  • 样式名称:newCSS
  • 工作空间:可以不选
  • 样式格式:CSS

刚开始时不知道怎么写,可以在样式内容中选择生成默认样式选项,这里以点样式为例进行演示。首先选择要生成的样式类型,如Point,然后点击Generate

样式编辑区便会生成如下CSS代码。

/* @title dark orange point */
* {
    mark: symbol(square);
    mark-size: 6px;
    :mark {
        fill: #ff9900;
    }
}

之后点击验证,下方提示栏无报错,则可以点击保存或者采用。

点击图层预览可以看到图层显示效果。

点击预览的图层名称,会弹出选择预览图层对话框,可以再次选择目标图层进行渲染。

在代码编辑器中添加如下样式。

* {
  mark: symbol(triangle);
}

:mark{
  fill:red;
  stroke:1px solid #000;
  fill-opacity:0.35;
  stroke-opacity:0.25
}

此时图层显示效果如下。

参考资料

GIS之路 开发示例数据下载,请在公众号后台回复:vector

全国信息化工程师-GIS 应用水平考试资料,请在公众号后台回复:GIS考试


GIS之路 公众号已经接入了智能助手**,** 可以在对话框进行提问,也可以直接搜索历史文章进行查看。

都看到这了,不要忘记点赞、收藏 + 关注

本号不定时更新有关 GIS开发 相关内容,欢迎关注 !