[GIS] 유용한 PostGIS의 SQL 문

geometry 필드를 가진 테이블이 구성하는 Row들이 구성하는 하나의 MBR을 얻는 쿼리문은 아래와 같으며 결과는 BOX(MinX MinY, MaxX MaxY) 형태입니다.

select ST_extent(the_geom) from public."tst_Table";

다음은 지정된 테이블의 스키마를 얻는 쿼리문입니다. attname은 필드명이며 atttypid는 필드타입에 대한 id 코드입니다. 그리고 atttypmod는 타입이 가변 길이 문자열(varchar type)일때 허용 최대 길이이며 실제보다 4만큼 더 크며 타입이 문자열이 아니면 -1입니다.

SELECT
    attname, atttypid, atttypmod
FROM 
    pg_attribute, pg_type
WHERE 
    typname = 'tst_Table' AND 
    attrelid = typrelid AND 
    attname NOT IN ('cmin', 'cmax', 'ctid', 'oid', 'tableoid', 'xmin', 'xmax');

atttypid에 대한 코드값에 해당하는 의미는 다음과 같습니다.

  • atttypid=16 : ‘boolean’
  • atttypid=17 : ‘bytea’
  • atttypid=18 : ‘char’
  • atttypid=19 : ‘name’
  • atttypid=20 : ‘int8’
  • atttypid=21 : ‘int2’
  • atttypid=22 : ‘int2vector’
  • atttypid=23 : ‘int4’
  • atttypid=24 : ‘regproc’
  • atttypid=25 : ‘text’
  • atttypid=26 : ‘oid’
  • atttypid=27 : ‘tid’
  • atttypid=28 : ‘xid’
  • atttypid=29 : ‘cid’
  • atttypid=30 : ‘oidvector’
  • atttypid=210 : ‘smgr’
  • atttypid=700 : ‘float4’
  • atttypid=701 : ‘float8’
  • atttypid=702 : ‘abstime’
  • atttypid=705 : ‘unknown’
  • atttypid=1007 : ‘_int4’
  • atttypid=1033 : ‘aclitem’
  • atttypid=1034 : ‘_aclitem’
  • atttypid=1042 : ‘bpchar’
  • atttypid=1043 : ‘varchar’
  • atttypid=1082 : ‘date’
  • atttypid=1083 : ‘time’
  • atttypid=1184 : ‘timestamp’
  • atttypid=1266 : ‘timetz’
  • atttypid=1700 : ‘numeric’
  • atttypid=2500 : ‘int1’
  • atttypid=2569 : ‘nucl’
  • atttypid=2570 : ‘prot’
  • atttypid=2522 : ‘nchar’
  • atttypid=2530 : ‘nvarchar’
  • atttypid=278 : ‘ntext’

다음은 geometry를 가지는 테이블의 지오메트리 타입을 얻는 쿼리문인데 하나의 테이블에 동일한 지오메트리 타입을 가지는 도형만 저장하고 있다는 가정이 필요합니다.

select GeometryType(the_geom) from public."tst_Table" limit 1;

그리고 어떤 MBR에 걸치는 도형을 공간검색하는 쿼리문은 다음과 같습니다.

SELECT
    the_geom
FROM  
    public."tst_Table"
WHERE 
    ST_Intersects 
    (
        the_geom, 
        ST_MakeEnvelope(456315, 382558, 460432, 386381, -1)
    );

위의 공간검색 쿼리는 PostGIS의 JDBC API를 사용하면 쉽게 지오메트리의 타입과 좌표값 등을 얻을 수 있습니다. 물론 자바 언어뿐 아니라 C언어에 대한 API도 제공합니다.

위의 SQL문은 MBR을 기준으로 MBR과 중첩되는 것을 검색하는 예이며 아래는 기준을 일반적인 지오메트리를 WKT 형식으로 받아 중첩되는 것을 검색하는 예입니다.

SELECT 
    *, ST_BOX2D(the_geom) 
FROM 
    public."tst_Table"
WHERE 
    ST_Intersects
    (
        the_geom, 
        'LINESTRING (244049 543725, 244134 543762)'::geometry
    );

덧붙여 검색 필드로써 ST_BOX2D를 사용해 검색된 항목의 MBR까지 얻어오도록 하였습니다.

[GIS] GeoService-Xr에서 새로운 DBMS 추가를 위한 인터페이스 구현

