[GIS] 블랙포인트(BlackPoint)를 이용한 GPS 테스트

모바일 디바이스(사용 디바이스: 갤럭시 플레이어 70)에 기본 장착된 GPS의 위치 정확도를 테스트해 볼 목적으로 블랙포인트(BlackPoint)를 이용해 GPS Tracking 앱을 만들어 직접 실외에서 실행해 보았습니다. 대상 지역은 서초구 서초동입니다. 아래의 화면은 디바이스의 실제 실행 화면을 캡춰한 이미지입니다.

사용자 삽입 이미지
점심 식사를 하고 도보로 천천히 걸으며 대로와 골목길로 위치를 추적해 보았습니다. 상당히 일치하는 부분과 상당히 벗어나는 부분이 존재하는 것을 알 수 있습니다. 그 이유를 파악하기 위해 위의 경로를 KML로 저장하고 구글어스에서 표시해 보았습니다.

사용자 삽입 이미지
위치가 크게 벗어나는 부분은 4곳으로.. 1곳은 디바이스의 이미지를 캡쳐하기 위해 사무실인 실내로 들어옴으로써 발생하는 오차입니다. 나머지 3곳에 대해서 위의 이미지에 표시를 해보았습니다. 결과적으로 고층건물에 의한 위치 오차라고 생각됩니다. 3곳에 대한 이미지를 좀더 확대해 보면 각각 다음과 같습니다.

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
만약 주위에 고층건물이 없다면 모바일 디바이스의 GPS 만으로도 어느 정도 정확한 위치를 파악할 수 있으리라 생각됩니다. 하지만 좁고 거미줄처럼 복잡한 골목길에 대한 위치의 파악은 GPS만으로는 어렵지 않을까… 예상해봅니다.

[GIS] 지오서비스에서 개발하여 지자체에 납품한 GIS 시스템 사용통계

지오서비스(www.geoservice.co.kr)에서 개발하여 지자체에 납품한 GIS 시스템의 사용현황에 대한 보고 요청을 받아 1년 동안 로그인 회수를 뽑아 보았습니다. 작년 3월에 납품되어 1년 이상 활용되었으며 단한차례도 시스템이 멈춘적이 없는 안정성을 제공합니다.

통계는 시스템의 로그인 횟수로 하였습니다. 더욱 정확한 통계는 지도 페이지 조작 횟수이지만.. 지도 페이지 조작 횟수는 개발된 시스템 상에서 알아낼 수 없어 로그인 횟수로만으로 통계를 내었습니다. 정확히 1년 기간 범위로 하여 월별 로그인 횟수를 SQL 문을 통해 뽑아 보니 다음과 같은 표를 얻을 수 있었습니다.

사용자 삽입 이미지
이를 보다 효과적인 경향을 살펴보기 위해 그래프로 표현하면 다음과 같습니다.

사용자 삽입 이미지
일정하지는 않지만 지속적으로 로그인 횟수가 증가하는 경향인 것을 알 수 있습니다. 어떤 시스템을 활용할때.. 그 시스템이 어느정도 익숙해지면 시스템을 지속적으로 로그인해 놓고 활용하게 됩니다. 위의 그래프는 단순히 로그인 횟수만을 통해 시스템에 대한 사용량 통계를 제공한 것이지만 만약 지도 페이지 조작 횟수로 통계를 처리한다면 시스템에 대한 사용에 대한 추세를 보다 정확히 알 수 있을 것입니다

이 통계에 대한 대상 시스템은 지오서비스의 자체 솔루션인 FingerEyes-Xr과 GeoService-Xr이 적용되었습니다. FingerEyes-Xr은 오픈소스로 클라이언트 맵엔진이며 GeoService-Xr은 공간서버입니다.

늘.. 내 생각은 현실로 이루어졌다..

간절히 원하면.. 그 마음이 저 먼 우주로 전달되어.. 우주의 에너지가 생성되고.. 다시 그 에너지가 내게로 돌아와 내가 원하는 바를 이룬다는 코엘료의 연금술사에서 나오는 글처럼… 정말로…. 늘… 내 생각은 현실로 이루어졌다.. 단지 시간이 필요했을 뿐…


