[GIS] Xr로 만든 간단한 지도 이미지..

서울시의 구에 대한 shp 파일 하나만을 가지고 Xr 맵엔진에서 표출해 본 지도 이미지 입니다. 디자이너를 위한 지도 데코레이션 툴을 만들고 있는 중에… 머리도 복잡하여 한번 테스트 겸 간단히 만들어 보았는데.. 아직은 많은 부분에서 밋밋한 분위기입니다만.. 좀더 다양한 레이어와 POI 그리고 아이콘 등으로 장식을 하면 보다 이쁜 지도 이미지가 나오지 않을까 기대를 해봅니다.
사용자 삽입 이미지
지금 개발하고 있는 디자이너를 위한 툴은 Xr 맵엔진을 기반으로 해 만든 툴로써 추후 지도 타일 이미지를 만들기 위한 툴입니다. 추후 개발할 RIA 기술을 적용한 엔진에서 사용할 지도 이미지를 만들기 위한 목적으로 개발되고 있습니다.

참고로 이툴에 사용되는 Xr  클라이언트 맵엔진은 오픈소스를 목적으로 개발하고 있습니다. 추후 어느 정도 안정화되고 가닦이 잡히면 소스를 공개할 예정입니다. 소스를 공개하는 이유는 향후 보다 많은 분들의 의견 수렴을 받기 위함입니다. 기능적인 부분에서 뿐만이라 지도 이미지의 비주얼적인 모습에 대한 조언을 듣고 적당하다면 적극적으로 수렴할 계획입니다.

그리고 아래는 도로 중심선(Polyline) 데이터에 대한 하나의 shp 파일을 이용해 만들어본 지도 이미지입니다.

사용자 삽입 이미지
참고로 아래는 예전에 올렸던, Xr 맵 엔진을 이용해 만든 지도 이미지입니다. 이 글과 연관이 깊어 다시 한번 함께 올려봅니다.
사용자 삽입 이미지

Java 프로세스의 종료시점 후킹

자신이 개발하고 있는 어플리케이션을 완전히 제어하고픈 개발자(나를 포함한..)에게 Java에 매우 좋은 API를 제공합니다. 바로 Java 프로세스의 종료 시점을 어떠한 상황에서든 잡아 내 그 시점에서 원하는 코드를 실행하게 할 수 있는 방법인데요.. 아래의 간단한 코드를 살펴 보는 것으로 시작하겠습니다.

public class TestMain {
    public static void main(String[] args) throws InterruptedException {
        System.out.println("processing something in main(" + 
            Thread.currentThread().getName() + ") start...");
  
        Runtime rt = Runtime.getRuntime();
  
        rt.addShutdownHook(
            new Thread() {
                public void run() {
                    System.out.println("======================");
                    System.out.println("do arrange resource !!");
                    System.out.println("======================");
            }
        } );
  
        System.out.println("Waiting while 10 seconds or hit ^C for exit.");
  
        Thread.sleep(10000);
        System.out.println("processing something in main end...");
        System.exit(0);
  
        System.out.println("this code never run!");
    }
}

핵심은 바로 Runtime.getRuntime()으로 얻어진 Runtime 타입의 인스턴스입니다. 이 인스턴스에 addShutdownHook 매서드를 통해 자바 가상 머신이 종료하는 시점에서 실행하는 코드를 개발자가 유연하게(얼마까지 유연할지는 모르겠지만…) 붙일 수 있습니다. 자바 어플리케이션이 콘솔이여서 ^C를 눌러 강제로 종료시키든… 예외나 에러가 발생하든 Runtime의 addShutdownHook로 지정한 스레드의 실행(run) 로직은 반드시 실행된다는 점입니다.

주어진 좌표와 선분 사이의 주어진 거리에 위치하는 선분의 좌표 구하기

사용자 삽입 이미지
제목이 난해하니 먼저 그림부터 보였습니다. 주어진 선분이 있습니다. 이 선분의 시작점은 (X1, Y1)이고 끝점은 (X2, Y2)입니다. 그리고 주어진 좌표가 있으며 (a, b)입니다. 이 선분과 좌표에 대해서 거리 ln를 가지는 선분상의 좌표를 구하는 것에 대한 정리 포스트입니다. 즉, 위의 그림에서 파란색 점은 주어진 좌표이고 빨간 점을 구하겠다는 것입니다.

먼저 선분에 대한 아래와 같은 매개변수 방정식을 정합니다.

사용자 삽입 이미지
우리가 구해야할 점은 선분상의 점이니 위의 매개변수 방정식에서 x와 y가 바로 우리가 원하는 값입니다. 이 x와 y를 구하기 위해서는 매개변수 t를 구하면 됩니다. 아시겠지만 t가 주어진 선분위에 존재하려면 0~1사이의 값이여야 합니다. 이 값을 벗어나면 답은 없음… 입니다.

이 한가지 관계만 가지고는 않됩니다. 또 하나의 관계를 맺어줘야 합니다. 그 관계는 주어진 좌표(a, b)와 구하고자 하는 선분상의 점(x, y)사이의 거리가 값 ln이라는 사실로부터 다음과 같은 식을 얻을 수 있습니다.

사용자 삽입 이미지
이제 처음 선분에 대한 방정식을 위의 방정식의 x, y에 대입하고 t에 대해 정리를 하면 아래와 같은 t에 대한 2차 방정식이 도출되며 이 2차 방정식을 근의 공식을 통해 t를 구해 보면 다음과 같습니다.

사용자 삽입 이미지
이렇게 구한 t에 대해서 범위가 0~1사이 인지를 검사하고 이 범위에 있다면 이 t를 선분의 방정식에 대입하여 구한 (x, y)가 구하고자 하는 좌표입니다.

