다운로드
Oracle Database
Confluence Geoserver Release 1.5
Google Earth version 3.0+
샘플 코드
  TAGS
spatial, gis, All

Oracle Spatial과 Google Earth의 통합


저자 - Justin Lokitz

Oracle Locator/Oracle Spatial, GeoServer, Google Earth를 이용하여 유연하고 강력한 로케이션 기반 BI 시스템을 구현하는 방법을 배워 보십시오.

게시일: 2007년 7월

로케이션(location) 테크놀로지가 바야흐로 만개하고 있습니다. 사람들은 Google Earth에서 자신의 집 주소를 검색하거나, GPS 기반 휴대폰으로 자녀들의 위치를 추적하거나, 엔터프라이즈 오라클 아키텍처에 내장된 로케이션 기반 기능을 활용하기도 합니다. 이제는 단순히 사람들이 로케이션 테크놀로지에 관심을 갖는 단계를 넘어서서 우리의 삶과 비즈니스가 이 기술에 의존하는 시대로 접어든 듯 합니다. 하지만 새로 각광받기 시작하는 기술들이 대개 그러하듯, 기술적 선택의 폭이 넓어질 수록 데이터 포맷의 종류와 복잡성 또한 증가합니다. 오픈 소스 커뮤니티가 필요한 이유가 바로 여기에 있습니다.

지오스페이셜(geospatial) 테크놀로지의 오픈 소스 커뮤니티는 다른 오픈 소스 커뮤니티들과 크게 다르지 않습니다. 이들은 상용 애플리케이션 환경이 초래한 간극을 극복할 수 있는 강력하고 편리한 프레임워크와 테크놀로지를 구현한다는 공통의 목표를 가진 학자, 엔지니어, 아키텍트들로 구성됩니다.

그 대표적인 예로 Confluence GeoServer가 있습니다. GeoServer는 서로 다른 환경의 지오스페이셜 데이터 소스들을 연결하기 위한 오픈 소스 서버로서 서로 다른 환경의 사용자들이 데이터를 공유할 수 있게 합니다. GeoServer의 개발자들은 자신들이 진행 중인 프로젝트를 지오스페이셜 웹 환경을 위한 이상적인 "매개체(glue)"임을 자부하고 있습니다.

GeoServer는 놀라울 만큼 단순한 원칙에 기반하고 있습니다. 이런 경우를 한 번 가정해 봅시다. Oracle Spatial 데이터베이스에 저장된 정보를 Google Earth와 같은 다른 소프트웨어 패키지에서 사용할 수 있도록 배포하려 합니다. 이를 위해서는 XML 스타일시트나 그 밖의 다른 출력 프로세스를 정의하여 소스 데이터를 KML(Google Earth의 표준 마크업 언어)로 변환해야 합니다. 하지만 이 작업을 효과적으로 수행하기 위해서는 알려진 모든 지오메트리 타입과 지오메트리 관련 데이터/메타데이터를 고려해야 합니다. (이것은 매우 중요한 문제입니다.)

일회성으로 그치는 프로젝트라면 이 정도로도 충분합니다. 하지만 내부적으로 개발한 변환 엔진을 여러 가지 데이터 셋과 데이터 엔진에 적용하려면, 먼저 내부 데이터 소스와 Google Earth를 동시에 처리할 수 있는 변환 프레임워크를 구현하고 실제 변환 작업을 수행하기 위해 많은 시간을 투자해야 할 것입니다.

또, 요구 사항이나 데이터(입력/출력)가 변경되는 경우에는 어떻게 해야 할까요? GeoServer를 이용하면 이러한 전체 프로세스를 훨씬 쉽게 처리할 수 있습니다. GeoServer는 오라클 데이터베이스에 저장된 Oracle Locator/Oracle Spatial 테이블에 기본적인 연결을 추가함으로써 단순한 Oracle Spatial 바운딩 박스(bounding box) 쿼리(primary-filter 쿼리)를 수행하고, 결과를 KML로 변환하고, KML 결과를 Google Earth에서 서비스로 이용하여 지도를 렌더링할 수 있습니다. 이러한 구성을 이용하여 단순한 지오스페이셜 쿼리를 위한 효율적이고 저렴한 솔루션을 구현하는 것이 가능합니다.

본문서에서는 Oracle Locator/Oracle Spatial, GeoServer, Google Earth를 이용하여 유연하고 강력한 로케이션 기반 BI 시스템을 구현하는 방법을 설명하고 있습니다. 본 문서에서 설명된 예제를 통해, 오픈 소스 테크놀로지를 이용하여 상용 애플리케이션 환경을 확장하는 방법을 배워 보시기 바랍니다.

Oracle Locator/Oracle Spatial 개요

오라클 데이터베이스 버전에서 제공되는 강력한 기능들 중 가장 덜 알려진 것의 하나가 바로 Oracle Locator입니다. 오라클은, Oracle Locator가 "Oracle Database 10g Standard/Enterprise Edition에 포함된 기능으로 대부분의 고객 애플리케이션이 요구하는 핵심 로케이션 기능을 제공한다"고 정의하고 있습니다. 하지만 Oracle Locator는 이보다 훨씬 다양한 기능을 제공합니다. Oracle Locator는 기본적으로 사용자들이 경도, 위도와 같은 위치 정보(지오스페이셜 또는 기타 정보)를 다른 데이터와 함께 테이블에 저장할 수 있는 환경을 제공합니다. 하지만 여기서 그치지 않습니다. 사용자들은 Oracle Locator의 표준 기능을 이용하여 데이터에 대한 위치 분석을 수행할 수 있습니다.

