Oracle Spatial SQL 정리

공간서버에 Spatial 오라클을 지원하면서 파악한 SQL문을 정리해 봅니다. 먼저 오라클에 정의된 Spatial Table의 전체 MBR을 얻는 SQL 문입니다.

SELECT 
    SDO_AGGR_MBR(geometry) 
FROM {SCHEMA}.{TABLE};

이 SDO_AGGR_MBR은 레코드 하나 하나에 대한 지오메트리의 MBR을 얻어 합하는 방식 같다는 생각으로 상당히 비효율적인 구문같습니다. 해당 테이블에 대해서 한번에 MBR을 얻는 방법이 있을듯하니 추후에 파악해 보렵니다.

다음은 해당 테이블의 필드명과 필드 타입을 얻는 SQL 문입니다.

SELECT 
    COLUMN_NAME, DATA_TYPE 
FROM 
    ALL_TAB_COLUMNS 
WHERE 
    OWNER='{SCHEMA}' AND TABLE_NAME='{TABLE}';

다음은 지정된 MBR에 대해 중첩된 지오메트리만을 검색해 주는 SQL 문입니다.

SELECT 
    GEOMETRY 
FROM 
    {SCHEMA}.{TABLE}
WHERE 
    SDO_ANYINTERACT(
        GEOMETRY, 
        SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), 
        SDO_ORDINATE_ARRAY({MinX},{MinY},{MaxX},{MaxY))
    ) = 'TRUE';

이 SQL 문은 실운영되는 오라클 서버에서 간단히 테스트는 했는데 좀더 다양한 환경에서 테스트해 볼 필요가 있을듯합니다.

오라클은 공간DB에 대해서 일반적인 GIS의 Simple Feature 정의를 따르지 않습니다. 하나의 테이블에 폴리곤, 포인트, 커브이 섞여 있을 수 있습니다. 여기서 커브(Curve)는 GIS에서 흔히 말하는 폴리라인이나 라인스트링을 포함하는 것으로 호(Arc)와 같은 표현이 가능합니다.

또한 하나의 Geometry에 대해서도 커브와 포인트 그리고 폴리곤이 섞여 있을 수도 있습니다. 그리고 도형의 회전을 위한 매트릭스 정보가 좌표값을 담는 구조체에 존재합니다.

오라클의 공간DB 구조… 명확하고 심플한 GIS 분야에서는 만만치 않는 놈이네요. 아직 정리되지 않는 글인데 머리가 아파 조금이라도 정리를 해보고자 글을 남겨봅니다.

DEM 파일 변환 – FLT2DEM

그리드(Grid) 데이터 포맷 중 FLT가 있습니다. 이 FLT는 그리드 데이터로부터 ArcGIS와 같은 프로그램을 통해 변환될 수 있는 포맷입니다. 이 프로그램은 FLT 파일을 DEM 형식으로 변환해주는데 여기서 말하는 DEM 데이터는 텍스트 포맷으로 X, Y, Z 값에 대한 리스트 형식입니다.

위의 실행 화면처럼 FLT 파일을 입력하고 변환하고자 하는 DEM 파일명을 지정하고 변환하면 됩니다. 변환된 DEM의 내용은 아래의 예와 같습니다.

이 프로그램은 아래의 링크를 통해 다운로드 받으실 수 있습니다.

APK에 데이터 파일 넣어 사용하기

안드로이드 설치 패키지인 APK 파일에는 이미지, 문자열 등과 같은 데이터뿐만 아니라 임이의 데이터 파일도 넣어 사용할 수 있습니다. 이러한 임이의 데이터 파일은 res 폴더의 서브 폴더인 raw를 직접 만들어 넣어주면 됩니다.

이러한 방식으로 데이터 파일을 저장해 두면 다음의 코드를 통해 해당 데이터 파일에 접근할 수 있는 InputStream 객체를 얻을 수 있습니다.

InputStream database_db = 
    map.getContext().getResources().openRawResource(R.raw.database_db);

이제 이 InputStream 객체를 통해 원하는 디렉토리에 해당 데이터 파일을 복사하고 사용할 수 있습니다. 아래의 코드는 InputStream 객체에 담겨진 데이터를 원하는 파일명으로 저장해 주는 함수입니다.

private boolean copy(InputStream in, String fileName) {
    try {
        OutputStream os = new FileOutputStream(fileName);
        byte[] buffer = new byte[1024];
        int bytesRead;
        while((bytesRead = in.read(buffer)) !=-1) {
            os.write(buffer, 0, bytesRead);
        }
	        
        os.flush();
        os.close();
    } catch (IOException e) {
        return false;
    }

    return true;
}

Geocoder-Xr의 OpenAPI Key 발급

좌표를 주소로 변환해 주는 툴인 Geocoder-Xr은 다음, 네이버, 구글의 좌표변환 API를 사용합니다. 간혹 Geocoder-Xr에서 변환이 않된다는 분들이 계셨고, 대부분의 이유는 OpenAPI Key 문제입니다. 기본적으로 Geocoder-Xr에 등록된 Key에 대한 사용량 초과로 인해 발생하는 것으로, 이 문제를 해결하기 위해서는 직접 사용자 개인의 OpenAPI Key를 발급받아 등록을 하시면 됩니다. Geocoder-Xr에서 이 OpenAPI 키를 등록하는 방법은 아래 화면을 참고하시기 바랍니다.

사용자 삽입 이미지
보시는 것처럼 먼저 화면 좌하단의 OpenAPI Key 관리 버튼을 클릭해 표시되는 대화상자에서 자신의 OpenAPI Key를 입력하시면 됩니다. 그럼 이 대화상에서 입력할 수 있는 OpenAPI Key를 발급받기 위해서 다음과 네이버에 대해 간단히 설명을 드리겠습니다.

먼저 기본적으로 다음과 네이버 모두 자신의 ID로 로그인이 되어 있다는 가정 하에 설명합니다. 먼저 다음(Daum)의 경우는 다음 화면을 통해 OpenAPI Key를 발급받을 수 있습니다. 화면을 클릭하면 전체 이미지를 볼 수 있으므로 정확한 URL을 볼 수 있습니다.

사용자 삽입 이미지
그리고 네이버에서 OpenAPI Key를 발급받기 위해서는 아래의 화면을 참고하시기 바랍니다. 화면을 클릭하면 큰 화면으로 표시되어 정확한 URL을 볼 수 있습니다.

사용자 삽입 이미지