오라클 Spatial

드라이버 단축 이름

OCI

빌드 의존성

OCI 라이브러리

OCI 드라이버는 Oracle Spatial (8.1.7 이상 버전) 객체 관계형(object-relational) 포맷으로 된 데이터의 읽기 및 쓰기를 지원합니다. 오라클 Spatial 드라이버는 일반적으로 OGR로 빌드되지 않지만, 오라클 클라이언트 라이브러리를 사용할 수 있는 플랫폼 상에서는 OGR로 빌드될 수도 있습니다.

데이터베이스를 열 때, 데이터베이스 이름을 “OCI:userid/password@database_instance:table,table” 형식으로 지정해야 합니다. 테이블 목록은 선택 옵션입니다. 기본 로컬 데이터베이스 인스턴스에 접근하는 경우 database_instance 부분을 생략할 수도 있습니다.

테이블 목록을 지정하지 않는 경우, OGR가 ALL_SDO_GEOM_METADATA 테이블에 나타나는 모든 테이블을 테이블 이름을 가진 레이어로 취급할 것입니다. 데이터소스 이름에 명확하게 목록화하지 않는 이상 ALL_SDO_GEOM_METADATA 테이블에 목록화되어 있지 않은 비공간 테이블 또는 공간 테이블에 접근할 수 없습니다. 원하는 레이어들이 모두 ALL_SDO_GEOM_METADATA 테이블에 존재하는 데이터베이스에서도 사용할 테이블만 목록화하는 것이 바람직할 수도 있습니다. 수많은 테이블을 가지고 있는 데이터베이스에서 초기화 시간을 크게 줄일 수 있기 때문입니다.

테이블이 OGR_FID라는 정수형 열을 가지고 있는 경우 OGR가 객체ID로 사용할 것입니다. (그리고 이 열은 정규 속성으로 나타나지 않을 것입니다.) 오라클 Spatial로 데이터를 불러올 때 OGR는 항상 OGR_FID 필드를 생성할 것입니다.

드라이버 케이퍼빌리티

Create() 지원

이 드라이버는 GDALDriver::Create() 작업을 지원합니다.

지리참조 작업 지원

이 드라이버는 지리참조 작업을 지원합니다.

SQL 문제점

OCI 드라이버는 OGRDataSource 상에 ExecuteSQL() 함수를 호출하거나 ogr2ogr 유틸리티에 ‘-sql’ 명령어 옵션을 사용하는 경우, 내부적으로 SQL 문을 평가하기보다는 기본적으로 오라클에 SQL 문을 직접 전송합니다. 속성 쿼리 표현식도 오라클에 직접 전송합니다.

ExecuteSQL() 인터페이스를 통해 특수 명령어 2개도 지원합니다. 레이어를 삭제하는 DELLAYER:<table_name> 와 레이어에 SDO_GEOM.VALIDATE_GEOMETRY() 검증을 적용하는 VALLAYER:<table_name> 입니다. 내부적으로 이 의사 명령어들을 오라클을 위한 좀 더 복잡한 SQL 명령어들로 변환합니다.

ExecuteSQL() 메소드에 “OGRSQL” 문자열을 SQL 방언 이름으로 전송해서 OCI 드라이버가 SQL 문을 OGR SQL 엔진으로 처리하도록 요청할 수도 있습니다.

