GIS

[Geoserver] WMS 스타일 : 라벨 문자열 합치는 방법 ( feat. Function )

모찌바라기 2023. 8. 25. 12:27
728x90
반응형

 

Geoserver에서 라벨을 표현할 때, 컬럼 + 컬럼 또는 문자열 + 컬럼과 같이 문자열을 합쳐서

표현 해야 할 때가 있다.

 

그럴때 Geoserver에서 제공하는 Function중 concatenate를 활용하면 쉽게 해결 가능하다.

 

 

 

기본 설명코드

<!-- Function 선언 name속성은 concatenate -->
<ogc:Function name="concatenate">
  	<!-- Function내에 연결하고 싶은 컬럼 및 문자열 정의 -->
    
    <!-- 연동 된 테이블에서 가져올 컬럼명 : <PropertyName> -->
    <ogc:PropertyName>column1</ogc:PropertyName>
    <!-- 일반 문자열 : <Literal> -->
    <ogc:Literal>일반문자열</ogc:Literal>
</ogc:Function>

 

샘플코드

<ogc:Function name="concatenate">
    <!-- 첫 번째 컬럼 -->
    <ogc:PropertyName>column1</ogc:PropertyName>
    <ogc:Literal>(</ogc:Literal>
    <!-- 두 번째 컬럼 -->
    <ogc:PropertyName>column2</ogc:PropertyName>
    <ogc:Literal>)</ogc:Literal>
</ogc:Function>

 

 

전체 샘플코드

<?xml version="1.0" encoding="UTF-8"?>
<StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd" version="1.1.0" xmlns:ogc="http://www.opengis.net/ogc" xmlns:se="http://www.opengis.net/se" xmlns:xlink="http://www.w3.org/1999/xlink">
  <NamedLayer>
    <se:Name>sample_layer</se:Name>
    <UserStyle>
      <se:Name>sample_layer</se:Name>
      <se:FeatureTypeStyle>
        <se:Rule>
          <se:Name>Single sample_layer</se:Name>
          <se:MinScaleDenominator>0</se:MinScaleDenominator>
          <se:MaxScaleDenominator>750000</se:MaxScaleDenominator>
          <se:PolygonSymbolizer>
            <se:Fill>
              <se:SvgParameter name="fill">#e10fbe</se:SvgParameter>
            </se:Fill>
            <se:Stroke>
              <se:SvgParameter name="stroke">#010101</se:SvgParameter>
              <se:SvgParameter name="stroke-width">1</se:SvgParameter>
              <se:SvgParameter name="stroke-linejoin">bevel</se:SvgParameter>
            </se:Stroke>
          </se:PolygonSymbolizer>
        </se:Rule>
        <se:Rule>
          <se:MinScaleDenominator>0</se:MinScaleDenominator>
          <se:MaxScaleDenominator>750000</se:MaxScaleDenominator>
          <se:TextSymbolizer>
            <se:Label>
              <ogc:Function name="concatenate">
                  <!-- 첫 번째 컬럼 -->
                  <ogc:PropertyName>dan_name</ogc:PropertyName>
                  <ogc:Literal>(</ogc:Literal>
                  <!-- 두 번째 컬럼 -->
                  <ogc:PropertyName>id</ogc:PropertyName>
                  <ogc:Literal>)</ogc:Literal>
              </ogc:Function>
            </se:Label>
            <se:Font>
              <se:SvgParameter name="font-family">Gulim</se:SvgParameter>
              <se:SvgParameter name="font-size">13</se:SvgParameter>
            </se:Font>
            <se:LabelPlacement>
              <se:PointPlacement>
                <se:AnchorPoint>
                  <se:AnchorPointX>0</se:AnchorPointX>
                  <se:AnchorPointY>0.5</se:AnchorPointY>
                </se:AnchorPoint>
              </se:PointPlacement>
            </se:LabelPlacement>
            <se:Fill>
              <se:SvgParameter name="fill">#000000</se:SvgParameter>
            </se:Fill>
            <se:VendorOption name="maxDisplacement">1</se:VendorOption>
            <se:VendorOption name="conflictResolution">false</se:VendorOption>
          </se:TextSymbolizer>
        </se:Rule>
      </se:FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
</StyledLayerDescriptor>

 

 

위와 같이 주면 아래와 같이 column1(column2)와 같이 라벨이 표현된다.

여기서 column1와 column2는 DB내에 있는 컬럼이고 '('와 ')'는 리터럴, 즉 일반 문자열이다.

 

 

 

결과물

 

 

 

728x90
반응형