그렇다면 일정 지역 범위에 관련된 모든 정보를 단순히 반환하고자 하는 경우는 어떨까요? 굳이 지도나 GIS를 참고할 필요가 있을까요? Oracle Locator를 사용하면 이 작업을 데이터베이스 내에서 바로 수행할 수 있습니다. 물론 (Oracle Enterprise Edition의 옵션인) Oracle Spatial을 이용하면 더 정교한 기능의 구현이 가능합니다. 기본적으로 Oracle Locator와 Oracle Spatial은 같은 애플리케이션으로 볼 수 있습니다. 이 두 가지는 동일한 코어 오브젝트 타입(SDO_GEOMETRY), 동일한 메타데이터, 인덱싱 방식을 사용합니다.

Oracle Locator는 매우 뛰어난 코어 로케이션 분석 기능을 제공합니다(예: 토폴로지의 관점에서 관련성을 갖는 모든 데이터를 검색). 하지만 Oracle Spatial은 여기에서 한 발 더 나아가, 이미지와 그리드 처리된 래스터 데이터/메타데이터의 저장/관리, 리니어-레퍼런스/네트워크/토폴로지 데이터 모델의 생성 및 분석, 지오코딩(geocoding)을 이용한 텍스트 기반 주소 정보의 위도/경도 변환, 통합 라우팅 엔진을 이용한 운전 경로 분석, 로케이션 데이터에 대한 다차원 스페이셜 분석/마이닝 기능 등을 제공합니다. Oracle Locator와 Oracle Spatial은, 어떤 클라이언트에서든 오라클 데이터베이스의 데이터/분석 기능에 연결하고 쿼리를 수행할 수 있는 환경을 제공합니다.

COUNTIES 데이터 셋의 로딩

샘플 코드에 포함된 샘플 데이터 셋(counties.dmp)은 두 개의 테이블(COUNTIES, STATES)과 Oracle Spatial 메타데이터 및 관련 인덱스를 포함하고 있습니다. 이 데이터를 오라클 데이터베이스에 로드하려면 아래와 같이 수행합니다:

  1. 시스템 권한을 가진 사용자 계정으로 오라클 데이터베이스 인스턴스에 로그인합니다: $> SQLPLUS system/password.
  2. 새로운 데이터베이스 사용자를 생성합니다(이름은 어떻게 붙여도 상관 없습니다. 필자는 ORAGIS라 명명했습니다): SQL> create user oragis identified by oragis.
  3. 새로운 사용자에게 리소스 및 연결 권한을 할당합니다: SQL> grant resource,connect to oragis.
  4. 오라클에서 로그아웃 합니다: SQL> exit.
  5. 5. COUNTIES 덤프(export) 파일을 ORAGIS(또는 다른 이름으로 정의한 사용자) 스키마에 임포트합니다: $> imp oragis/oragis file=counties.dmp full=y.

데이터베이스 오브젝트의 조회

이제 지오스페이셜(geospatial) 데이터와 'nongeospacial' 데이터의 관계를 Oracle Locator에 질의할 수 있는 준비가 완료되었습니다. 하지만 시작하기 전에, 데이터베이스에 추가된 스키마의 구조와 그 동작 원리를 이해하고 넘어 갑시다. 이를 위해 아래와 같이 작업합니다.

  1. COUNTIES 데이터를 소유한 사용자 계정으로 오라클 데이터베이스에 로그인합니다: $> sqlplus oragis/oragis.
  2. DESCRIBE 커맨드를 이용하여 COUNTIES 테이블을 조회합니다: SQL> desc counties.

출력 결과가 아래와 같습니다:

Name Null? Type
GEOM MDSYS.SDO_GEOMETRY
COUNTY VARCHAR2(31)
FIPSSTCO VARCHAR2(5)
STATE VARCHAR2(30)
STATE_ABRV VARCHAR2(2)
FIPSST VARCHAR2(2)
LANDSQMI NUMBER
TOTPOP NUMBER
POPPSQMI NUMBER

위에서 볼 수 있듯, 테이블에 포함된 정보들은 대부분 텍스트(VARCHAR2)와 숫자(NUMBER)로 구성되어 있습니다. 하지만 실제 카운티의 위치 정보를 저장하는 GEOM 로우는 MDSYS.SDO_GEOMETRY 데이터베이스 타입으로 정의되어 있습니다. 이 타입을 자세히 들여다 봅시다:

SQL> desc SDO_GEOMETRY

Name Null? Type
SDO_GTYPE NUMBER
COUNTY NUMBER
SDO_POINT MDSYS.SDO_POINT_TYPE
SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY
SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY

위 출력 결과와 Oracle Spatial 사용자 가이드/레퍼런스를 참고하여 저장된 데이터의 특성을 확인할 수 있습니다.

  • SDO_GTYPE은 지오메트리의 타입을 정의합니다(point, line string, polygon).
  • SDO_SRID은 좌표 시스템의 정의에 사용됩니다.
  • SDO_POINT은 경도와 위도를 지정하는데 사용됩니다.
  • SDO_ELEM_INFO는 SDO_ORDINATES 섹션에 저장되는 숫자의 활용 방법을 정의합니다.
  • SDO_ORDINATES은 스페이셜 오브젝트의 경계를 구성하는 좌표 값을 정의합니다.

컬럼 데이터를 실제로 조회해 봅시다....

SQL> select geom from counties where county = 'San Francisco';

GEOM(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO, SDO_ORDINATES)