주의할 점

  • 유형 인식 로직이 현재 다소 부족합니다. 정수형 및 실수형 필드의 실수 길이 정보를 보전하려 하지 않습니다.

  • OGR가 오라클에 있는 객체 및 블랍(blob) 같은 다양한 유형을 완전히 무시할 것입니다.

  • 현재 OGR 트랜잭션 의미(semantics)가 오라클의 트랜잭션 의미로 제대로 매핑되지 않습니다.

  • 테이블을 읽어올 때 해당 테이블의 스키마에 OGR_FID라는 속성이 존재하는 경우, FID로 사용할 것입니다. 식별된 (그리고 색인화된) FID 필드 없이 테이블들을 (FID 기반으로) 임의로 읽어오는 것은 아주 느릴 수 있습니다. OCI_FID 환경설정 옵션을 (예를 들어 환경 변수를) 대상 필드명으로 설정하면 특정 필드명을 강제로 사용하게 할 수 있습니다.

  • 읽기 작업 시 만곡 도형 유형을 6도 단위로 구부러지는 선분들로 이루어진 라인스트링 또는 선형 고리로 변환합니다. 이 드라이버는 만곡 도형 쓰기를 지원하지 않습니다.

  • 오라클 Spatial은 점구름(SDO_PC), TIN(SDO_TIN) 그리고 주석 텍스트 데이터를 지원하지 않습니다.

  • 로케일이 영어가 아닌 환경에서 부동소수점형 숫자를 정수로 절단하는 문제를 막으려면 NLS_LANG 환경 변수를 “American_America.UTF8”로 정의해야 할 수도 있습니다.

  • 개발자에게: Valgrind 메모리 오류 탐지 도구를 켠 상태에서 이 드라이버를 실행하는 경우, database_instance를 일반적으로 “localhost”로 지정하거나 또는 TWO_TASK 환경 변수를 정의해야만 할 수도 있습니다. 그렇지 않으면 “TNS:permission denied” 오류를 리포트할 것입니다.

생성 문제점

오라클 Spatial 드라이버는 새 데이터셋(데이터베이스 인스턴스) 생성을 지원하지 않지만, 기존 데이터베이스 안에 새 레이어를 생성할 수는 있습니다.

OGRDataSource를 닫을 때, 새로 생성된 레이어가 자동 작성된 공간 색인을 가질 것입니다. 이 때 USER_SDO_GEOM_METADATA 테이블도 실제로 작성된 객체를 기반으로 하는 테이블의 경계로 업데이트할 것입니다. 이 습성의 결과 가운데 하나는 레이어를 불러오고 나면 일반적으로 USER_SDO_GEOM_METADATA에 있는 DIMINFO 정보를 직접 수정하거나 공간 색인을 재작성하지 않고서는 원본 범위 바깥에 있는 추가적인 객체를 불러오지 못 하게 된다는 것입니다.

