[GIS] BlackPoint, 지오프로세싱(평균경사도, 단면도 측정)

블랙포인트라는 안드로이드 기반의 GIS 엔진을 이용해 화면에서 평균경사도와 단면도를 손쉽게 측정할 수 있는 기능을 개발할 수 있습니다. 이러한 기능 개발을 위해 DEM 데이터가 필요하며 블랙포인트는 DEM 데이터를 공간서버(GeoService-Xr)을 통해 빠르게 서비스 받을 수 있습니다.

먼저 평균경사도를 측정하기 위해 지도 화면에 터치를 통해 측정하고자 하는 영역을 폴리곤으로 지정합니다.

사용자 삽입 이미지
지정하고 화면을 더블터치를 해 폴리곤 지정을 마무리 하면 지정된 영역에 대한 경사도를 분석하여 아래와 같은 결과를 사용자에게 제공합니다.

사용자 삽입 이미지 
그리고 횡단면도 측정의 경우에.. 지도 화면에서 터치를 통해 측정하고자 하는 횡단선을 그려줍니다.

사용자 삽입 이미지
그리고 화면을 더블터치를 해서 횡단선 지정을 마무리하면 다음과 같이 횡단면도 측정되어 결과가 화면상에 표시됩니다.

사용자 삽입 이미지
이처럼 블랙포인트를 이용해 모바일이라는 환경에서 단순히 터치를 통해 평균경사도와 횡단면도를 빠르게 측정할 수 있는 모바일 GIS 앱을 개발할 수 있습니다.

[Android] 이미지 회전 또는 Mirror(반전)

작디 작은 화면을 가지는 모바일 디바이스.. 요즘은 작다고 하면 한대 맞은 시대이긴 하지만 말입니다. 여튼 모바일 디바이스에서 이미지를 참 많이 가져다 사용합니다. 아래의 코드는 파일명으로 해서 코드단에서 쉽게 사용할 수 있는 Bitmap을 하나 만드는 코드입니다.

BitmapFactory.Options bo = new BitmapFactory.Options();
bo.inSampleSize = 1;
Bitmap bmp = BitmapFactory.decodeFile(imageFilename, bo);

...

bmp.recycle(); 

와우..  참 쉽죠?  사실 1번과 2번 코드는 옵션입니다. 이 코드가 필요없을때는 BitmapFactory의 decodeFile 함수의 두번째 인자를 null로 주면 됩니다. 생성한 비트맵을 잘썼다면 7번 코드를 호출해 줍니다.

이 글의 요지는 이렇게 비트맵을 생성하는게 아니고.. 생성된 비트맵을 회전하고 Mirror시키는 방법이니다. 먼저 회전입니다.

Matrix matrix = new Matrix();
matrix.postRotate(90);
Bitmap newBmp = Bitmap.createBitmap(bmp, 0, 0, 
    bmp.getWidth(), bmp.getHeight(), matrix, true); 

2번 코드에서 postRotate 함수의 첫번째 인자가 바로 회전하고자 하는 각도입니다. 다음은 Mirror 시키는 코드입니다.

float[] mirrorY = {
    -1, 0, 0,
    0, 1, 0,
    0, 0, 1
};

Matrix matrix = new Matrix();
matrix.setValues(mirrorY);
Bitmap newBmp = Bitmap.createBitmap(bmp, 0, 0,
     bmp.getWidth(), bmp.getHeight(), matrix, true); 

회전처럼 행렬을 이동하기는 하는데.. Mirror의 경우 직접 행렬요소를 직접 지정하고 있습니다. 행렬(Matrix)는 개발자에게 매우 유용한 수학적 도구중에 하나가 분명합니다.

안드로이드에서 비트맵에 대한 이야기가 나온 차에 하나 더…! 비트맵을 파일로 저장하는 방법입니다. 안드로이드는 PNG와 JPG 포맷을 지원합니다. 아래의 코드는 비트맵을 PNG 포맷에 대한 파일로 저장하는 코드입니다.

