금요일, 1월 09, 2015

Spatial DB Manager 개발기

올챙이는 웹브라우저에서 DB를 관리하는 툴입니다.  보통의 DB툴은 결과를 Grid에 보여주는데,  Spatial DB Manager는 결과를 Grid, 지도에 보여주는 툴 입니다.

현재 SDM(Spatial DB Manager)는 다음과 같은 기능을 가지고 있어요.

  1. PostgreSQL(Postgis)를 지원하구요. (조만간(?) MSSQL, Oracle ..)
  2. Conntection Manager 창에 지도를 지원하는 디비이면 디비이미지에 G가 표시됩니다. 
  3. Object Explorer의 테이블과 컬럼에도 지도를 데이터가 있다면 G가 표시됩니다. 
  4. 쿼리 에디터 창에서 쿼리를 하면 지도 데이터가 있다면 지도 창이 활성화 되어 보여줍니다.  10만 로우를 검색해도 죽지않고 지도까지 잘 보여집니다.(?)

  5. 쿼리 결과 창에서 데이터를 클릭하면 지도에 도움말 풍선이 표시됩니다.

올챙이를 확장한 SDM은 다음과 같은 구조를 가지고 있습니다.
올챙이는 확장 가능한 부분을 Eclipse extension point로 정의 해 놓았습니다. SDM은 이것을 이용하여 확장하였습니다.

그러면, 어떻게 PostgreSQL가 지도를 지원하는 디비인지 알수 있을까요?
Postgis는 geometry_columns라는 뷰를 제공합니다. 이 뷰는 현재 geometry 테이블과 컬럼, type등을 제공하고 있어서 쿼리하면 어떤 테이블과 컬럼이 공간정보를 지원하는지 알수 있습니다.
다음과 같이요.
SELECT
    f_table_catalog          -- 디비 카탈로그
    ,f_table_schema        -- 공간 테이블 스키마
    ,f_table_name           -- 공간 테이블 이름
    ,f_geometry_column  -- 공간 테이블의 컬럼
    ,coord_dimension      --
    ,srid
    ,type        -- 공간 타입(POINT, MULTILINESTRING, MULTILINESTRING)
  FROM
    geometry_columns;
SDM은 이 뷰를 쿼리하여 Connection Manager, Object Explorer에 G자를 표시해 주었습니다.

그럼, 지도로 표시는 어떻게했을까요? 우선 지도는 Leaflet을 사용하였구요.
사용자가 쿼리 했을때 공간 컬럼인지 알수 있어야 하고, 공간 컬럼일 경우 지도(Leaflet)에 표시하기위해 WKT, WTB, GeoJSON 로 보내야합니다.

사용자가 쿼리 했을 때 공간 컬럼인지는 ResultSet의 ResultSetMetaData를 사용하여 geometry_columns 뷰에서 조회된 컬럼을 비교하여 공간쿼리인지를 알수 있었습니다.
결과를 Leaflet으로 출력하기 위해서GeoJson 형태로 변경해야 했는데, 이것은 postgis가 st_AsGeoJson(st_transform(TADPOLESUB.%s, 4326)) 를 지원하여 변환하였습니다.

예를 들어 공간테이블이 world_cities 이고, 공간 컬럼이 geom 라고 가정을 해보겠습니다.
사용자는
SELECT gid, city, latitude, country, rank, population, longitude, geom
FROM world_cities;  
라고 쿼리를 요청하면 SDM은 위에서 설명하는 과정을 거쳐서 다음과 같이 쿼리를 수정합니다.
SELECT *, st_AsGeoJson(st_transform(TADPOLESUB.geom, 4326)) as TADPOLE_HIDE_geom
FROM
    (SELECT gid, city, latitude, country, rank, population, longitude, geom
     FROM world_cities)
     as TADPOLESUB  
내부적으로 위와 같은 서브 쿼리를 만들어 DB에 쿼리를 요청하고 쿼리 결과를 사용하여 지도에 출력하게 됩니다.


댓글 없음:

댓글 쓰기