새로운 DBMS를 GeoService-Xr에 추가하기 위한 클래스 간의 관계를 정리해 봅니다. 이번에 새롭게 추가해야할 DBMS는 PostgreSQL에 기반한 PostGIS입니다. PostGIS이므로 공간검색이나 공간 데이터에 대한 관리는 모두 PostGIS의 기능을 그대로 사용합니다. 시간 상으로 PostGIS를 깊이 있게 살펴본 상태는 아니지만.. 지금까지의 느낌으로는 깔끔합니다. 속도 역시 빠릅니다. 아래 그림은 새로운 DBMS 추가 확장에 대해 관련이 있는 클래스만을 떼어 놓은 GeoService-Xr의 클래스 관계도입니다.

사용자 삽입 이미지
보시면… GeoService-Xr이 지원하고 있는 공간 데이터의 소스가 어떤 것인지를 알 수 있습니다. 현재는 파일기반, MySQL 그리고 ArcSDE입니다. 여기에 더해질 PostGIS가 가능합니다. 또한 편집이 가능한 데이터 소스는 MySQL과 PostGIS라는 것도 파악할 수 있습니다. 즉, 편집을 위한 인터페이스를 선언하고 있는 클래스가 XrEditableSpatialAccess인데 이 클래스를 상속받고 있는 클래스가 XrMySqlAccess와 XrPostGISAccess이기 때문입니다.

공간 데이터 서비스 및 공간 데이터의 편집이 가능한 공간 DBMS를 새롭게 추가하기 위해서 XrEditableSpatialAccess를 상속받아야 하며.. 이때 구현해야할 인터페이스 매서드의 개수는 13개입니다. 먼저 최상위의 Access 클래스에 대해 구현해야할 추상 매서드는 다음과 같습니다.

  • getAccessType : Access의 타입 반환함(AccessType이라는 enum 타입의 값 반환)
  • connect : 파일 열기, 소켓 오픈 등과 같은 데이터 소스 접근 준비
  • build : 파일이나 DB로부터 공간 쿼리가 실제 가능하도록 준비

그리고 SpatialAccess에 대해 구현해야 할 추상 매서드는 다음과 같습니다.

  • getMBR : 지정된 row에 대한 MBR을 얻음
  • collectConnectionInfo : 필드구성, 전체 row 수, 공간 도형 타입, MBR 정보를 얻음
  • queryByMBR : MBR에 포함되는 공간 데이터를 쿼리함

그리고 최종적으로 XrEditableSpatialAccess에 대해 구현해 줘야할 추상 매서드는 다음과 같습니다. 만약 편집 기능이 필요치 않을 경우 이 클래스의 추상 매서드는 구현할 필요가 없습니다.

  • updateFeature : 편집된 공간 데이터를 update 시킴
  • deleteFeature : 지정된 공간 데이터를 삭제함
  • insertFeature : 새로운 공간 데이터를 추가시킴
  • checkExistFID : 지정한 FID가 이미 존재하는지 검사함
  • checkExistFIDs : 지정한 FID 리스트가 존재하는지 검사함
  • writeEditedHistoryData : 공간 데이터에 대한 편집 이력을 기록함(반드시 구현할 필요는 없음)
  • getDBResource : 데이터 소스에 접근하기 위한 DB 리소스를 얻음

이상으로 XrGeoService-Xr 공간 서버에서 새로운 DBMS를 새롭게 지원하기 위해 구현해야할 인터페이스에 대한 정리였습니다.

[GIS] FingerEyes-Xr, 안드로이드 플래폼 지원

핑거아이즈(소개)는 플래시 기반의 GIS 엔진입니다. 웹에서 데스크탑 못지 않은 GIS의 기능을 지원하기 위해 개발한 제품입니다. 이번에 여러가지 다각적인 검토와 보완을 통해 핑거아이즈의 모든 기능을 안드로이드에서 지원할 수 있게 되었습니다.사용자 삽입 이미지위의 화면은 삼성 갤럭시에서 실제로 핑거아이즈를 구동시켜본 화면입니다. 타일맵을 통한 베이스맵 표현에서 시작해 수치지도의 피쳐를 터치하여 속성을 확인하고 편집하는 등의 핑거아이즈 모든 기능을 안드로이드에서 그대로 실행할 수 있습니다.