SDO_GEOMETRY(2003, 8265, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1),
SDO_ORDINATE_ARRAY(-122.3915, 37.707813, -122.3916, 37.708401,
-122.38088, 37.710056, -122.37258, 37.718094, -122.36247, 37.715759, -122.35625, 37.730015,
-122.36532, 37.732609....))

저장되는 데이터의 종류가 point든, line이든 또는 polygon이든, 모든 데이터가 동일한 타입으로 (그리고 동일한 컬럼 내에) 관리되며, 따라서 바이너리 데이터를 별도로 관리할 필요가 없습니다. 이는 '블랙 박스'가 아닌 '화이트 박스' 형태의 구현 방식으로 이해할 수 있습니다. 이러한 방식으로 로케이션 데이터를 저장함으로써 유연성을 확보할 수 있을 뿐 아니라 SQL, JDBC, ODBC 등의 표준 액세스 인터페이스를 활용할 수 있다는 이점이 제공됩니다.

Oracle Spatial R-트리 인덱싱

Oracle Spatial은 R-트리 인덱스라는 강력한 인덱싱 기능을 제공합니다. Oracle Spatial 사용자 가이드/레퍼런스에서는 이렇게 설명하고 있습니다. "다른 인덱스와 마찬가지로, 스페이셜 인덱스는 검색 범위를 제한하기 위한 메커니즘을 제공합니다. 하지만 스페이셜 인덱스의 경우 intersection, containment와 같은 스페이셜 관련 범주를 기반으로 메커니즘이 구현되어 있습니다. 스페이셜 인덱스의 용도가 다음과 같습니다:

  • 특정 지점 또는 지역과 상호 작용을 수행하는 인덱스된 데이터 공간 내에서 오브젝트를 검색하는 경우 (윈도우 쿼리)
  • 공간적인 관점에서 상호 작용을 수행하는 두 개의 인덱스된 데이터 공간 내에서 한 쌍의 오브젝트를 검색하는 경우(스페이셜 조인)"

오라클 데이터베이스에서 로케이션 정보(또는 지오스페이셜 정보)를 포함하는 테이블을 생성할 때에는 스페이셜 인덱스를 사용하여 로케이션 정보를 인덱싱 하는 것이 권장됩니다.

데이터의 조회

데이터의 로드 작업이 완료되었다면 아래와 같은 형태의 흥미로운 분석 작업을 수행할 수 있습니다:

"캘리포니아에 포함되거나, 중첩되거나, 인접한 모든 카운티를 조회(이러한 검색은 스칼라 속성을 갖는 주(state) 정보에 대한 일반 쿼리로는 수행할 수 없습니다)."

select /*+ ordered */ c.COUNTY,c.STATE_ABRV,c.TOTPOP,c.POPPSQMI
from states s, counties c
where s.state = 'California'
and sdo_anyinteract (c.geom, s.geom) = 'TRUE';

여기서 우리는, 오라클 데이터베이스가 캘리포니아 주와 토폴로지 상의 관계를 갖는 모든 카운티를 반환하도록 요구하고 있습니다. 이 쿼리를 실행하면 캘리포니아 뿐 아니라 오레곤, 네바다, 애리조나 등을 포함하는 (전체 3,300 개 중) 74 개의 카운티가 반환됩니다. COUNTIES 테이블의 STATE 컬럼만 사용해서는 절대로 이런 결과를 얻을 수 없습니다. STATE 컬럼을 이용한 쿼리에서는 캘리포니아와 인접한 다른 주의 카운티 정보를 포함시킬 수 없기 때문입니다.

위에서 배운 내용을 바탕으로, 더 흥미롭고 더욱 시각적인 분석 작업을 수행해 볼 수 있습니다. Oracle Locator 또는 Oracle Spatial을 운영 환경에서 활용하기 전에, 먼저 아래의 웹 사이트와 문서들을 참고하실 것을 권고 드립니다:

oracle.com/technology/products/spatial/index.html

oracle.com/technology/products/spatial/htdocs/training.html

oracle.com/technology/obe/10gr2_db_vmware/datamgmt/spatial/spatial.htm

GeoServer를 이용한 오라클 데이터의 변환

Confluence 웹 사이트는 GeoServer를 "지오스페이셜 웹에 연결할 수 있게 하는 오픈 소스 서버"라 정의하고 있습니다. 다시 말해 GeoServer는 다른 지오스페이셜 서비스/서버 간의 커뮤니케이션 브리지 역할을 담당하면서, 데이터 포맷을 쉽게, 그리고 다이내믹하게 변환할 수 있게 합니다. 우리가 구현하는 샘플 애플리케이션에서는 이 기능이 매우 유용하게 활용될 수 있습니다. 소량의 코드(PL/SQL, Java, PHP)를 작성하여 Oracle Locator/Oracle Spatial 데이터를 Google Earth KML로 내보낼 수도 있지만, 이 방법이 효과적이지 못한 경우가 있을 수 있습니다. 이런 상황에서 GeoServer가 그 빛을 발할 수 있습니다.

GeoServer의 설치

아래와 같은 방법으로 GeoServer를 설치합니다:

  1. Confluence-GeoServer 홈 페이지를 엽니다.
  2. Quickstart 문서의 사전 요구 사항(prerequisite) 항목을 읽어 봅니다.
  3. 최신 버전의 GeoServer를 다운로드하고 설치합니다Download
  4. 최신 버전의 Oracle DataStore Extension for GeoServer를 다운로드하고 설치합니다.

