2013년 8월 20일 화요일

GeoServer Chart Extension 소개

OGC SLD(Styled Layer Descriptor)를 사용하여 차트 심볼을 설정하기는 어렵습니다.

GeoServer는 이를 위해 External References(PointSymbolizer의 ExternalGraphic)를 이용한 차트 익스텐션을 제공합니다.

Google Charts API 사용법과 같으므로 구글 차트 API를 이용해 본 경험자라면 쉽게 이해할 수 있을 듯 합니다.

구글 차트 API의 모든 파라미터를 지원하지는 않지만 SLD를 잘 적용하면 멋진 통계지도 서비스가 가능하리라 봅니다.

▣ Sample data & sld files
 - shapefile : https://www.dropbox.com/s/31cay65nr1v9yzm/admin_sgg.zip
 - pichart sld : https://www.dropbox.com/s/8nmvx9edqmpxojo/admin_sgg_pichart.sld
 - barchart sld : https://www.dropbox.com/s/d27kdv5lrgo55gl/admin_sgg_barchart.sld
 - shapefile에는 cnt_eve, cnt_sub, cnt_sto, pop_den 필드(numeric)가 있음

▣ Pi Chart
아래 이미지는 위 pichart sld를 적용한 결과이며 바탕, 파이 차트, 레이블 3가지의 룰을 사용했습니다.
차트 크기는 pop_den이라는 필드를, 차트 데이터는 cnt_eve, cnt_sub, cnt_sto 필드를 사용하며, 차트 데이터의 경우 여러 필드의 연산을 적용해도 됩니다.

▣ Pi Chart SLD

<Rule>
  <Name>Chart</Name>
  <MinScaleDenominator>100</MinScaleDenominator>
  <MaxScaleDenominator>500000</MaxScaleDenominator>
  <PointSymbolizer>
    <Graphic>
      <ExternalGraphic>
        <OnlineResource
          xlink:href="http://chart?cht=p&amp;chd=t:${cnt_eve},${cnt_sub},${cnt_sto}&amp;chco=FF0000,00FF00,0000FF&amp;chf=bg,s,FFFFFF00" />
        <Format>application/chart</Format>
      </ExternalGraphic>
      <Size>
        <ogc:Add>
          <ogc:Literal>20</ogc:Literal>
          <ogc:Mul>
            <ogc:Div>
              <ogc:PropertyName>pop_den</ogc:PropertyName>
              <ogc:Literal>35000.0</ogc:Literal>
            </ogc:Div>
            <ogc:Literal>60</ogc:Literal>
          </ogc:Mul>
        </ogc:Add>
      </Size>
    </Graphic>
  </PointSymbolizer>
</Rule>

▣ Bar Chart
아래 바 차트 외에 스택 차트도 지원합니다. 아래 SLD에서 cht=bvg 옵션을 구글 API를 참고하여 변경하면 됩니다.

▣ Bar Chart SLD
<Rule>
  <Name>Chart</Name>
  <MinScaleDenominator>100</MinScaleDenominator>
  <MaxScaleDenominator>500000</MaxScaleDenominator>
  <PointSymbolizer>
    <Graphic>
      <ExternalGraphic>
        <OnlineResource
          xlink:href="http://chart?cht=bvg&amp;chd=t:${cnt_eve}|${cnt_sub}|${cnt_sto}&amp;chco=FF0000,00FF00,0000FF&amp;chf=bg,s,FFFFFF00" />
        <Format>application/chart</Format>
      </ExternalGraphic>
      <Size>
        <ogc:Add>
          <ogc:Literal>50</ogc:Literal>
          <ogc:Mul>
            <ogc:Div>
              <ogc:PropertyName>pop_den</ogc:PropertyName>
              <ogc:Literal>25000.0</ogc:Literal>
            </ogc:Div>
            <ogc:Literal>60</ogc:Literal>
          </ogc:Mul>
        </ogc:Add>
      </Size>
    </Graphic>
  </PointSymbolizer>
</Rule>

▣ 참조
  - http://blog.geoserver.org/2009/06/01/geoserver-chart-extension/
  - http://blog.geoserver.org/2008/12/08/dynamic-symbolizers-part-1/
  - https://developers.google.com/chart/image/docs/chart_params