레이어 생성 옵션

  • OVERWRITE: 요청한 레이어를 생성하기 전에 요청한 이름을 가진 기존 레이어를 강제로 삭제하고 싶다면 이 옵션을 YES로 설정할 수도 있습니다. 기본값은 NO입니다.

  • TRUNCATE: 기존 테이블을 강제로 재사용하게 하지만 먼저 색인 또는 의존성은 보전하면서 테이블에 있는 모든 레코드를 절단하게 하려면 이 옵션을 YES로 설정할 수도 있습니다. 기본값은 NO입니다.

  • LAUNDER: 해당 레이어에 생성되는 새 필드의 이름을 오라클과 좀 더 호환되는 형식으로 강제 “세탁”하려면 이 옵션을 YES로 설정할 수도 있습니다. 이 옵션은 소문자를 대문자로 변환하고, “-” 및 “#” 같은 몇몇 특수 문자를 “_”로 변환합니다. 기본값은 NO입니다.

  • PRECISION: 해당 레이어에 생성되는 새 필드가 길이 및 정밀도 정보를 시도하고 사용할 수 있는 경우 NUMBER(길이, 정밀도) 또는 VARCHAR2(길이) 유형을 이용해서 표현하도록 강제하려면 이 옵션을 YES로 설정할 수도 있습니다. 이 옵션을 NO로 설정하면 NUMBER, INTEGER 및 VARCHAR2 유형을 대신 사용할 것입니다. 기본값은 YES입니다.

  • DIM: 생성되는 레이어의 차원을 2 또는 3으로 강제 설정하고 싶다면 이 옵션을 설정하면 됩니다. GDAL 2.2 이전 버전들에서는 기본값이 3이었습니다. GDAL 2.2버전부터, 레이어 도형 유형의 차원을 기본값으로 사용합니다.

  • SPATIAL_INDEX: 레이어 불러오기가 끝났을 때 공간 색인을 자동 생성하지 않으려면 이 옵션을 FALSE로 설정할 수도 있습니다. 레이어 객체 가운데 하나라도 무결한 도형을 가지고 있을 경우 기본적으로 색인을 생성합니다. 기본값은 YES입니다. 주의: GDAL 버전 2 이전 배포판에서는 이 옵션의 이름이 INDEX였습니다.

  • INDEX_PARAMETERS: 공간 색인을 생성했을 때 생성 파라미터를 전송하고 싶다면 이 옵션을 설정하면 됩니다. 예를 들어 이 옵션을 SDO_RTR_PCTFREE=0으로 설정하면 어떤 빈 공간도 없이 R 트리 색인을 생성할 것입니다. 기본적으로 기본 R 트리 색인을 생성하게 만드는 어떤 파라미터도 전송하지 않습니다.

  • ADD_LAYER_GTYPE=YES/NO: CREATE INDEX의 PARAMETERS 절에 있는 layer_gtype 키워드를 통해 공간 색인에 있는 도형 유형에 대한 제약 조건을 비활성화시키고 싶다면 이 옵션을 NO로 설정하면 됩니다. 멀티포인트, 멀티라인스트링 또는 멀티폴리곤 유형의 레이어가 (포인트, 라인스트링, 폴리곤 같은) 단일 도형 유형도 받아들이게 될 것입니다. 기본값은 YES입니다.

  • DIMINFO_X: USER_SDO_GEOM_METADATA 테이블에 작성되는 X 차원 정보를 제어하고 싶다면 이 옵션을 xmin,xmax,xres 값들로 설정하면 됩니다. 기본적으로 실제 작성되는 데이터로부터 범위를 수집합니다.

  • DIMINFO_Y: USER_SDO_GEOM_METADATA 테이블에 작성되는 Y 차원 정보를 제어하고 싶다면 이 옵션을 ymin,ymax,yres 값들로 설정하면 됩니다. 기본적으로 실제 작성되는 데이터로부터 범위를 수집합니다.

  • DIMINFO_Z: USER_SDO_GEOM_METADATA 테이블에 작성되는 Z 차원 정보를 제어하고 싶다면 이 옵션을 zmin,zmax,zres 값들로 설정하면 됩니다. 기본적으로 세 번째 차원을 가진 레이어의 경우 -100000,100000,0.002 고정값을 사용합니다.

  • SRID: 이 드라이버는 기본적으로 MDSYS.CS_SRS 테이블에서 해당 데이터셋의 좌표계와 정확하게 일치하는 WKT 좌표계를 가진 기존 행을 찾으려 시도할 것입니다. 그런 행을 찾지 못 한 경우, 이 테이블에 새로운 행을 추가할 것입니다. SRID 생성 옵션은 기존 오라클 SRID 항목이 이 드라이버가 예상하는 WKT와 정확하게 일치하지 않더라도 사용자가 기존 오라클 SRID 항목을 강제로 사용할 수 있도록 해줍니다.

  • MULTI_LOAD: 이 옵션을 활성화하면 각 객체를 개별 INSERT 명령어로 처리하는 대신 SQL INSERT 명령어 하나 당 새 객체들을 100개 단위의 그룹으로 처리할 것입니다. 이 옵션을 활성화하는 것은 데이터를 가장 빨리 불러올 수 있는 방법입니다. 다중 불러오기 모드는 기본적으로 활성화되어 있는데, NO로 설정해서 기존 레이어 또는 새 레이어에 대해 강제로 비활성화시킬 수 있습니다. 각 그룹의 행 개수는 MULTI_LOAD_COUNT 옵션으로 정의됩니다. 한 번에 행 하나씩 불러오려면 이 옵션을 NO로 설정하십시오.

  • MULTI_LOAD_COUNT: MULTI_LOAD 옵션이 정의하는 기본 100개 대신 각 ARRAY INSERT 명령어에 적용될 객체 개수를 정의합니다. 각 배열 삽입이 트랜잭션을 커밋할 것이기 때문에, 이 옵션과 ogr2ogr 유틸리티의 “-gt N” 스위치를 함께 사용해서는 안 됩니다. 이 옵션을 사용하는 경우 “-gt unlimited” 스위치를 쓰는 편이 좋습니다. 기본값은 100입니다. MULTI_LOAD 및 MULTI_LOAD_COUNT 둘 다 지정하지 않는 경우 100행씩 불러오게 됩니다.

  • FIRST_ID: 첫 행에 있는 ID 열의 첫 번째 숫자값을 정의합니다. 기존 데이터셋에 추가하거나 기존 데이터셋을 업데이트하기 위해 사용하는 경우 열기 옵션으로도 작동합니다.

  • NO_LOGGING: 로그 작성 방지 속성을 가진 테이블 및 도형을 생성하려면 이 옵션을 정의하십시오.

  • LOADER_FILE: 이 옵션을 설정하면 모든 객체 정보를 직접 데이터베이스에 삽입하는 대신 SQL*Loader와 함께 사용하기 적합한 파일로 작성할 것입니다. 레이어 자체는 즉시 데이터베이스에 생성됩니다. SQL*Loader 지원은 실험적인 것으로, 최적화된 불러오기 성능을 원하는 경우 일반적으로 MULTI_LOAD 활성화 모드를 대신 사용해야 합니다.

  • GEOMETRY_NAME: OGR는 기본적으로 새 테이블을 ORA_GEOMETRY라는 도형 열과 함께 생성합니다. 다른 이름을 사용하고 싶다면 이 레이어 생성 옵션으로 지정할 수 있습니다.