이제 핑거아이즈를 통해 하나의 GIS 시스템을 개발하게 되면 데스크탑에서는 물론 안드로이드 기반의 디바이스에서도 동일하게 GIS 시스템을 구동할 수 있습니다.

DuraMap-Xr 소개 및 다운로드

듀라맵은 3.5MB 크기의 단 하나의 dll 파일로 구성되어 있는 매우 작은 크기의 경량 지도 엔진입니다. 꼭 필요한 기능만을 담아 최적화 되어 있으며 빠른 퍼포먼스를 제공합니다. 듀라맵은 GIS 맵엔진으로써 작지만 매운 꼬추라고 할 수 있겠습니다. 프로그래밍이 가능한 분이라면 DuraMap-Xr을 이용하여 GIS 시스템 개발은 물론 공간 데이터를 다양하게 생성하고 가공할 수 있으며 공간분석 알고리즘을 실제로 구현할 수 있는 API를 제공합니다.

DuraMap-Xr은 COM을 지원하는 프로그래밍 언어에서 사용할 수 있는 컴포넌트이며 VB, Delphi, C#, C++을 이용하여 C/S 기반의 어플리케이션을 개발할 수 있으며 HTML과 자바스크립트를 이용하여 웹브라우저에서 운영되는 웹 GIS 시스템을 쉽게 개발할 수 있습니다(하지만 저희는 ActiveX인 듀라맵을 이용하여 웹기반의 시스템 개발을 권장하지 않습니다). DuraMap-Xr은 기본적으로 다음과 같은 큰 범주의 기능을 제공합니다. (자세한 내용에 대해서 각 항목 클릭 가능)

위의 기능은 DuraMap-Xr 맵 엔진을 통해 로컬에 저장된 공간 데이터를 대상으로 수행되는 기능이며 동시에 원격으로 분리된 서버로부터 제공되는 공간 데이터에 대해서도 동일하게 지원됩니다. 공간 데이터 서비스는 GeoService-Xr 공간서버로부터 제공됩니다.

듀라맵에서 항공영상 또는 위성영상(geotiff)을 자체포맷 형태로 표시하고 싶을 경우 변환툴은 다음 url을 통해 다운받으실 수 있습니다.

듀라맵(DuraMap-Xr)과 블랙포인트(BlackPoint-Xr)의 항공영상(위성영상) 자체 포맷 변환툴

DuraMap-Xr은 단일 파일(DuraMap-Xr.dll)로 구성됩니다. 기능을 확장할 수 있는 플러그인 기능 개발을 위한 COM 객체도 이 파일 안에 포함합니다. DuraMap-Xr을 설치하기 위해서는 아래의 URL에서 설치 프로그램을 통해 쉽게 하실 수 있습니다.

DuraMap-Xr 설치자 프로그램   

설치자 프로그램을 사용하지 않고 직접 DuraMap-Xr.dll을 등록하고 설치하기 위해서는 다음과 같은 절차로 할 수 있습니다.

(등록방법 동영상)   

  1. DuraMap-Xr.dll을 다운로드(지오서비스 자료실)받습니다. 
  2. DuraMap-Xr.dll을 원하는 폴더에 저장합니다.
  3. 명령 프롬프트 창을 실행합니다. (비스타 또는 윈7에서는 관리자 권한으로 실행)
  4. 명령 프롬프트 창에서 DuraMap-Xr.dll이 저장된 폴더로 이동합니다.
  5. regsvr32 DuraMap-Xr.dll을 입력하여 등록합니다.

아래의 그림은 명령 프롬프트 창에서 XrMap.dll을 등록하는 화면입니다. (D:\ 드라이브의 DuraMap 폴더에 DuraMap-Xr.dll 복사된 경우의 예)

사용자 삽입 이미지

성공적으로 등록이 되면 다음과 같은 메세지가 표시됩니다.

사용자 삽입 이미지

등록이 완료되면 C# 또는 C++, 델파이, VB나 IE에서 자바 스크립트를 이용하여 DuraMap-Xr을 사용할 수 있습니다. 끝으로 DuraMap-Xr의 API에 대한 튜토리얼은 다음 URL과 같습니다.

DuraMap-Xr 글 검색

또한 DuraMap-Xr에 대한 질문과 개선점에 대한 건의는 hjkim@geoservice.co.kr로 메일 주시기기 바랍니다.