2012년 11월 28일 수요일

Creating O-D flow maps with GeoServer


이전 포스팅[[Cartography]Flow Map Renderer]에서 ArcGIS for Desktop - ArcMap 기반의 O-D Flow Map 렌더러를 구현한 적이 있다.

GeoTools의 Filter Function을 확장하여 GeoServer에서 SLD Style로 설정하여 사용이 가능하다.

Filter Function의 경우 ArcGIS 렌더러와는 다르게 지도의 축척이나 크기를 알 수 없어, geometry필드, value 필드, 최소값, 최대값, 최대크기, 유형을 파라미터로 입력받아 처리할 수 있도록 하였다.

축척변경에 따른 크기조정이 불가능하나, WPS Process 및 Rendering Transformations 을 이용하면 가능할 듯하다.

다음은 GeoServer Web Administration 페이지에서 OpenLayers로 미리보기 한 샘플이다.

▣ Arrow

▣ Circle

▣ SLD 예 - Function = odflowmap
다음은 위에서 사용된 라인레이어의 SLD 파일 예이다.

<?xml version="1.0" encoding="utf-8"?>
<StyledLayerDescriptor version="1.0.0" ..../1.0.0/StyledLayerDescriptor.xsd">
  <NamedLayer>
    <Name>OD Flow Map</Name>
    <UserStyle>
      <Name>OD Flow Map</Name>
      <FeatureTypeStyle>
        <Rule>
          <ogc:Filter>
            <ogc:And>
              <ogc:PropertyIsGreaterThanOrEqualTo>
                <ogc:PropertyName>O_D</ogc:PropertyName>
                <ogc:Literal>1000</ogc:Literal>
              </ogc:PropertyIsGreaterThanOrEqualTo>
              <ogc:PropertyIsEqualTo>
                <ogc:PropertyName>ADM_CODE_O</ogc:PropertyName>
                <ogc:Literal>11680</ogc:Literal>
              </ogc:PropertyIsEqualTo>
            </ogc:And>
          </ogc:Filter>
          <PolygonSymbolizer>
            <Geometry>
              <ogc:Function name="odflowmap">
                <ogc:PropertyName>the_geom</ogc:PropertyName>
                <ogc:PropertyName>O_D</ogc:PropertyName>
                <ogc:Literal>1000</ogc:Literal>
                <ogc:Literal>8000</ogc:Literal>
                <ogc:Literal>2500</ogc:Literal>
                <ogc:Literal>Arrow</ogc:Literal>
              </ogc:Function>
            </Geometry>
            <Fill>
              <CssParameter name="fill">#FF0000</CssParameter>
              <CssParameter name="fill-opacity">0.9</CssParameter>
            </Fill>
            <Stroke>
              <CssParameter name="stroke">#FFFFFF</CssParameter>
              <CssParameter name="stroke-width">0.1</CssParameter>
              <CssParameter name="fill-opacity">0.1</CssParameter>
            </Stroke>
          </PolygonSymbolizer>
          <LineSymbolizer>
            <Stroke>
              <CssParameter name="stroke">#FF0000</CssParameter>
              <CssParameter name="stroke-width">0.2</CssParameter>
              <CssParameter name="fill-opacity">0.9</CssParameter>
            </Stroke>
          </LineSymbolizer>
         <TextSymbolizer>
           <Label>
             <ogc:PropertyName>O_D</ogc:PropertyName>
           </Label>
           <LabelPlacement>
             <LinePlacement />
           </LabelPlacement>
           <Halo>
             <Radius>1.5</Radius>
             <Fill>
               <CssParameter name="fill">#FFFFFF</CssParameter>
             </Fill>
           </Halo>
           <Fill>
             <CssParameter name="fill">#0000FF</CssParameter>
           </Fill>
           <Font>
             <CssParameter name="font-family">Arial</CssParameter>
             <CssParameter name="font-size">10</CssParameter>
             <CssParameter name="font-style">normal</CssParameter>
             <CssParameter name="font-weight">bold</CssParameter>
           </Font>
           <VendorOption name="followLine">true</VendorOption>
           <VendorOption name="maxAngleDelta">90</VendorOption>
           <VendorOption name="maxDisplacement">400</VendorOption>
         </TextSymbolizer>
        </Rule>
      </FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
</StyledLayerDescriptor>

▣ Download sample data sets & libraries
 - FlowMapforGeoServer.zip