2011년 7월 13일 수요일

[GeoServer]X, Y 필드를 포함한 테이블을 레이어로 퍼블리싱 하기

GeoServer에서는 물리적으로 존재하는 레이어나 테이블을 이용하여 Virtual Table을 구성해서 레이어를 퍼블리싱 할 수 있는 확장기능이 있습니다.
자세한 내용은 아래를 참고하세요.

SQL views - http://docs.geoserver.org/latest/en/user/data/sqlview.html

아래 예제는 이를 조금 확장하여 X, Y 필드를 포함한 테이블을 포인트 레이어로 퍼블리싱 하는 방법을 설명합니다.

◎ 가정
 - 다음과 같이 PostgreSQL(+PostGIS)의 테이블 중 lon(경도, x좌표값으로 가정), lat(위도, y좌표값으로 가정) 필드를 포함하는 테이블이 있습니다.
 - 2011년 7월 4일자 기상청 제공 지진발생현황테이블 엑셀파일

○ PostgreSQL 샘플 테이블 스키마
CREATE TABLE public.earthquake
(
  rgn character varying(10),
  t_year integer,
  et date,
  em numeric,
  lon numeric,
  lat numeric,
  loc character varying(200),
  fin_udt character varying(8)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE public.earthquake OWNER TO postgres;

◎ GeoServer에서 퍼블리싱하기
우선 PostGIS DataStore를 추가합니다. GeoServer에서 DataStore를 추가하는 방법은 아래 포스팅을 참고하세요
 - GeoServer 2.0.0 설치 및 활용 가이드

Layers - Add a new resource를 선택 후 다음과 같이 X, Y 필드값이 포함된 테이블을 확인 후 스키마정보를 미리 확인합니다. 대상 테이블은 경위도 좌표값이 포함된 earthquake 테이블입니다.
위 그림에서 earthquake 테이블의 publish 버튼을 누르지 않고 [Configure new SQL view...]라는 링크를 클릭합니다.

다음 그림과 같이 View Name과 SQL Statemeht를 입력합니다. 필드 이름은 테이블 스키마에 맞게 수정하시면 됩니다. 필요하다면 SQL Statement에서 GeoServer 도움말에 제시된 Where절 및 파라미터화된 SQL을 사용할 수 있습니다.

- View Name = earthquake_point
- SQL Statemeht

SELECT ST_SetSRID(ST_Point(lon, lat),4326) as the_geom, rgn, t_year, et, em, loc FROM earthquake



여기에서 ST_Point는 X, Y 값을 이용해서 Point를 만드는 PostGIS 공간함수, ST_SetSRID는 Geometry에 좌표체계를 등록하는 공간함수입니다.


Attributes 탭에서 Guess geometry type and srid 체크박스를 체크한 후 Refresh 버튼을 누르면 위 그림과 같이 속성필드값이 추가됩니다. 여기에서 위 그림처럼 the_geom의 Type을 Point, SRID=4326(원본 테이블의 X, Y값을 WGS84 경위도로 가정)을 입력합니다.

Save 버튼을 누르면 아래와 같이 Edit Layer 화면이 나타납니다. 이후 과정은 일반적인 레이어 추가과정이므로 생략합니다.

이후 아래 그림과 같이 Edit Layer 탭의 [Edit sql view] 기능을 이용해서 언제든지 SQL을 편집할 수 있습니다.
다음은 Layer Preview 기능을 사용하여 등록된 레이어를 미리보기한 이미지입니다.

이상으로 간단하게 X, Y 필드값을 가진 속성테이블을 레이어로 퍼블리싱하는 과정을 살펴보았습니다.

성능이 허락하는 한 이 외에도 DBMS가 가진 Spatial Function을 이용하여 속성테이블을 레이어로 퍼블리싱하는 방법들이 있습니다. X, Y 필드값과 버퍼거리 필드값 등을 이용해서 폴리곤(ST_Buffer 활용 등)으로 퍼블리싱하는 등이 그 예라 할 수 있겠습니다.