레이어 열기 옵션

  • FIRST_ID: FIRST_ID에 대한 레이어 생성 옵션 설명을 참조하십시오.

  • MULTI_LOAD: MULTI_LOAD에 대한 레이어 생성 옵션 설명을 참조하십시오.

  • MULTI_LOAD_COUNT: MULTI_LOAD_COUNT에 대한 레이어 생성 옵션 설명을 참조하십시오.

  • WORKSPACE: 어떤 사용자 작업 공간(workspace)을 사용할지 정의합니다.

예시

  • shapefile을 오라클로 단순 변환합니다. abc.shp 파일의 객체와 abc.dbf 파일의 속성으로 ‘ABC’ 테이블을 생성할 것입니다:

% ogr2ogr -f OCI OCI:warmerda/password@gdal800.dreadfest.com abc.shp
  • 두 번째 예시는 (OGDI 드라이버를 통해) VPF로부터 행정 구역을 불러와서 암호 같은 OGDI 레이어 이름을 좀 더 알기 쉬운 이름으로 재명명합니다. 원하는 이름을 가진 기존 테이블이 존재하는 경우 덮어씁니다:

% ogr2ogr  -f OCI OCI:warmerda/password \
        gltp:/vrf/usr4/mpp1/v0eur/vmaplv0/eurnasia \
        -lco OVERWRITE=yes -nln polbndl_bnd 'polbndl@bnd(*)_line'
  • 다음 예시는 ogrinfo 유틸리티를 이용해서 오라클 내에서 SQL 쿼리 선언문을 평가하는 방법을 보여줍니다. ogrinfo 유틸리티에 ‘-sql’ 명령줄 스위치를 지정해서 좀 더 복잡한 오라클 Spatial 특화 쿼리도 사용할 수 있습니다:

ogrinfo -ro OCI:warmerda/password -sql "SELECT pop_1994 from canada where province_name = 'Alberta'"

감사의 말

이 드라이버는 SRC, LLC 의 재정 지원으로 개발되었습니다.