[GIS] 듀라맵을 이용한 폴리곤 자르기(Split) 데모
듀라맵을 이용한 공간 분석 시스템을 작년부터 진행하고 있었습니다. 1차 마무리를 하고 추가 요구사항이 생김으로써, 해당 요구사항을 반영하면서 해당 내용 중 필요한 일부 기능인 폴리곤 자르기에 대한 데모를 동영상으로 소개합니다.
듀라맵은 작지만 GIS 엔진으로써 갖춰야할 전반적이고 기본적인 기능을 모두 갖추고 있습니다. 또한 이러한 GIS에 대한 기본 기능을 통해 보다 고도화된 고급기능을 PlugIn 형태로 확장할 수 있습니다.
[GIS] Mr.Tlier-Xr를 이용한 공간데이터 편집
Mr.Tiler-Xr은 수치지도를 디자인하고 타일맵으로 가공해 주는 기능과 함께 수치지도에 대한 도형 및 속성을 편집할 수 있는 프로그램입니다. 아래는 공간 데이터를 편집하기 위해 Mr.Tiler-Xr를 사용하고 있는 화면 예시입니다.

도형 편집을 위한 보조 기능으로 정점 및 선분에 대한 스냅핑 기능과 편집 이력에 대한 되돌리기와 재실행 기능을 제공합니다.
[GIS] 도로명 주소 UI 만들기 위한 SQL 문
국내에서 제공하는 공간데이터 중 행안부의 새주소 데이터를 이용해 도로명 주소 UI를 만들기 위한 SQL문을 정리해 보려 합니다. 행정구역은 서울시를 대상으로 하겠습니다. 도로명 주소 체계가 특정 지역에 대해 특이사항이 있는 것은 아니지만.. 일단 서울시의 경우 도로명 주소는 구를 선택하면 해당 구에 소속된 도로명들이 존재합니다.
서울시 하나의 구에 대한 도로명은 개수는 상당히 많아 선택된 구에 대한 도로명을 하나의 컴보박스 컨트롤을 통해 집어 넣으면 사용자가 선택하기 어렵습니다. 해서 다음의 UI처럼 선택된 구에 대한 도로명을 ㄱ,ㄴ,ㄷ 과 같은 첫자에 대한 자음으로 분류하는 방법을 사용합니다.

위의 그림에서 A Part에는 ㄱ,ㄴ,ㄷ과 같은 도로명에 대한 첫자의 자음의 리스트이고 B Part는 선택 자음에 대한 도로명의 리스트입니다. 행안부에서 제공하는 도로명 DB는 tl_sprd_manage입니다. 먼저 A Part를 구성하기 위한 SQL(MSSQL Server 기준) 문은 다음과 같습니다.
select distinct GetConsonant(SUBSTRING(RN,1,1))
from tl_sprd_manage
where SIG_CD = ‘{SIG_CD} '
group by RN
{SIG_CD}는 서울시의 구에 대한 5자리의 행정코드 값입니다. 또한 위의 SQL 문에는 GetConsonat 함수가 사용되었습니다. 이 함수에 대한 정의는 다음과 같습니다.
create FUNCTION GetConsonant
(
@STR AS NVARCHAR(100)
)
RETURNS NVARCHAR(100)
AS
BEGIN
DECLARE @STR_N NVARCHAR(100)
DECLARE @STR_S NVARCHAR(100)
WHILE (LEN(@STR) > 0)
BEGIN
SET @STR_N = SUBSTRING(@STR, 1, 1)
SET @STR = SUBSTRING(@STR, 2, LEN(@STR))
SET @STR_S = ISNULL(@STR_S, '') +
(CASE WHEN @STR_N BETWEEN '가' AND '깋' THEN 'ㄱ'
WHEN @STR_N BETWEEN '나' AND '닣' THEN 'ㄴ'
WHEN @STR_N BETWEEN '다' AND '딯' THEN 'ㄷ'
WHEN @STR_N BETWEEN '라' AND '맇' THEN 'ㄹ'
WHEN @STR_N BETWEEN '마' AND '밓' THEN 'ㅁ'
WHEN @STR_N BETWEEN '바' AND '빟' THEN 'ㅂ'
WHEN @STR_N BETWEEN '사' AND '싷' THEN 'ㅅ'
WHEN @STR_N BETWEEN '아' AND '잏' THEN 'ㅇ'
WHEN @STR_N BETWEEN '자' AND '짛' THEN 'ㅈ'
WHEN @STR_N BETWEEN '차' AND '칳' THEN 'ㅊ'
WHEN @STR_N BETWEEN '카' AND '킿' THEN 'ㅋ'
WHEN @STR_N BETWEEN '타' AND '팋' THEN 'ㅌ'
WHEN @STR_N BETWEEN '파' AND '핗' THEN 'ㅍ'
WHEN @STR_N BETWEEN '하' AND '힣' THEN 'ㅎ'
ELSE @STR_N END)
END
RETURN @STR_S
END
이제 B Part에 대한 SQL문을 살펴보면 다음과 같습니다.
select RN, RN_CD from tl_sprd_manage where SIG_CD = ‘{SIG_CD}'
and GetConsonant(SUBSTRING(RN,1,1))='ㄱ'
group by RN, RN_CD order by RN
위의 SQL은 A Part에서 ‘ㄱ’을 선택했을때 ‘ㄱ’으로 시작하는 도로명의 리스트를 뽑아냅니다. 참고로 RN은 도로명이며 RN_CD는 도로명에 대한 코드값입니다.
geos3.2.2에서 intersects 연산에서 주의할 것
듀라맵이 GEOS 라이브러리를 사용합니다. 공간연산을 위해 사용하는 라이브러리인데.. 공간데이터를 가공하기 위해 듀라맵으로 툴을 만들어 사용하고 있었는데.. 이상한 현상이 발생해서 문제를 쫓다 쫓다.. 쫓다가.. 또 쫓다가.. 쫓다가.. 쫓다가.. 결국 GEOS에서 문제를 발견하여 그 내용을 정리해 봅니다. 나중에 잊을 소지가 다분하므로…
아래와 같은 도형이 있습니다. 사각형 폴리곤 하나와 4개의 포인트라고 할때 이 4개의 포인트는 사각형 폴리곤 가장자리에 정확히 일치해서 놓입니다. 4개는 각각 사각형 폴리곤의 왼쪽 모서리, 오른쪽 모서리, 위쪽 모서리, 아래쪽 모서리에 놓입니다.
사각형에 대한 지오메트리에 대해서 포인트 1, 2, 3, 4에 대해 intersets 연산을 수행하면 희한하게도 1과 2는 intersets가 false를 반환하고 3과 4는 true를 반환합니다. 제가 사용하는 GEOS의 버전이 3.2.2인데.. 오늘 오랜만에 GEOS의 공식 배포 사이트에 보니 올해 1월말에 3.3.7로 올랐군요. 아마도 분명… 새로운 버전에서는 이러한 문제가 해결되었다고 생각합니다. 언제 시간을 내서 GEOS의 새로운 버전으로 변경해서 듀라맵을 배포해야겠습니다.