이 작업을 수행하기 전에 GeoServer에 기본적으로 포함되어 있는 내역을 확인하는 것이 좋습니다. 이를 위해 아래와 같이 작업합니다.

  • GeoServer를 시작하고 GeoServer 홈 페이지로 이동합니다: http://localhost:8080/geoserver.
  • Config를 클릭합니다: http://localhost:8080/geoserver/config/index.do.
  • 디폴트 유저네임/패스워드(admin/geoserver)를 사용하여 로그인합니다.
  • Config를 다시 클릭합니다: http://localhost:8080/geoserver/config/index.do.
  • Data를 다시 클릭합니다: http://localhost:8080/geoserver/config/index.do.
  • Stores를 클릭합니다: http://localhost:8080/geoserver/config/data/store.do.
  • New를 클릭합니다: http://localhost:8080/geoserver/config/data/storeNew.do.

Oracle DataStore Extension for GeoServer를 먼저 설치하지 않은 상태에서 새로운 데이터 스토어를 생성하려 시도하면 Oracle 연결 옵션이 목록에 표시되지 않음에 주의하십시오.

Oracle DataStore Extension의 설치

Oracle DataStore Extension for GeoServer를 설치하는 방법이 아래와 같습니다:

  • 별도 디렉토리에 geoserver-1.5.0-oracle-plugin.zip 파일의 압축을 풉니다.
  • gt2-oracle-spatial-2.3.1.jar 파일과 ojdbc14.jar 파일을 [GEOSERVER_HOME]\Webapps\geoserver\WEB-INF\lib 디렉토리에 복사합니다.
  • GeoServer를 재시작합니다.
  • 이제 위의 제 4 단계 중 g 단계에서 새로운 데이터 스토어를 생성하려고 시도하면 목록에 Oracle이 표시되는 것을 확인할 수 있습니다.

GeoServer에서 오라클 데이터베이스 연결 설정하기

Oracle DataStore Extension for GeoServer가 성공적으로 설치되었다면 이제 GeoServer를 이용하여 오라클 데이터베이스를 직접 조회할 수 있습니다.

오라클 데이터베이스를 위한 GeoServer 데이터 스토어 생성

GeoServer가 실행 중이고 Oracle DataStore Extension이 설치되었다면, 이제 GeoServer에서 COUNTIES 테이블을 조회할 수 있도록 설정할 차례입니다. 이를 위해 아래와 같이 작업합니다.

  1. Config.를 다시 클릭합니다: http://localhost:8080/geoserver/config/index.do.
  2. Data를 다시 클릭합니다: http://localhost:8080/geoserver/config/index.do.
  3. Stores를 클릭합니다: http://localhost:8080/geoserver/config/data/store.do.
  4. New를 클릭합니다: http://localhost:8080/geoserver/config/data/storeNew.do.
  5. S5. 선택 목록에서 Oracle을 선택하고 데이터 스토어의 이름을 oragis라 명명합니다(그림 1 참고).


  6. 그림 1: 새로운 GeoServer DataStore로 Oracle을 선택 [이미지 위치: /technology/pub/images/lokitz-spatial-geoserver-f1.gif]

  7. 6. 디폴트 네임스페이스(topp) 설정을 그대로 두고 COUNTIES 테이블을 가져온 오라클 인스턴스의 호스트, 포트, 유저네임, 패스워드, 인스턴스(SID 또는 서비스) 정보를 입력합니다(그림 2 참조).
  8. Submit을 클릭합니다.

    그림 2: GeoServer 프레임워크에서 새로운 Oracle DataStore 생성하기


  9. 좌측 상단의 Apply를 클릭하고 다시 Save를 클릭합니다. 지금까지 데이터 스토어가 아무 문제 없이 (XML 파일 형태로) 저장되고 로드되었어야 합니다.

COUNTIES 테이블을 위한 GeoServer 피처 타입 생성

데이터 로드 작업이 완료되었다면 이제 데이터 스토어를 위한 피처 타입(feature type)을 생성해야 합니다. 이를 위해 아래와 같이 작업합니다.

  1. Config -> Data 메뉴를 다시 선택합니다: http://localhost:8080/geoserver/config/data/index.do
  2. FeatureType을 클릭합니다: http://localhost:8080/geoserver/config/data/typeSelect.do.
  3. New를 클릭합니다: http://localhost:8080/geoserver/config/data/typeNew.do.
  4. Feature Type Name 목록에서 oragis:::COUNTIES를 선택합니다(그림 3 참조).

    그림 3: 새로운 GeoServer 피처 타입으로 COUNTIES 테이블 선택


  5. New를 클릭합니다.
  6. 아래와 같이 폼에 입력합니다(그림 4 참조):
          a. Style: polygon.
          b. SRS: 4326.
          c. Title: COUNTIES.
          d. Bounding Box: click Generate.
          e. 나머지 값은 디폴트 설정을 그대로 사용합니다.
    *참고: 위의 d 항목은 Oracle Spatial을 위한 프라이머리-필터 바운딩 박스(primary-filter bounding box) 쿼리를 설정합니다. GeoServer는 현재 "nearest neighbor", "within distance" 등의 로케이션 인텔리전스 쿼리를 위한 지오스페이셜 쿼리를 지원하지 않고 있습니다. 하지만 Oracle Application Server에 포함된 기능인 Oracle Application Server MapViewer를 이용하면 이러한 형태의 쿼리를 완벽하게 지원하는 것이 가능합니다.
  7. Submit을 클릭합니다.

    그림 4: COUNTIES 테이블을 위한 피처 타입 생성

  8. 좌측 상단의 Apply를 클릭하고 다시 Save를 누릅니다. 지금까지 피처 타입(메타데이터)이 아무 문제 없이 (XML 파일 형태로) 저장되고 로드되었어야 합니다.

맵 스타일

