O SLD fornece a capacidade de fazer referência a várias camadas de um único GeoServer usando NamedLayers. Atualmente, este recurso é suportado pelo GetMap no GeoServer (usando um URL de estilo externo na sua solicitação GetMap).

Esta proposta que foi implementada a partir da versão 2.12.0, torna essa funcionalidade do SLD multicamada acessível a uma gama mais ampla de usuários através de uma modificação na camada do GeoServer e no modelo de dados do grupo de camadas. Ela permite que um LayerGroup contenha Layers, LayerGroups e StyleGroups (onde um grupo de estilos é definido pelo arquivo SLD associado).

Veja abaixo um exemplo de um SLD de várias camadas, como atualmente suportado pelo GeoServer:

<?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'
  xmlns:xlink='http://www.w3.org/1999/xlink' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
  xsi:schemaLocation='http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd'>
  <NamedLayer>
    <Name>topp:tasmania_water_bodies</Name>
    <UserStyle>
      <Title>Blue lake</Title>
      <Abstract>A blue fill, solid black outline style</Abstract>
      <FeatureTypeStyle>
        <Rule>
          <Name>name</Name>
          <PolygonSymbolizer>
            <Fill>
              <CssParameter name='fill'>
                <ogc:Literal>#f0f0C0</ogc:Literal>
              </CssParameter>
              <CssParameter name='fill-opacity'>
                <ogc:Literal>1.0</ogc:Literal>
              </CssParameter>
            </Fill>
            <Stroke>
              <CssParameter name='stroke'>
                <ogc:Literal>#000000</ogc:Literal>
              </CssParameter>
              <CssParameter name='stroke-linecap'>
                <ogc:Literal>butt</ogc:Literal>
              </CssParameter>
              <CssParameter name='stroke-linejoin'>
                <ogc:Literal>miter</ogc:Literal>
              </CssParameter>
              <CssParameter name='stroke-opacity'>
                <ogc:Literal>1</ogc:Literal>
              </CssParameter>
              <CssParameter name='stroke-width'>
                <ogc:Literal>1</ogc:Literal>
              </CssParameter>
              <CssParameter name='stroke-dashoffset'>
                <ogc:Literal>0</ogc:Literal>
              </CssParameter>
            </Stroke>
          </PolygonSymbolizer>
        </Rule>
      </FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
  <NamedLayer>
    <Name>topp:tasmania_roads</Name>
    <UserStyle>
      <Title>Default Styler for simple road segments</Title>
      <Abstract>Light red line, 2px wide</Abstract>
      <FeatureTypeStyle>
        <Rule>
          <Title>Roads</Title>
          <LineSymbolizer>
            <Stroke>
              <CssParameter name='stroke'>
                <ogc:Literal>#AA3333</ogc:Literal>
              </CssParameter>
              <CssParameter name='stroke-width'>
                <ogc:Literal>2</ogc:Literal>
              </CssParameter>
            </Stroke>
          </LineSymbolizer>
        </Rule>
      </FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
</StyledLayerDescriptor>

O documento acima define um estilo para um mapa inteiro, geralmente não usamos o SLD desta forma no GeoServer – mas a funcionalidade é suportada pelas operações do WMS GetMap conforme exemplo apresentado abaixo:

http://localhost:8080/geoserver/topp/wms?
  service=WMS&
  version=1.1.0&
  request=GetMap&
  SLD=http://localhost:8080/geoserver/styles/multilayer_style.sld&
  bbox=145.19754,-43.423512,148.27298000000002,-40.852802&
  width=768&
  height=641&
  srs=EPSG:4326&
  format=application/openlayers

Usando o Grupo de estilos

1. Crie (ou carregue) um novo arquivo SLD contendo vários NamedLayers e estilos associados (você pode se basear no exemplo descrito acima). Para os propósitos deste exemplo, esse arquivo será denominado “multilayer_style”

2. Adicione um novo grupo de camadas (chamado “lg_stylegroup”) e crie um grupo de estilos dentro dele.

2.1. Para fazer isso usando a interface do usuário, vá à página “Grupos de camadas”, clique em adicionar grupo de camadas e preencha os detalhes. Para adicionar o grupo de estilos, clique em “Novo grupo de estilos”. Defina o estilo para esta entrada como “multilayer_style”. Associe seu estilo a este grupo de estilos e salve o grupo de camadas.

2.2 Caso opte por usar a API REST, o POST para o /layergroups deve ser da seguinte forma:

<layerGroup>
  <name>lg_stylegroup</name>
  <layers>
    <layer></layer>
  </layers>
  <styles>
    <style>multilayer_style</style>
  </styles>
</layerGroup>

2.3 Opcionalmente, você pode adicionar camadas e grupos de camada ao grupo de camada “lg_stylegroup” ao lado do grupo de estilos.

3. Agora você poderá referenciar “lg_stylegroup” na lista de LAYERS de uma solicitação WMS. Isso renderizará uma camada usando as camadas e os estilos definidos no “estilo multicamada”. Ao contrário do uso do parâmetro SLD, você pode usar camadas adicionais ao lado desta. Por exemplo, você pode definir um mapa base usando um grupo de estilo e renderizar camadas adicionais em cima dele.

Como outros grupos de camadas, você também pode ver isso usando a visualização da camada.

Compatibilidade com versões anteriores

Esta alteração é somente um aditivo, portanto, não deve haver problemas de compatibilidade com versões anteriores.

Fonte: GSIP-161