[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);
}

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