마이크로소프트사의 딥줌 이미지(Deep Zoom Image)포맷

사용자 삽입 이미지
위의 툴은 딥줌 이미지 데이터를 만들어주는 마이크로소프트 사의 Deep Zoom Composer입니다. 여기서 말하는 Deep Zoom이란.. 매우 큰 크기의 이미지를 인터넷 상에서 빠르게 보여주도록 하는 형식입니다.

딥줌 형식으로 이미지를 구성해 놓으면 .NET을 이용해 인터넷에서 쉽게 방대한 크기의 이미지를 빠르게 서비스할 수 있기 때문에.. GIS 분야에서 지도 서비스에 응용해 볼만한 기술로 생각됩니다. 비록 지도 좌표계의 개념이 없고.. 방대한 크기라고는 하나.. 크기에 제약이 있는 것으로 판단되는 단점이 있기는 하지만 말입니다.

GIS에서는 이미 타일맵이라는 형식으로 이 딥줌의 기술을 대체해.. 아니 딥줌보다 그 이전부터 사용되어 왔습니다. 하지만.. 딥줌은 마이크로소프트에서 최적화된 뷰어 자체를 제공하며 SilverLight를 통해 인터넷으로 쉽게 서비스할 수 있다는 매우 큰 장점을 가지고 있다고 생각됩니다.

이 글은.. 위에서 보여드린 Deep Zoom Composer를 통해 딥줌 이미지들을 만드는 것이 아닌.. Deep Zoom Composer가 없을지라도 딥줌 이미지들을 만들어 내기 위해 딥줌 이미지들의 구조를 파악해 보는 글입니다. 딥줌 이미지의 구조이므로.. Deep Zoom Composer가 만들어 낸 결과 샘플을 가지고 설명해 보겠습니다.

사용자 삽입 이미지
결과로 만들어진 딥줌의 폴더 구조입니다. 폴더 2개와 4개의 파일이 만들어 집니다. 이 구조는 어떠한 입력 이미지에 대해서도 항상 동일합니다. 그럼 다시 2개의 폴더 내부를 살펴보겠습니다. 먼저 dzc_output_files 폴더 구조입니다.

사용자 삽입 이미지
dzc_output_files 폴더 내부의 서브 폴더입니다. 역시 어떠한 입력 이미지에 대해서도 항상 동일하게 9개의 폴더가 만들어 집니다. 9개에 대한 모든 폴더, 즉 0 폴더에서 8번 폴더 안에는 0_0.png(또는 jpg)라는 이름의 이미지 파일 하나만이 존재합니다. 옵션을 지정하지 않았다면 256×256 크기의 이미지로 0 펄더에는 입력 이미지를 1×1 픽셀 크기로 만들어 놓은 것이고 2폴더는 2×2 픽셀 크기의 이미지가 3번 폴더는 4×4, 그리고 4번 폴더는 8×8 크기의 이미지와 같은 식으로 존재합니다. 다음은 dzc_ouput_images입니다. 이 폴더의 내부 내용은 다음과 같습니다.

사용자 삽입 이미지
입력 이미지 파일명으로 조합된 폴더 하나의 xml 파일 하나입니다. 먼저 xml 파일의 내부를 살펴보면 다음과 같습니다.

사용자 삽입 이미지
매우 단순한 내용이지만 중요한 정보를 담고 있는데요. 타일이미지의 크기와 이미지 형식 그리고 입력 이미지의 전체 크기에 대한 정보 등을 담고 있습니다. 이제 폴더 내부(02726_purplemurmur_2560x1440_files)를 살펴보겠습니다.

사용자 삽입 이미지
이 폴더는 흔히 GIS에서의 타일 구조 형식입니다. 0 폴더 안에는 1×1 픽셀 크기의 이미지 하나가 존재하며 최종적으로 12폴더에서는 입력 이미지를 256×256 크기의 타일 이미지들로 구성해 놓고 있습니다. 타일 이미지의 이름은 Row_Column.png(또는 jpg)로써 예를 들어 아래와 같이 구성되어져 있습니다.

사용자 삽입 이미지
여기서 Row 인덱스 0의 기준은 입력 이미지의 좌상단입니다. 이상으로 간단히 마이크로소프트사에의 딥줌 이미지의 포맷에 대해 설명드렸습니다.

[OpenMP] 이해가 않되는 스레드 흐름

#include "stdafx.h"
#include 
#include 