지도 엔진의 라벨 회전 기능

오늘 또 김연아의 무결점 환상 연기.. 단 한차례의 NG도 없는.. 역대 최고의 점수를 획득했습니다. 정말 자랑스럽습니다..!

GIS 데이터를 그래픽 요소와 문자 요소를 기준으로 살펴보면 도형 데이터와 속성 데이터로 구분됩니다. 이때 도형에 대한 속성을 화면상에 표시하는 것을 라벨(Label) 또는 주기(Annotation)이라고 하는데.. 이 라벨을 표현하는 방법 또한 다양합니다. 단순히 속성 값을 표시하는 것에서 부터.. 다수의 속성을 표현식으로 조합하여 표현하는 방식과 멀티 라인 속성 방식.. 그리고 폴리라인을 따라 회전하는 표현 방식이 있습니다.

사용자 삽입 이미지
위의 이미지는 Xr 맵엔진에서 각 도형에 해당되는 속성을 도형에 따라 회전하며 라벨 텍스트를 표현하는 방식입니다. 이런 표현 방식은 위의 이미지처럼 도로명을 표현할때 매우 효과적인 방식입니다. Xr 맵 엔진은 지도 타일 이미지를 전문적으로 렌더링하기 위한 1차 목표를 추구하기 위한 맵 엔진입니다. 최근 RIA를 기반으로 한 지도 엔진 개발을 최종 목표로 하고 있는 프로젝트에서 Xr 맵 엔진은 첫 관문으로써 매우 중요한 의미를 가지고 있습니다.

Mobile 3D Graphics, 역자 서문 작성 완료..!

사용자 삽입 이미지9월말에 번역 끝내고 출판사에 보냈더랬습니다. 대략 1달정도 교정되어 인쇄된 교정지를 받아보고 참으로 감동스러웠더랬는데… 다시 교정하시는 분이 지적한 부분을 보완해서 보내고.. 다시 2주 정도 기다린 지금.. 역자 서문을 요청 받아 그것까지 보냈습니다. 아마 11월 말쯤 출판이 된다고 하니.. 실제로 출판된 책을 보면 또 어떤 기분일지 궁금합니다..

아래는 오늘 작성해서 보낸 역자 서문입니다. 이 서문은 교정을 보지 않아서 어색한 부분이 많습니다. 이해해 주시고 살펴보시면 감사하겠습니다..

역자 서문


현대의 컴퓨팅 환경은 웹을 뛰어 넘어 언제 어디서나 원하는 정보를 쉽게 접근할 수 있는 모바일 디바이스를 이용한 모바일 플랫폼이 대세를 이루고 있다.


개발자에게 모바일 플랫폼에서의 개발 환경은 마이크로소프트의 Windows Mobile, 구글의 안드로이드, 애플의 iPhone 등이 있습니다. 이들 모두가 서로 상이한 개발 API를 제공함으로써 개발자를 혼란스럽게 하지만 3차원 그래픽 개발에 있어서는 OpenGL ES나 M3G라는 공개된 표준 API를 제공하여 개발 방법을 단일화 해주고 있습니다.


C/C++과 같은 네이티브 언어에서의 OpenGL ES와 Java에서의 M3G라는 표준 API를 사용함으로써 거의 대부분의 모바일 플랫폼에서 개발자가 원하는 3차원 그래픽 어플리케이션을 개발할 수 있는 편의성과 효율성을 제공해 주고 있습니다.


향후 수년 내에 모바일 폰과 같은 디바이스가 지금의 데스크탑 PC는 물론 노트북을 대체할 것이라는 전망이 있습니다. 하지만 이런 전망이 현실화되기까지는 아직 해결 해야 할 과제가 많습니다. 하지만 모바일 폰이 PC나 노트북에서만 가능한 영역을 하나 하나 대체해 나갈 것이라는 사실은 부인할 수 없습니다. 이러한 사실을 놓고 볼 때 향후 사용자의 컴퓨팅 환경에서 데이터를 효과적으로 표현하고 사용자 경험(UX)를 극대화시키기 위한 사용자 인터페이스를 효과적으로 제공하기 위하여 3D 그래픽은 미래의 어플리케이션에서 필수불가결한 요소가 될 것입니다.


이 책은 자신이 개발하고 있는 모바일 어플리케이션에 3D 그래픽 기능을 체계적이고 효과적으로 추가할 수 있도록 모바일 3D 그래픽 API인 OpenGL ES와 M3G를 자세하고 명확하게 설명합니다. 또한 저자들의 경험을 통해 빠지기 쉬운 함정에 대한 해법을 제시해 주고 있습니다. 그리고 3D 그래픽에 대한 수학적인 내용을 꼼꼼히 설명하여 더 정교하게 3D 그래픽 API를 사용할 수 있도록 하였습니다.


특히 이 책의 저자들 모두가 OpenGL ES와 M3G의 명세서 정의에서부터 구현까지 참여했던 코어 개발자이며 아키텍쳐임과 동시에 모바일 3D 그래픽 분야의 리더들이라는 점에서 이 책의 가치가 더욱 빛납니다.


끝으로 이 책의 번역할 수 있는 기회를 준 사이텍미디어의 홍성신 대리님과 부족한 원고를 교정해주고 편집해준 사이텍미디어의 박경민님께 감사드립니다. 그리고 수개월동안 회사생활과 이 책의 번역을 함께 하며 항상 즐겁지만은 않았을 저에게 항상 밝은 모습으로 응원해 준 아내 지은이에게 끝없는 사랑과 감사를 전합니다.