이제 데이터 스토어 및 피처 타입에 대한 GeoServer 연결을 테스트할 준비가 모두 완료되었습니다. 이제 COUNTIES 테이블을 여러 가지 포맷으로 출력할 수 있는 상태이어야 합니다. 하지만 현재는 간단한 폴리곤 스타일만이 적용되어 있기 때문에 확인할 수 있는 내용은 그리 많지 않습니다. 연결을 테스트한 뒤 데이터 셋에 대한 스타일화(stylization) 작업을 수행해 보기로 하겠습니다. 먼저 아래와 같이 작업합니다.

  1. GeoServer 홈페이지에서 WMS Capabilities 를 클릭합니다: http://localhost:8080/geoserver/wms?service=WMS&request=GetCapabilities.
  2. XML 문서/페이지와 GeoServer 구현을 위한 기능 목록이 표시되는 것을 확인할 수 있습니다. topp:COUNTIES 항목이 나타날 때까지 목록을 스크롤합니다. 이 항목은 GeoServer에서 어떤 WMS 서버에 출력을 수행할 것인지 정의하고 있습니다(그림 5 참조).


  3. 그림 5: GeoServer WMS-XML 출력

브라우저의 GeoServer에서 맵 이미지 가져오기

COUNTIES 피처(feature)를 테스트하기 위해 새로운 브라우저 윈도우를 열고 아래 URL로 이동합니다:

http://localhost:8080/geoserver//wms?service=WMS&request=GetMap&format=image/
png&width=800&height=600&srs=EPSG:4326&layers=topp:COUNTIES
&styles=polygon&bbox=-177.1,13.71,-61.48,76.63

위의 WMS 요청은 GeoServer를 4326의 SRS(좌표 시스템)에서 COUNTIES 피처를 위한 800x600 사이즈의 PNG 이미지를 출력할 것을 요구하고 있습니다. 이미지는 매우 단순화된 폴리곤 스타일로 구성되며 다음과 같은 차원의 바운딩 박스에 포함됩니다: 최소 경도 (-177.1), 최소 위도 (13.71), 최대 경도 (-61.48), 최대 위도 (76.63).

요청을 처리한 후, GeoServer는 그림 6과 같은 이미지를 반환합니다:

그림 6: COUNTIES 피처 타입을 위한 샘플 WMS 출력

이것으로 (GeoServer의 피처를 이용하여) 오라클 테이블과 Google Earth를 통합할 준비가 모두 완료되었습니다. 통합 작업을 시작하기 전에, 매핑 스타일을 이용하여 카운티 정보를 보다 흥미롭고 직관적인 방법으로 정의하는 방법을 알아보기로 하겠습니다. 이를 위해, 피처에 새로운 스타일(또는 Styled Layer Descriptor)를 적용해야 합니다.

Styled Layer Descriptor의 생성