지금 내게 중요한 것은.. 내가 이루고자 하는 것이 무엇인지를 다시금.. 정리해보고 정하는 것이 먼저일듯하다.. 비록 저 멀리에 희미할지라도.. 그 목표를 정해 놓고서.. 이 바쁜 일상을 흘러보내야지 않겠는가.. 결국 이루어질 것들이라면.. 말이다..

축복이다…. 늘.. 내 생각이 내가 간절히 바란다면 이뤄진다는 것은.. 분명 축복이다.. 어렴풋이.. 내가 바라는 것을 생각하는 것으로 그치지 말고.. 보다 분명하고 선명하게.. 내가 이룰 것을 정하자.. 그리고.. 가자..

안드로이드(Android)에서 sqlite 콘솔 사용

안드로이드에서 기본적으로 사용하는 DB는 sqlite입니다. sqlite는 데이터베이스를 하나의 파일 단위로 하여 여러개의 테이블을 묶어 관리합니다. sqlite는 로컬 DBMS이며 이 파일 하나만 복사해서 다른 곳에 복사하면 아무런 문제 없이 사용할 수 있는 편의성이 있습니다.

여기서 설명하는 sqlite의 버전은 3이며 이 sqlite3에서 사용하는 DBMS 파일을 바이너리 형태로 살펴보면 다음 예와 같습니다.

사용자 삽입 이미지

파일명과 확장자는 의미가 없고 그 파일의 내용을 통해 sqlite의 데이터베이스 파일이라는 것을 인식합니다. 이 데이터베이스 파일에서 정보를 살펴보기 위해서 안드로이드에서 제공하는 SDK를 통해 sqlite3.exe 실행파일을 이용할 수 있습니다.

사용자 삽입 이미지

이 데이터베이스(map.mbtiles 파일)에 정의된 테이블 이름을 보기 위한 명령은 다음과 같습니다.

그리고 테이블에 대한 스키마 정보를 보기 위한 명령은 다음과 같습니다.

이제, 테이블 명과 해당 테이블에 대한 스키마 정보를 파악할 수 있으니 SQL 문을 통해 원하는 정보를 얻을 수 있습니다.

[C#] URL을 통해 이미지(Image) 다운로드(Download)해서 파일(File)로 저장(Save)

웹상의 이미지 URL을 알고 있을때.. 해당 URL로부터 이미지에 대한 데이터를 가져와 파일로 저장하는 C# 함수입니다. 가끔 꼭 필요한 함수인데.. 필요할때 쉽게 찾아 볼 수 있도록 기록해 둡니다.

private bool DownloadRemoteImageFile(string uri, string fileName)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    bool bImage = response.ContentType.StartsWith("image", 
        StringComparison.OrdinalIgnoreCase);
    if ((response.StatusCode == HttpStatusCode.OK ||
        response.StatusCode == HttpStatusCode.Moved ||
        response.StatusCode == HttpStatusCode.Redirect) &&
        bImage)
    {
        using (Stream inputStream = response.GetResponseStream())
        using (Stream outputStream = File.OpenWrite(fileName))
        {
            byte[] buffer = new byte[4096];
            int bytesRead;
            do
            {
                bytesRead = inputStream.Read(buffer, 0, buffer.Length);
                outputStream.Write(buffer, 0, bytesRead);
            } while (bytesRead != 0);
        }

        return true;
    }
    else
    {
        return false;
    }
} 

사용 방법에 대한 예는 다음과 같습니다.

String url = "http://www.there.net/img.png";
String fileName = "d:/a.png";
if (!DownloadRemoteImageFile(url, fileName))
{
    MessageBox.Show("Download Failed: " + url);
}

이 요긴한 함수는 제가 작성한 것은 아니고.. 검색을 통해 찾아 테스트 해보고 실제 프로젝트에 적용해 잘… 쓰고 있는 함수입니다. 출처를 기억하지 못하지만.. 개발해 제공해 준 개발자에게 감사 드립니다.