int _tmain(int argc, _TCHAR* argv[])
{
    int a = 1;
#pragma omp parallel
    {
#pragma omp sections firstprivate(a) lastprivate(a)
        {
#pragma omp section
            {
                Sleep(1000);
                printf("section 1: a 초기값 = %d\n", a);
                a = 2;
                printf("section 1: a 수정값 = %d\n", a);
            }
#pragma omp section
            {
                printf("section 2: a 초기값 = %d\n", a);
                a = 3;
                printf("section 2: a 수정값 = %d\n", a);
            }
        }
    }

    printf("a 최종값 = %d\n", a);

    return 0;
}

이 코드는 스레드를 2개 사용하고 있습니다. 즉 section 지시어를 통해 13~18번 코드를 실행하는 스레드 하나와 20~24번 코드를 실행하는 스레드 하나입니다. 10번 코드에서 lastprivate(a)라는 보조 지시어를 통해 2개의 스레드에서 연산한 결과 a가 복사됩니다. 14번 코드에 Sleep 함수를 호출함으로써 두개의 스레드 중 a에 2를 할당한 스레드가 가장 마지막에 끝나도록 했습니다. a에 2를 할당한 스레드가 마지막에 종료되니.. 이 2개의 스레드가 끝나면 a 값은 항상 2가 될거라 예상됩니다.

사용자 삽입 이미지
근데.. 보는 바와 같이 a의 최종값이 3이라고 합니다.. ㅡOㅡ;; 실행 흐름을 봐도 가장 먼저 a 수정값으로 3을 할당하고 다음 실행으로 a 수정값으로 2를 할당하는 순서입니다. 실행 순서는 예상과 같은데.. 결과는 반대입니다.. ㅡOㅡ;; 아직 OpenMP를 학습하는 단계인지라.. 이해가 떨어져서 그런 것인지.. 아니면 OpenMP의 BUG인지… 모를 일입니다.. 누구 아시는 분 코칭 부탁드립니다.

[GIS] 매쉬업 맵 솔루션의 좋은 사례

맵 매쉬업 서비스에 대한 좋은 사례(http://oakland.crimespotting.org)가 있어서 정리해 봅니다. 매쉬업 주제는 범죄 지도입니다. 범죄의 종류에 대한 분류 그리고 범죄의 위치 그리고 범죄가 발생한 시간대를 통해 분류하고 파악할 수 있습니다.

사용자 삽입 이미지
제가 이 매쉬업 서비스를 유심히 살펴보게 한 이유는.. 범죄의 발생 위치는 기본이고.. 범죄의 분류와 발생 시간을 사용자가 분류하고 파악하기 위해 이 솔루션에서 제시하고 있는 사용자 컨트롤들 때문입니다. 3가지 정도가 가장 눈에 띠었는데요. 하나 하나 살펴보면..

먼저 지도의 우측에 범죄의 종류에 한 범례가 있습니다. 범례의 항목 중에 하나에 마우스를 올려 놓으면 지도와 연계하여 마우스가 올라간 범죄 항목이 자연스럽게 하일라이팅됩니다.
 
사용자 삽입 이미지
그리고 범죄가 발생한 기간에 대해 분류하기 위한 컨트롤입니다. 기간의 범위를 지정하기 위해 시작과 끝을 지정할 수 있고 이렇게 정의한 기간을 전체로 드레그해서 설정할 수 있습니다. 또한 각 날짜에 대한 범죄 발생을 바차트로써 표현하고 있습니다..!!

사용자 삽입 이미지
끝으로 범죄가 발생한 시간의 범위를 지정하기 위한 컨트롤입니다. 시간의 범위를 여러 구간으로 지정할 수 있습니다.

사용자 삽입 이미지
 범례나 기간 설정 그리고 시간 설정등에 대한 기능을 사용자가 매우 효과적으로 사용할 수 있도록 분석해 반영해 놓은 매우 좋은 사례라고 생각합니다.

GIS에서 데이터와 분석이 매우 중요하지만.. 결국 이러한 데이터와 분석 기능에 대해서 사용자가 어떻게 활용할 것인가에 대한 승부는 소프트웨어이고.. 좀더 구체적으로 지정하면 소프트웨어에서 제공하는 사용자의 UI입니다.

사용자의 UI의 편의성과 기능성 그리고 직관성을 향상 시키는 것은 매우 중요하다는 점에서.. 그리고 GIS 개발자로써 다시 한번 마음속에 담아 봅니다.