File file = new File(filename);
FileOutputStream filestream = null;
try {
    filestream = new FileOutputStream(file);
    newBmp.compress(CompressFormat.PNG, 0, filestream);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

[Java] 파일 복사

fileName이 복사할 대상 파일이고 newFileName이 복사되어 새롭게 생성될 파일명입니다. 근데 좀 살펴볼게… 실제 데이터를 복사(전송) 시키는 12번 코드의 transfer 함수는 실제로 전송된 바이트 수를 반환합니다. 전송하고자 하는 바이트수와 실제로 전송된 바이트 수 사이에 차이가 있을 수 있다는 건데.. 이 부분에 대한 고민을 좀 더 해봐야할 코드입니다.

try {
    File inFile = new File(fileName);
    FileInputStream inputStream = new FileInputStream(inFile);
    
    File outFile = new File(newFileName);
    FileOutputStream outputStream = new FileOutputStream(outFile);
   
    FileChannel fcin = inputStream.getChannel();
    FileChannel fcout = outputStream.getChannel();
   
    long size = fcin.size();    
    fcin.transferTo(0, size, fcout);
   
    fcout.close();
    fcin.close();
    
    outputStream.close();
    inputStream.close();
} catch (Exception e) {
    e.printStackTrace();
}   

[Android] 모바일 디바이스에 저장된 전체 이미지 파일 가져오기

안드로이드를 처음 학습할때… 첨으로 별나다.. 싶었던 기억이 이었습니다만.. 지금은 제법 잘만들어진 프레임워크라는 생각이 듭니다. 버전업이 많이 되어져.. 안정화가 되었다는 것이 가장 큰 이유인듯 하지만 말입니다. 아래의 코드는 디바이스에 저장된 이미지 파일(PNG, JPG)들 전체를 얻는 코드입니다.

String[] proj = { MediaStore.Images.Media.DATA };
Cursor imageCursor = managedQuery(
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, proj, null, null, null);
   
if (imageCursor != null && imageCursor.moveToFirst()){
    String fileName;
    int dataCol = imageCursor.getColumnIndex(MediaStore.Images.Media.DATA);
    
    do {
        fileName = imageCursor.getString(dataCol);
        if (fileName != null){
            // fileName(이미지 파일명)
        }
    } while (imageCursor.moveToNext());

    imageCursor.close();
}

[GIS] 블랙포인트 엔진을 이용한 ‘스마트 현장지원 시스템’ 개발 완료

안드로이드 기반의 모바일 GIS 엔진인 블랙포인트를 이용해 개발한 스마트 현장지원 시스템 개발이 완료되었습니다. 개발 기간은 3월 1일부터 시작하여 정확히 1달 소요되었습니다.

사용자 삽입 이미지
25cm 급 항공영상을 해상도 손실 없이 그대로 사용하면서 지적도 역시 SHP 파일을 그대로 사용하는 시스템입니다. 장점은 역시…. 지도 표시 속도가 빠르다는 것.. 그리고 대용량의 공간 데이터를 메모리 제약 없이 사용할 수 있다는 것… 개인적으로는 기본에 충실했다는 것… 보다 자세한 내용은 지오서비스(www.geoservice.co.kr)의 자료실을 참고하시기 바랍니다.

현장이라는 특성상.. 통신이 않되는 상황에서도 지도를 살펴볼 수 있습니다.. 이번에 개발한 스마트 현장지원 시스템은 기본적인 GIS 기능을 담고 있고.. 추후 사용자의 요구사항에 대해 빠르게 커스커마이징 할 수 있도록 개발되었습니다.

오는 3월 31일에.. 네이버 GIS 프로그래밍 연구소(cafe.naver.com/gisdev)에서 개발자분들에게 블랙포인트 엔진에 대한 소개와 엔진을 개발할때 격었던 문제점과 해결책을 공유할 예정입니다. 관심있는 분들은 꼭 참석해 보시기 바랍니다. 이외에도 다른 GIS 개발자분들이 개발한 엔진에 대한 소개가 진행될 예정입니다. GIS 개발자분들에게는 소통의 장이 될 수 있을 거라 생각합니다..