[GIS] 모바일 GIS 개발 서적 소개

이 책은 구글, 네이버, 다음 등에서 제공하는 지도 API를 사용하지 않고 항공영상이나 수치지도를 활용하여 직접 지도를 디자인하고 제작하여 지도와 관련된 보다 다양한 정보와 데이터를 활용할 수 있고, 더 나아가 공간연산과 분석을 통해 더 고도화된 모바일 GIS 앱 개발을 하는데 큰 도움을 줄 것으로 확신합니다.


http://www.yes24.com/24/goods/8297262?scode=032&OzSrank=1

사용자 저마다의 원하는 다양한 앱을 개발하는 데 필요한 전문 GIS 엔진을 소개하고 이 엔진의 활용방법을 자세한 튜토리얼 형식으로 제공함으로써 독자들이 원하는 모바일 GIS 앱을 쉽고 빠르게 개발할 수 있도록 구성되었습니다.

이 책에서 소개하는 모바일 GIS 엔진은 블랙포인트(BlackPoint-Xr)로 저자가 직접 개발한 엔진이며, 이를 통해 다양한 공간 데이터에 대한 검색 및 편집기능을 수행할 수 있고 더 나아가 공간연산 및 분석을 통한 전문적인 업무까지 지원 가능한 GIS 앱을 개발할 수 있습니다. 또한, GPS를 통한 위치 추적 및 다양한 좌표계 변환을 쉽게 지원하도록 설계되었습니다.

모바일 GIS 앱을 개발하기 위해 이 책에서 소개하는 블랙포인트는 이미 많은 기관에서 현장 중심의 모바일 GIS의 기반 엔진으로 사용되고 있으며 많은 GIS 회사에서 블랙포인트를 이용해 직접 모바일 GIS 앱을 개발함으로써 검증된 모바일 GIS 엔진입니다.

이미 국가에서 다양한 공간데이터를 일반인들이 사용할 수 있도록 공개하고 있으며 그 공개의 범위도 더욱 넓어지리라 생각합니다. 이러한 공간 데이터를 이용하여 자신이 원하는 모바일 GIS 앱을 개발하여 직접 사용한다는 것은 큰 경쟁력이라 생각합니다.

저자 소개

김형준 : 지리정보시스템(GIS) 분야의 개발자이다. 웹 기반의 GIS 엔진과 모바일 GIS 엔진을 개발했으며 현재 HTML5 기반의 GIS 엔진을 개발 중이다. 지도 관련 서비스 개발에 관심이 많으며 많은 개발자가 제약 없이 쉽게 사용할 수 있는 다양한 Open API를 개발하고 있다.

이근상 : 한국수자원공사에서 연구원으로 지냈으며 현재 전주비전대학교의 교수로 재직 중이다. ‘GIS 공간분석’을 전문분야로 연구하고 있으며, 도시계획 및 토지이용 계획을 지원하기 위한 다양한 공간분석 알고리즘 개발을 비롯하여 홍수 및 토양침식과 같은 수재해 관련 공간분석 알고리즘 개발 및 현장 적용 등을 응용분야로 연구하고 있다. 최근에는 모바일 관광업무 지원을 위한 위치 서비스 개선 및 토지정보 현장지원 시스템에 관한 연구도 수행 중이다.

박진호 : 현재 공간정보기술(주) 연구소에서 근무 중이다. 10여 년간 IT와 GIS 관련 분야에 종사하면서 급변하는 IT 기술에 대해 연구하고 있다. 최근에는 1인 1GPS를 가능케 한 스마트폰 확산을 기회로 삼아 최신 IT 기술의 접목을 통한 GIS 산업영역 확대라는 작은 소망의 실현을 위해 노력 중이다.

[Java] URL로부터 데이터(문자열) 읽어오기

지정된 URL에 존재하는 데이터소스로부터 데이터, 특히 문자열 값으로 읽어오는 자바 코드입니다.

URL url = null;
try {
    url = new URL("http://222.237.78.208:8080/yp_tiles/a/metadata.xml");
} catch(MalformedURLException e1) {
    e1.printStackTrace();
}

InputStream in = null;
try {
    in = url.openStream();
    byte[] buffer = new byte[128];
    int readCount = 0;
    StringBuilder result = new StringBuilder();
   
    while((readCount = in.read(buffer)) != -1) {
        String part = new String(buffer, 0, readCount);
        result.append(part);
    }   
   
    System.out.println(result);
} 
catch (IOException e) {
    e.printStackTrace();
}

위의 코드를 실행하게 되면 해당 URL로부터 가져온 데이터가 문자열로써 result 변수에 저장됩니다. 저장된 결과에 대한 화면 표시는 다음과 같습니다.

사용자 삽입 이미지
위의 결과는 타일맵으로 가공된 데이터에 대한 메타 데이터입니다.

[GIS] 모바일 GPS 위치정확도 향상 연구

블랙포인트(BlackPoint-Xr)을 이용해 스마트폰의 GPS 좌표를 그 상황에 맞도록 정확도를 높여 주는 연구과제를 전주대학교 주체하에 진행하고 있습니다. 내일쯤.. 논의된 알고리즘을 실제 구현하여 논의해야하는데.. 실제 구현 단계에서 보니 논의된 알고리즘의 구현에 어려운 점과 제공 받은 데이터의 한계로 알고리즘의 재검토와 데이터 보완을 위한 요청 문서를 만들고 있습니다.

