목요일, 1월 22, 2015

Spatial DB Manager 개발기 2탄(MSSQL 편)

전편에 쓴 Spatial DB Manager 편(http://hangumkj.blogspot.kr/2015/01/spatial-db-manager.html)에 이이서

이번편은 MSSQL을 어떻게 확장했는지 설명 하도록 하겠습니다.
테스트 된 디비는 MSSQL Server 2008 버전 이구요.

- 해당 디비가 공간 정보를 가지고 있는 지는 다음의 쿼리를 통해 확인 할 수 있습니다.
select *
from INFORMATION_SCHEMA.COLUMNS
where TABLE_CATALOG = '" + userDB.getDb() + "'
and DATA_TYPE like 'geo%'
해당 쿼리를 조회하면 어떤 스키마의 어떤 테이블, 컬럼이 공간 정보인지 볼수 있습니다.

메인 에디터에서 쿼리 결과를 조회해서 지도에 표시하는 다음과 같습니다.
지도는 Leaflet.js를 사용하고, Leaflet.js는 GeoJson을 사용하므로, 쿼리의 결과를 GeoJson으로 바꾸어야 할 필요가 있습니다.
MSSQL은 불행하게도 geojson으로 변환할수 있는 함수가 존재하지 않습니다.   그래서 WKT(컬럼명.STAsText())로 쿼리해 와서 외부 유틸을 통해서 GeoJson으로 바꾸어야 합니다.

mssql 의 공간 정보 처리는 다음(http://msdn.microsoft.com/en-us/library/bb933790.aspx)으로 확인하세요. 

여기 까지 배경 설명이었구요.
그럼, 올챙이에서 사용자가 쿼리를 하면 올챙이는 쿼리 중에 공간 컬럼이 있는지 알아야 하구요.  컬럼의 데이터를 얻어와서 데이터 타입이 공간 컬럼이면 서브 쿼리를 만들었습니다.
TADPOLESUB.%s.STAsText() as " + PublicTadpoleDefine.SPECIAL_USER_DEFINE_HIDE_COLUMN + "%s
이런식으로 서브 쿼리를 만들어서 보여주는 것이지요. (이전 화에서 소개해 드린 postgis도 같은 방법입니다.)

그래서 공간 컬럼을 wkt로 가져와서 GeoTools의 서브 프로젝트인 jts 라이브러리를 이용하여 wkt를 geojson으로 바꾸었습니다.
해당 소스와 진행 사항은 https://github.com/Gaia3D/SpatialDataManager를 통해 계속 보실수 있습니다.

댓글 없음:

댓글 쓰기