经纬志
首页 / 实战手册 / 服务端与发布

SLD 传上去了,地图还是默认灰色

先看结论

在 GeoServer 里上传了 SLD,预览页面能看到效果,自己的 WMS 请求出来还是那套默认灰填充。

最后验证 2026-11-03 · 多技术栈 · 更新 2026-10-29 · 引用本文

现象

GeoServer 日志中出现:

2026-10-29 11:03:12,441 WARN [geoserver.wms] -
No such style: roads_style
2026-10-29 11:03:12,443 INFO [geoserver.wms] -
Requested style roads_style is not available, using default style instead

返回的图片是 GeoServer 自动生成的灰色多边形,没有任何自定义颜色。

原因

原因说明
样式名缺少工作区前缀应写 workspace:roads_style
样式未设为该图层默认不传 STYLES 时用默认灰样式
SLD 命名空间版本不匹配1.0.0 与 1.1.0 的元素名不同
属性名拼错过滤器读不到字段,规则全部不命中
几何类型不符线样式套在多边形图层上,直接不绘制

排查过程

  1. 请求 GetCapabilities,搜索图层节点下的 <Style>,确认样式名与是否默认。
  2. 在日志里搜 Requested style,确认实际生效的是哪一个。
  3. 用 DescribeFeatureType 核对属性名大小写。
curl "http://127.0.0.1:8080/geoserver/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities" \
  | grep -A 6 "<Layer>" | grep -E "Name|Style"

解决方案

请求时带完整样式名,工作区不能省:

GET /geoserver/wms?
  SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap
  &LAYERS=workspace:roads
  &STYLES=workspace:roads_style
  &SRS=EPSG:3857&BBOX=...&WIDTH=512&HEIGHT=512
  &FORMAT=image/png

最省事的做法是把样式设为图层默认,这样前端不必每次拼样式名:

curl -u admin:password -X PUT \
  "http://127.0.0.1:8080/geoserver/rest/workspaces/workspace/datastores/roads/file.shp/layers/roads" \
  -H "Content-Type: application/json" \
  -d '{"layer":{"defaultStyle":{"name":"roads_style"}}}'

上传 SLD 时确认根元素与命名空间对应版本。1.0.0 用 StyledLayerDescriptor 无前缀,1.1.0 需要 sld: 前缀:

<sld:StyledLayerDescriptor version="1.1.0"
    xmlns:sld="http://www.opengis.net/sld"
    xmlns:ogc="http://www.opengis.net/ogc">
  <sld:NamedLayer>
    <sld:Name>workspace:roads</sld:Name>
    <sld:UserStyle>
      <sld:Name>roads_style</sld:Name>
      <sld:FeatureTypeStyle>
        <sld:Rule>
          <sld:LineSymbolizer>
            <sld:Stroke>
              <sld:CssParameter name="stroke">#2b8a3e</sld:CssParameter>
              <sld:CssParameter name="stroke-width">2</sld:CssParameter>
            </sld:Stroke>
          </sld:LineSymbolizer>
        </sld:Rule>
      </sld:FeatureTypeStyle>
    </sld:UserStyle>
  </sld:NamedLayer>
</sld:StyledLayerDescriptor>

用过滤器按属性着色时,属性名必须与 DescribeFeatureType 完全一致, 大小写敏感:

<ogc:Filter>
  <ogc:PropertyIsEqualTo>
    <ogc:PropertyName>road_class</ogc:PropertyName>
    <ogc:Literal>highway</ogc:Literal>
  </ogc:PropertyIsEqualTo>
</ogc:Filter>

验证

单张 GetMap 返回的图片颜色与 SLD 中定义一致。 日志里出现 Requested style ... is not available 消失。 GetCapabilities 中该样式标记为默认。

先看日志再改 SLD:GeoServer 明确写了“用了默认样式”, 说明样式文件本身可能没问题,问题在名字或默认设置上。

引用本文

经纬志(2026)。《SLD 传上去了,地图还是默认灰色》。https://www.jingweizhi.com/cookbook/geoserver-sld-not-applied.html(访问日期 2026-11-03)。