GIS/OpenLayers

[OpenLayers] WMS 와 WFS

미니미니22 2024. 11. 19. 22:29

OpenLayers에서 WMS, WFS의 사용 목적

WMS와 WFS는 지리공간 데이터를 제공하고 공유하기 위한 표준 프로토콜이다. 각각의 역할과 작동 방식을 이해하고 개발을 해보자

 

1. WMS (Web Map Service)

  • 지도 위에 이미지로 데이터 표시
    • JPEG, PNG, GIF 등의 이미지 형식으로 데이터를 반환하며, 지리공간 데이터를 렌더링하여 사용자에게 보여준다
    • 지도 타일을 제공하며, 배경 지도나 정적 데이터 시각화에 주로 사용
  • 특징
    • 이미지 기반 : 데이터를 요청하면 서버에서 지도를 이미지로 생성하여 반환
    • 표준 요청 : GetMap, GetCapabilities, GetFeatureInfo 요청을 통해 작동
      • GetCapabilities : 사용 가능한 레이어와 설정 정보 조회
      • GetMap : 특정 영역의 지도 이미지 반환
      • GetFeatureInfo : 클릭한 위치의 속성 정보를 요청
  • 장점
    • 이미지로 제공되므로 클라이언트에서 별도의 렌더링이 필요 없다
    • 데이터 보안이 비교적 용이하다(원본은 사용자에게 공개x)
  • 단점
    • 사용자와의 상호작용이 제한적
    • 대규모 데이터를 처리하거나 수정하기에는 부적합

 

2. WFS (Web Feature Service)

  • 벡터 데이터를 제공하는 서비스
    • 데이터 자체를 GeoJSON, GML 등의 벡터 형식으로 반환하며, 사용자 애플리케이션에서 데이터를 수정하거나 분석할 수 있다
  • 특징
    • 데이터 기반 : 공간 객체(Features)와 속성 정보를 직접 반환
    • 표준 요청 : GetCapabilities, DescribeFeatureType, GetFeature 등을 사용
      • GetCapabilities: 서비스 기능과 데이터 제공 범위를 조회
      • DescribeFeatureType: 특정 데이터의 스키마(구조) 조회
      • GetFeature: 지정된 조건에 맞는 공간 데이터를 반환
  • 장점
    • 사용자가 데이터를 분석하거나 커스터마이징할 수 있다
    • 상호작용이 가능한 애플리케이션 개발이 가능하다
    • 데이터를 실시간으로 업데이트하고, 사용자가 데이터를 수정할 수도 있다
  • 단점
    • 서버와 클라이언트 모두에서 벡터 데이터를 처리해야 하므로 더 많은 리소스가 필요
    • 대규모 데이터를 처리할 때 속도 저하가 발생할 수 있다
특징 WMS WFS
데이터 형식 이미지 (PNG, JPEG 등) 벡터 데이터 (GeoJSON, GML 등)
상호작용 제한적 가능 (데이터 편집 및 질의 지원)
사용 사례 배경 지도, 정적 지도 시각화 데이터 분석, 사용자 정의 기능 개발
성능 상대적으로 빠름 데이터량에 따라 느려질 수 있음

 

즉, WMS는 '보여주기', WFS는 '데이터 다루기' 에 특화되어 있어 목적에 맞게 사용한다.

 

WMS 사용 예시

// WMS 레이어 추가
const wmsLayer = new TileLayer({
  source: new TileWMS({
    url: 'https://example.com/geoserver/wms', // WMS 서버 URL
    params: {
      LAYERS: 'your-layer-name', // 원하는 레이어 이름
      TILED: true,
      FORMAT: 'image/png',
    },
    serverType: 'geoserver', // GeoServer 또는 사용 중인 서버 종류
  }),
});

const map = new Map({
  target: 'map', // HTML의 div ID
  layers: [
    new TileLayer({
      source: new TileWMS({
        url: 'https://example.com/geoserver/wms',
        params: { LAYERS: 'base-layer', TILED: true },
      }),
    }),
    wmsLayer, // WMS 레이어 추가
  ],
  view: new View({
    center: [0, 0], // 초기 중심점 (EPSG:3857 좌표계)
    zoom: 2, // 초기 줌 레벨
  }),
});

 

WFS 사용 예시

// WFS 데이터를 벡터 레이어로 로드
const wfsLayer = new VectorLayer({
  source: new VectorSource({
    format: new GeoJSON(),
    url: function (extent) {
      return (
        'https://example.com/geoserver/wfs?' + // WFS 서버 URL
        'service=WFS&' +
        'version=1.1.0&' +
        'request=GetFeature&' +
        'typename=your-layer-name&' + // 원하는 레이어 이름
        'outputFormat=application/json&' +
        'srsname=EPSG:3857&' + // 좌표계 설정
        'bbox=' + extent.join(',') + ',EPSG:3857'
      );
    },
    strategy: function () {
      // 요청 전략 설정 (기본값 사용)
      return [];
    },
  }),
  style: new Style({
    fill: new Fill({ color: 'rgba(0, 0, 255, 0.1)' }),
    stroke: new Stroke({ color: '#0000ff', width: 2 }),
  }),
});

const map = new Map({
  target: 'map', // HTML의 div ID
  layers: [wfsLayer], // WFS 레이어 추가
  view: new View({
    center: [0, 0], // 초기 중심점
    zoom: 2, // 초기 줌 레벨
  }),
});

 

 

  • WMS는 TileLayer와 TileWMS를 사용하여 이미지를 가져온다
  • WFS는 VectorLayer와 VectorSource를 사용해 벡터 데이터를 가져오고, 데이터를 렌더링하기 위해 GeoJSON 형식 변환이 필요하다

 

 

'GIS > OpenLayers' 카테고리의 다른 글

[OpenLayers] GIS 오픈소스, OpenLayers  (1) 2024.11.19