Styled Layer Descriptor(SLD)를 이용하면 맵을 훨씬 다채롭게 꾸밀 수 있습니다. SLD는 맵을 렌더링하는 방식을 정의하는데 이용됩니다. 예를 들어 라인을 검정색으로 표시할 것인지, 또는 파란색으로 표시하고 아웃라인과 텍스트 라벨을 적용할 것인지 선택하는 것이 가능합니다. SLD는 오픈 소스 표준을 기반으로 하는 XML 언어입니다 (표준에 대한 정보는 이 곳을 참고하십시오.) GeoServer를 위해 생성된 SLD 파일은 임의의 WMS(Web Mapping Service) 호환 애플리케이션에서 재활용될 수 있습니다(http://docs.codehaus.org/display/GEOSDOC/1.3+Style+Your+Map).

다음 단계에서는 미국 내 카운티 지도를 스타일화(stylize)하기 위해 SLD를 생성해 보겠습니다. GeoServer 웹 사이트의 레퍼런스 가이드에서 상세한 방법을 확인하실 수 있습니다. 또는 그 대안으로, GeoServer 설치 환경에서 기본적으로 제공되는 SLD를 템플릿으로 활용할 수도 있습니다. 여기에서는 popshade.sld라는 SLD를 템플릿으로 사용해 보겠습니다. 이 SLD에 대한 정보를 확인하기 위해 아래와 같이 실행합니다:

  1. [GEOSERVER_HOME]\data_dir\styles 디렉토리로 이동합니다.
  2. 텍스트 편집기에서 popshad.sld를 엽니다.

SLD 룰/필터 섹션의 활용

지금까지 진행 과정에서 몇 가지 특이한 점을 발견하셨을지 모르겠습니다:
  • <FeatureTypeStyle> 태그에는 여러 개의 <Rule> 섹션들이 포함되어 있습니다.
  • • 룰 섹션 내에는 필터 섹션(<ogc:Filter..>)들이 포함되어 있습니다. 필터 섹션은 특정 피처 내에서 어떤 스칼라 속성을 확인해야 하는지, 그리고 어떤 로직을 수행해야 하는지 정의하는데 사용됩니다. 예를 들어 첫 번째 룰 섹션에 포함된 필터 중 하나는, 이 룰이 피처 내에서 PERSONS가 2,000,000에서 4,000,000 사이인 데이터에만 적용됨을 정의하고 있습니다.
<ogc:Filter xmlns:gml="http://www.opengis.net/gml">
   <ogc:PropertyIsBetween>
    <ogc:PropertyName>PERSONS</ogc:PropertyName>
    <ogc:LowerBoundary>
     <ogc:Literal>2000000</ogc:Literal>
    </ogc:LowerBoundary>
    <ogc:UpperBoundary>
     <ogc:Literal>4000000</ogc:Literal>
    </ogc:UpperBoundary>
   </ogc:PropertyIsBetween>
 </ogc:Filter>
오라클 데이터베이스의 COUNTIES 테이블은 GEOM 컬럼의 로케이션 데이터와 별도로 카운티 속성 데이터를 포함하고 있습니다. 이 속성 데이터는 룰, 로직, 스타일화 작업을 정의하는데 사용됩니다. 그 중 흥미를 끌 만한 것이 POPPSQMI(POPulation Per SQuare MIle for each county)입니다. 이 데이터 셋에 POPPSQMI의 값을 이용하여 룰을 적용하면 그 결과가 맵에 표시될 것입니다.

COUNTIES 테이블을 위한 SLD의 생성

COUNTIES 테이블(그리고 COUNTIES 피처)를 위한 popshade.sld SLD를 커스터마이즈하기 위해 편집 작업을 수행합니다:

  1. COUNTIES 테이블(그리고 COUNTIES 피처)를 위한 popshade.sld SLD를 커스터마이즈하기 위해 편집 작업을 수행합니다:
  2. Name, Title, Abstract 섹션을 편집합니다: <Name>CountyPopDensity</Name>
  3. 새로운 룰 섹션을 몇 가지 생성하여, GeoServer가 데이터를 렌더링할 때 POPPSQMI를 기반으로 5-6 가지 쉐이딩 스타일을 반환하도록 합니다.
  4. 첫 번째 룰에, POPPSQMI의 값을 조회하고 POPPSQMI가 10 이하인 로우에 특정 컬러 및 텍스트를 적용하는 필터를 정의합니다.
  5. <Rule>
        <!-- like a linesymbolizer but with a fill too -->
        <ogc:Filter xmlns:gml="http://www.opengis.net/gml">
        <ogc:PropertyIsLessThan>
        <ogc:PropertyName>POPPSQMI</ogc:PropertyName>
        <ogc:Literal>10</ogc:Literal>
          </ogc:PropertyIsLessThan>
        </ogc:Filter>
        <PolygonSymbolizer>
           <Fill>
              <!-- CssParameters allowed are fill (the color) and fill-opacity -->
              <CssParameter name="fill">#0000FF</CssParameter>
              <CssParameter name="fill-opacity">0.7</CssParameter>
    </Fill> </PolygonSymbolizer> <TextSymbolizer> <Label> <ogc:PropertyName>COUNTY</ogc:PropertyName> </Label> <Font> <CssParameter name="font-family">Times New Roman</CssParameter> <CssParameter name="font-style">Normal</CssParameter> <CssParameter name="font-size">10</CssParameter> </Font> <Fill> <CssParameter name="fill">#000000</CssParameter> </Fill> </TextSymbolizer> </Rule>
  6. 다음으로 두 가지 숫자의 사이에 있는 POPPSQMI 값을 기준으로 하는 필터들을 이용하여 여러 가지 룰을 생성합니다:
  7. <Rule>
        <!-- like a linesymbolizer but with a fill too -->
        <ogc:Filter xmlns:gml="http://www.opengis.net/gml">
          <ogc:PropertyIsBetween>
            <ogc:PropertyName>POPPSQMI</ogc:PropertyName>
            <ogc:LowerBoundary>
              <ogc:Literal>10</ogc:Literal>
            </ogc:LowerBoundary>
            <ogc:UpperBoundary>
              <ogc:Literal>1000</ogc:Literal>
            </ogc:UpperBoundary>
          </ogc:PropertyIsBetween>
        </ogc:Filter>
        <PolygonSymbolizer>
           <Fill>
            <!-- CssParameters allowed are fill (the color) and fill-opacity -->
            <CssParameter name="fill">#00FF00</CssParameter>
    	    <CssParameter name="fill-opacity">0.7</CssParameter>
           </Fill>     
        </PolygonSymbolizer>
        <TextSymbolizer>
    	<Label>
    	  <ogc:PropertyName>COUNTY</ogc:PropertyName>
           </Label>
    
          <Font>
    	    <CssParameter name="font-family">Times New Roman</CssParameter>
    	    <CssParameter name="font-style">Normal</CssParameter>
    	    <CssParameter name="font-size">10</CssParameter>
          </Font>
          <Fill>
    	    <CssParameter name="fill">#000000</CssParameter>
          </Fill>
        </TextSymbolizer>
     </Rule> 
    
  8. 마지막으로 30000 이상의 POPPSQMI 값을 위한 룰을 생성합니다:
  9. <Rule>
        <!-- like a linesymbolizer but with a fill too -->
        <ogc:Filter xmlns:gml="http://www.opengis.net/gml">
          <ogc:PropertyIsGreaterThan>
           <ogc:PropertyName>POPPSQMI</ogc:PropertyName>
           <ogc:Literal>30000</ogc:Literal>
          </ogc:PropertyIsGreaterThan>
        </ogc:Filter>
        <PolygonSymbolizer>
           <Fill>
              <!-- CssParameters allowed are fill (the color) and fill-opacity -->
              <CssParameter name="fill">#FF0000</CssParameter>
    	      <CssParameter name="fill-opacity">0.7</CssParameter>
           </Fill>     
        </PolygonSymbolizer>
        <TextSymbolizer>
       <Label>
    	  <ogc:PropertyName>COUNTY</ogc:PropertyName>
    	</Label>
    
    	<Font>
    	  <CssParameter name="font-family">Times New Roman</CssParameter>
          <CssParameter name="font-style">Normal</CssParameter>
    	  <CssParameter name="font-size">10</CssParameter>
    	</Font>
    	<Fill>
    	  <CssParameter name="fill">#000000</CssParameter>
    	</Fill>
         </TextSymbolizer>
    </Rule>
    
  10. 완성된 파일의 샘플을 샘플 코드에서 확인하실 수 있습니다.
  11. 새로 생성된 SLD를 저장합니다.

Counties SLD의 로드

이제 새로 생성한 SLD를 GeoServer에 로드해야 합니다. 이를 위해 아래와 같이 작업합니다.
  1. GeoServer의 Config -> Data -> Style 페이지로 이동합니다: http://localhost:8080/geoserver/config/data/style.do.
  2. New 를 클릭하여 새로 생성한 SLD를 기반으로 새로운 스타일을 만듭니다: http://localhost:8080/geoserver/config/data/styleNew.do . popshade.sld 파일의 이름을 countypopdensity로 설정합니다(그림 7 참조).

    그림 7: 새로운 GeoServer 스타일의 이름 설정 (SLD)


  3. 생성한 countypopshade.sld 파일을 선택합니다(그림 8 참조).
  4. Submit을 클릭합니다.

    그림 8: 새로운 SLD를 기준으로 GeoServer 스타일을 생성


  5. 좌측 상단의 Apply를 클릭하고 다시 Save를 클릭합니다. 지금까지 스타일이 아무 문제 없이 (XML 파일 형태로) 저장되고 로드되었어야 합니다.

Counties SLD와 Counties 피처의 연계

  1. Config -> Data -> FeatureType 메뉴로 이동합니다.
  2. Feature Types 목록에서 oragis:COUNTIES를 선택하고 Edit을 클릭합니다.
  3. Style 목록에서 countypopdensity를 선택합니다(그림 9 참조).

    그림 9: COUNTIES 피처 타입을 새로운 스타일로 업데이트


  4. 페이지 하단으로 스크롤하여 Submit을 클릭합니다.
  5. 좌측 상단의 Apply를 클릭하고 다시 Save를 클릭합니다. 지금까지 업데이트된 피처 타입이 아무 문제 없이 (XML 파일 형태로) 저장되고 로드되었어야 합니다.
  6. 이제 WMS 요청을 재실행 하여 Style 매개변수의 폴리곤에 대한 countypopdensity를 대체합니다.
    http://localhost:8080/geoserver//wms?service=WMS&request=GetMap&format=image/png&width=800&height=600&srs=
    EPSG:4326&layers=topp:COUNTIES&styles=countypopdensity&bbox=-177.1,13.71,-61.48,76.63.
  7. 표시되는 이미지가 그림 10과 같습니다:


  8. 그림 10: 새로운 스타일을 이용한 COUNTIES 피처 타입의 WMS 아웃풋

    지금까지 확인한 것처럼, GeoServer는 필터와 메타데이터를 이용하여 테마틱 쉐이딩(thematic shading)을 위한 오라클 데이터베이스 쿼리를 생성하고 실행합니다. 이 쿼리는 바운딩 박스(-177.1,13.71,-61.48,76.63) 내에서 결과 셋을 반환하도록 작성됩니다. 이 쿼리는 SDO_FILTER라는 이름의 Oracle Locator/Oracle Spatial 연산자를 사용합니다. ("데이터의 조회" 섹션에서 예로 든 것과 같은) 고급 수준의 쿼리를 작성하기 위해 GeoServer의 WMS 서버를 확장하는 작업은 결코 쉽지 않습니다. 하지만 Oracle Spatial과 Oracle Application Server MapViewer를 이용하면 Oracle Application Server MapViewer의 네이티브 WMS 서비스를 통해 고급 쿼리를 생성, 반환하는 애플리케이션을 구현할 수 있습니다. Query the Data section, you could certainly use Oracle Spatial and Oracle Application Server MapViewer to develop applications that do allow for advanced queries to be output by use of Oracle Application Server MapViewer's native WMS services.
  9. 좀 더 출력 결과를 다듬고자 한다면, 위의 절차를 사용하여 여러분의 취향에 맞게 countypopshade.sld를 업데이트하면 됩니다.

이제 새로운 피처를 Google Earth에 통합하기 위한 모든 준비가 완료되었습니다.

Google Earth에 Oracle Locator/GeoServer 통합하기

GeoServer와 오라클에서 필요한 작업은 모두 완료되었습니다. 이제 마지막 단계로, GeoServer를 이용해서 오라클을 Google Earth에 통합할 차례입니다.

Google Earth GUI를 이용하여 오라클 데이터베이스의 Counties 데이터 조회하기

Google Earth는 로케이션 정보와 각 정보들간의 지오스페이셜 관계를 조회하기 위한 저렴하면서도 유연한 솔루션을 제공합니다. Oracle Locator와 Oracle Spatial이 서버 기반 지오스페이셜 분석 및 일반 데이터 분석 작업을 위한 기능을 제공하는 것처럼, Google Earth도 이러한 정보 및 분석을 위한 프론트-엔드 사용자 인터페이스를 제공하고 있습니다. 하지만 현재로서는 한 가지 주의해야 할 사항이 있습니다. 오라클 데이터베이스와 Google Earth를 통합하려는 경우, 오라클 데이터베이스에 KML 또는 KMZ(두 가지 모두 Google Earth 마크업 언어로, 각각 압축/비압축 포맷을 지원합니다)를 출력하는 커스텀 인터페이스를 구현하거나, 또는 Google Earch Enterprise를 구입한 후 Google Geospatial Sales Engineering 팀의 서비스를 이용하여 통합 작업을 진행해야 합니다. 하지만 좀 더 쉽고 유연한 세 번째 대안이 있습니다. GeoServer를 이용해서 Oracle Spatial에 KML/KMZ 포맷으로 출력하는 것입니다. GeoServer는 앞에서 설명한 표준 WMS 포맷을 이용하여 Oracle Spatial로부터 KML/KMZ 출력을 자동으로 생성합니다. 여기서 "format" 값은 PNG에서 "application/vnd.google-earth.kml+XML"로 변경되어야 합니다.

http://localhost:8080/geoserver//wms?service=WMS&request=GetMap&format=application/
vnd.google-earth.kmz+XML&width=1024&height=1024&srs=EPSG:4326&layers=topp:COUNTIES
&styles=countypopdensity

또는 간단하게 KML Reflector를 사용할 수 있습니다. KML Reflector는 GeoServer의 또 다른 기능으로, 단순화된 URL 안에 WMS 호출에 포함되는 대부분의 정보를 인캡슐레이트 합니다.

이 작업을 수행하는 자세한 방법은 GeoServer Web 사이트(docs.codehaus.org/display/GEOSDOC/Google+Earth )에서 확인하실 수 있습니다. 아래 설명은 그 내용을 요약하고 있습니다.

  1. Google Earth를 시작합니다.
  2. 미국 내에서 원하는 지역이 나올 때까지 지구를 회전시킵니다(그림 11 참조).

    그림 11: 원하는 미국내 지역에 Google Earth 화면을 가져오기


  3. Network Link 메뉴에서 Add를 선택합니다.(그림 12 참고)

    그림 12: Google Earth Network Link 메뉴


  4. 네트워크 링크의 이름을 지정합니다(예: County Pop Density).
  5. 5. GeoServer에서 Link 필드에 KML/KMZ URL을 입력합니다. (그림 13 참고):
    http://localhost:8080/geoserver/wms/kml_reflect?layers=COUNTIES.

    그림 13: GeoServer 인스턴스를 위한 네트워크 링크 정보의 추가

    참고: GeoServer-Google Earth 웹 페이지에서는 KML Reflector 유틸리티가 번거로운 작업을 통해 WMS 요청을 변경하지 않고도 KML/KMZ 아웃풋을 생성할 수 있도록 지원하기 위해 개발되었다고 밝히고 있습니다.
  6. OK를 클릭합니다.
  7. 7. 이제 Google Earth 데이터 위에 카운티 데이터가 표시되는 것을 확인할 수 있습니다(그림 14, 15 참조). 멋지지 않습니까!

    그림 14: 줌 인/아웃, 패닝을 통해 다른 지역의 데이터 뷰를 확인합니다.

    그림 15: 이제 오라클의 카운티 데이터가 Google Earth에 통합되었습니다.

Google Earth에서 네트워크 데이터 자동으로 리프레시하기

네트워크 링크에서 데이터 뷰를 주기적으로 리프레시하도록 설정하는 것도 가능합니다. 이를 위해 아래와 같이 작업합니다.

  1. Google Earth의 Places 섹션에서 County Pop Density 링크를 마우스 오른쪽 버튼으로 클릭합니다.(그림 16 참조)

    그림 16: 네트워크 링크 속성의 편집


  2. Refresh 탭을 클릭하고 몇 가지 리프레시 옵션을 조정합니다.

결론

로케이션 정보의 활용도가 점점 더 확산되어 감에 따라, 로케이션 정보를 위한 테크놀로지 또한 진보하고 있습니다. 다른 테크놀로지들이 대개 그러하듯, 데이터 활용도가 증가하면 그에 따라 애플리케이션과 데이터 포맷의 수 또한 증가하고 결과적으로 복잡성이 높아지게 됩니다. 한 예로, Oracle Locator/Oracle Spatial, Google Earth와 같은 강력한 툴로 데이터의 투명성과 유연성을 즉각적으로 개선할 수 있지만, 기본적으로 서로 완전하게 통합되지 않은 툴들이 추가됨으로 인해 전체적인 아키텍처는 복잡해지게 됩니다. 상용 소프트웨어가 야기하는 복잡성의 문제를 해결하는 가장 효과적이고 대중적인 방법은 바로 오픈 소스 소프트웨어를 활용하는 것입니다.

로케이션 정보와 관련된 영역에서 이러한 역할을 가장 잘 담당할 수 있는 오픈 소스 소프트웨어 솔루션이 바로 GeoServer입니다. GeoServer와 같은 솔루션을 이용하면 로케이션 데이터의 생성, 저장, 관리, 활용 과정에서 플랫폼을 선택하는 문제로 고민할 필요가 없게 됩니다. 개발자는 가장 적합한 솔루션을 자유롭게 선택하고, 필요한 경우 오픈 소스 커뮤니티에 지원을 요청하면 됩니다.

본 문서는 바로 이러한 주제, GeoServer 오픈 소스 솔루션을 이용하여 서로 다른 두 가지의 대중적이고 강력한 로케이션 솔루션, Oracle Locator/Oracle Spatial과 Google Earth를 통합하는 내용을 다루고 있습니다. 지금까지 오라클 데이터베이스 내에서 로케이션 정보 및 일반 정보를 분석하고, Google Earth 상에서 통합된 사용자 인터페이스를 구현하는 방법을 설명하였습니다. 구현된 샘플은 고급 엔터프라이즈 비즈니스 인텔리전스 시스템의 한 예로써 활용될 수 있을 것입니다.


Justin Lokitz (Justin.Lokitz@lggi.com)는 Leica Geosystems의 세일즈 엔지니어링 부문 디렉터입니다.
E-mail this page
Printer View Printer View