사용자 삽입 이미지
위의 화면은 지금까지 개발된 연구에 대한 구현 시스템입니다. 실제 동영상을 통해 보여드리면 좀더 좋겠지만.. 추후에 정확도 향상 알고리즘이 시스템에 적용되면 동영상으로 제공하면 좋겠습니다.

오차가 많은 모바일 GPS의 정확도를 개선하기 위해 다양한 보정 방법을 적용할 수 있습니다. 그런데 문제는 매우 다양한 변수가 존재한다는 것입니다. 그 수를 셀수도 없는 도로의 선형에 대한 형태들은 물론 GPS가 제공하는 위치에 대해 예측하기 어려운 변수들…

이러한 다양한 변수들에 대해서 정확도 향상을 위한 보정 알고리즘을 “강요”할 경우 시스템이 얼어 버리는 문제가 발생합니다. 또한 얼지는 않더라도 여러개의 보정 알고리즘이 동시에 적용될 경우 서로 상반되는 조건이 발생할 수도 있고요.

해서 GPS에 대한 상황을 길게 유지하지 않고 짧게 유지하되.. 이 짧은 상태에 대해서 제약 조건을 걸고 정확도 보정을 하고 다시 아무런 제약 조건이 깨끗한 상태에서 다시 위치 정확도를 보정하는 알고리즘이 최선이 아닐까 싶습니다.

재밌기도 하고.. 아직 문제 해결을 위한 실제 구현을 위한 구체적인 방법을 강구하고 있기에 조금 답답하기는 하지만 분명 의미가 큰 연구과제라고 생각됩니다.

[C++] 복사생성자, 소멸자, 대입연산자

C++을 학습하던 때에 제법 깊이 있게 생각하며 봤던 C++ 내용 중 복사생성자와 소멸자 그리고 대입연산자가 있었습니다. 마치 스타크래프트에서 등장하는 유닛들의 이름을 한글화 해 놓은 것은 이 3가지에 대해서 정리해 봅니다.

기본적으로 C++은 복사생성자, 소멸자, 대입연산자를 프로그래머가 정의해 놓지 않을 경우 정해진 기본 기능을 수행하는 복사생성자와 소멸자, 대입연산자를 만들어 놓는다고 가정할 수 있습니다.

기본 기능에 대한 복사생성자는 해당 클래스의 맴버 변수의 값을 그대로 복사합니다. 또한 기본 기능에 대한 소멸자는 해당 클래스의 맴버 변수의 소멸자를 호출해 줍니다. 그리고 기본기능에 대한 대입연산자는 해당 클래스의 맴버 변수의 값을 그대로 복사합니다.

여기서 언급된 맴버 변수의 값에 대한 복사라함은 단순한 값의 복사로써 만약 맴버 변수가 포인터일 경우 그 변수가 가르키고 있는 값까지 복사하는것이 아닌 주소값만을 복사한다는 의미입니다. 바로 이 포인트에 대한 부분이 C++에서 복사생성자와 소멸자, 대입연산자의 중요함이 강조되는 부분입니다.

아래의 코드는 이들 세가지(복사생성자, 소멸자, 대입연산자)에 대한 작성방법 및 이들을 제공하지 않았을 경우 어떻게 이들 세가지가 호출되는지를 보여주는 예입니다. 작성방법은 클래스 M에서 파악할 수 있고 호출 순서와 여부는 클래스 X에서 파악할 수 있습니다. 클래스 X는 이들 셋을 정의하고 있지 않으므로 C++에서 기본적으로 제공하는 기능에 대해 수행된다고 확신할 수 있습니다.

먼저 클래스 M에 대한 코드입니다.

class M {
public:
    M() {
        cout << "M::default-ctr is called" << endl;
    }

    M(const M&) {
        cout << "M::copy-ctr is called" << endl;
    }

    ~M() {
        cout << "M::dtr is called" << endl;
    }

    M& operator=(const M&) {
        cout << "M::oper= is called" << endl;
        return *this;
    }
};

여기서 기본생성자(M::default-ctr is called를 출력하는 함수)가 추가로 제공되고 있습니다. C++은 프로그래머가 생성자를 추가하지 않으면 기본생성자를 자동으로 추가해 주지만, 여기서는 복사생성자를 추가하고 있음으로 프로그래머가 직접 기본 생성자를 추가해 주어야 합니다.

다음은 클래스 X이며 이 클래스는 복사생성자와 소멸자, 대입연산자를 프로그래머가 제공하지 않으며 단순히 맴버 변수로써 클래스 M만을 가지고 있습니다.

class X {
    M m;
};

이제 클래스 X를 생성하고 대입하는 코드를 통해 복사생성자와 소멸자, 대입연산자의 호출을 확인해 보도록 하겠습니다.

X x;
X y = x;
x = y;

실행 결과는 다음과 같습니다.

사용자 삽입 이미지
1번 코드에 의해서 M::default-ctr is called가 표시되며 2번 코드에 의해서 M::copy-ctr is called가 호출됩니다. 그리고 3번 코드에 의해서 M::oper= is called가 호출됩니다. 그리고 이 프로그램의 유효범위가 종료됨으로써 직역변수로 선언된 x와 y에 대한 소멸자가 각각 1번씩 호출됩니다.