정확하게 얘기하면 오픈소스 오픈스트리트맵 프로그램입니다. 오픈스트리트맵(http://www.openstreetmap.org) 은 사용자들이 참여해서 만드는 맵입니다. 이 맵을  안드로이드에 적용하고 있는 시도들이 꽤 있어서 소개해볼까 합니다.

우선 참고할 싸이트는 오픈스트리트맵위키의 안드로이드 관련 페이지 (http://wiki.openstreetmap.org/wiki/Android) 와 Androgeoid (http://androgeoid.com/) 입니다. 이 중에서 제가 사용해 본 두 개의 오픈소스 앱에 대해서 소개하겠습니다. 아직 국내맵에 적용되는 기능이 미비하지만 프로그램 개발을 위한 참고 소스는 될 수 있겠죠.

1. Navit (http://www.navit-project.org/)
먼저, Navit 라는 프로그램인데, 이 프로그램은 원래 소스가 네이티브 코드, 즉 C/C++ 로 되어 있고 리눅스에서 GTK 또는 SDL 기반으로 동작하는 프로그램입니다. 그런 프로그램을 M$ 윈도, 아이폰 등은 물론 안드로이드에도 동작하도록 포팅되었습니다.

Navit 의 안드로이드 버전은 오프라인 벡터 맵은 물론 경로 검색, TTS 음성안내(영어), 3D 버드뷰를 지원하고, 실험적인 증강현실 기능을 일부 포함하고 있습니다. 근데, 3D 뷰는 평면맵을 비스듬히 보여주는 거라 요즘 상용 네비게이션 수준에 비할바가 못되고, 아직 제공하는 국내지도가 세밀하지 않고, 검색시 한글키보드가 지원되지 않아서 지도 지점에서 목적지를 찍어야 하는 등 많이 미비한 편입니다.

이 프로그램의 소스와 안드로이드용  빌드에 대한 내용은 위키 페이지 (http://wiki.navit-project.org/index.php/Navit_on_Android) 를 참고하시기 바랍니다.

먼저, 네비게이션에 사용할 맵은 Navit 팀에서 자체적으로 제공하는 맵(http://maps.navit-project.org) 을 사용하거나 Cloudmade (http://downloads.cloudmade.com/) 로부터 미리 만들어놓은  맵을 다운로드해도 됩니다. 이 맵을 /sdcard/navit 디렉토리에 Navitmap.bin 이라는 이름으로 두면 됩니다.

안드로이드에 포팅하기 위해 네이티브 코드가 포함된 소스코드를 빌드하려면 NDK 를 사용하여야겠죠. 이 프로그램의 소스는 svn  으로 받을 수 있고, 프로그램 소스 빌드는 윈도의 cygwin 환경이나 리눅스 등에서 가능합니다. 근데, 의존하는 패키지가 좀 있고 여러가지 이유로 인해 cygwin 에서는 아직 설치하지 못했고 리눅스 (우분투 10.04 Lucid) 에서는 포팅이 가능했습니다.

리눅스에서 컴파일하는 방법은 몇 가지가 있습니다.
가장 쉬운 방법은 위 싸이트에서 제공하는 vmware 리눅스 이미지를 다운받아 vmware 에서 리눅스를 구동시켜 빌드하는 방법입니다.

직접 소스코드를 다운받아 컴파일하는 방법도 2가지가 있습니다.
첫째는 autotools(autoconf, automake, libtool) 을 사용하여 설치하는 방법이고 둘째는 cmake 를 사용하는 방법입니다.
첫번째 방법에 대한 빌드 과정은 다음과 같습니다.

소스를 다운받아 컴파일하기 전에 다음과 같은 패키지들을 우선 설치하였습니다. (정확한 기억은 아님)
autoconf, automake, libtool, gettext, imagemagick, libsaxonb-java, rsvg2-bin, ant

또, 당연히 안드로이드 SDK(리눅스 버전) 와 NDK 를 설치하고 경로 등을 설정하여야 합니다.
프로그램 빌드는 위 링크에 나타나 있는 대로 configure->make->make apkg 순으로 이루어집니다.
제가 사용한 configure 옵션은 다음과 같습니다. 여기서, 안드로이드 버전이나 기능에 따라 경로, 숫자, 옵션이 달라질 수 있습니다.

./configure PKG_CONFIG=arm-eabi-pkgconfig RANLIB=arm-eabi-ranlib AR=arm-eabi-ar CC="arm-eabi-gcc -L/home/linux/android-ndk-r4b/build/platforms/android-8/arch-arm/usr/lib -L. -I/home/linux/android-ndk-r4b/build/platforms/android-8/arch-arm/usr/include" CXX=arm-eabi-g++ --host=arm-eabi-linux_android --enable-avoid-float --enable-avoid-unaligned --enable-cache-size=20971520 --enable-svg2png-scaling=8,16,32,48,64,96 --enable-svg2png-scaling-nav=59 --enable-svg2png-scaling-flag=32 --with-xslts="android plugin_menu pedestrian_button pedestrian" --with-saxon=saxonb-xslt --enable-plugin-pedestrian  --with-android-project=3 --with-android-permissions=CAMERA

make 한 후 make apkg 하면 패키지 파일이 만들어집니다.

이렇게 하지 않고 이클립스에서 패키지를 만들 수도 있습니다. 그럴 때는 .classpath 파일과 .project 파일을 다른 프로젝트로부터 가져와서 적당히 수정(프로젝트 파일이름)합니다. 그리고, 이클립스에서 가져오기를 하면 프로젝트가 패키지 탐색창에 포함되는ㄷ데, 여기서 프로젝트 속성 창의 java build path 탭에서 external jar 로 navit/android/libs/TTS_library_stub.jar 를 추가해 준 다음 빌드하면 됩니다.

navit/android/bin 디렉토리에 Navit_debug.apk 파일이 생성된 걸 확인한 후 스마트폰에 옮겨 설치하고 맵을 다운로드받아 실행하면 됩니다.


덧말: 카메라 소스코드에 잘못된  코드부분(parameters.setPreviewSize(width, height);) 이 있어 갤럭시 s 와 넥서스원 등에서 증강현실 기능이 동작하지 않았는데 이 부분을 제거하거나 적절히 수정하여 빌드하면 제대로 동작합니다.

2. OsmAnd(http://www.osmand.net/)
두번째로 소개할 국제적인 오픈소스 프로젝트인 OsmAnd 는 3D 뷰는 지원하지 않지만(지원 예정)  온라인 벡터맵은 물론 구글맵과 같은 비트맵도 지원하여 상당히 많은 오픈된 맵들을 선택하거나 둘 이상의 맵을 중첩시킬 수 있고, POI 출력, 검색, 편집, Favorites 등록지점, 경로 표시, 음성 안내 등의 기능을 제공합니다.

맵 중첩을 위해 메뉴에서 기본 맵을 하나 선택한 후 오버레이 맵을 다시 하나 선택하면 중첩이 됩니다.
중첩 수준은 화면 위의 시크바를 조절하면 되구요. 비트맵을 중첩시키면 당연히(?) 화면이 흐리게 되는 경향이 있습니다.
나름대로 최적의 조합은 위성지도들과 하이브리드 맵을 중첩시키는 경우와 일반 맵과 지형도(특히 OpenPiste LandShaded) 를 중첩시킬 때입니다.


내비게이션 경로를 위해 벡터맵이나 온라인(OSM, Googlemap) 으로 위치를 검색할 수 있습니다.
경로 탐색은 내장된 오프라인 정보나 Cloudmade, YOURS, Osrm 등의 온라인 싸이트로부터 받아올 수도 있습니다.
경로가 검색되면 음성안내도 가능하고 애니메이션 기능도 포함하고 있습니다.

OsmAnd 에서
다운로드된 모든 맵타일 및 POI 등의 정보는 /mnt/sdcard/osmand/ 디렉토리에 저장됩니다. 오프라인 지도는 Oruxmaps 처럼 프로그램 내에서 일괄 다운로드할 수도 있고, mobile atlas creater 처럼 독립된 맵 다운로드 프로그램을 사용하여 DB파일로 설치할 수도 있습니다. 따라서, Oruxmaps, Locus, RMaps 처럼 오프라인 맵으로도 활용할 수 있습니다.

OsmAnd 프로그램 소스는 구글코드 프로젝트(http://code.google.com/p/osmand/) 에서 git 로 다운받고, 빌드는 벡터맵의 네이티브 렌더링을 위한 부분(NDK 로 컴파일)을 제외하고 이클립스에서 하면 됩니다. 빌드 시에 유의할 점은 소스가 커서 이클립스 설정 파일을 수정하여 메모리 용량을 256메가 이상으로 적절히 늘려야 한다는 점과 맴 다운로드 프로그램(디렉토리 이름은 DateExtractionOSM 이고 실행파일은 OsmAndMapCreater.jar) 의 소스를 일부 참고하므로 빌드옵션에서 적절한 링크를 추가해 주어야 합니다.

첨부: OsmAnd 소스를 수정하여 실험적으로 국내 맵들 표시 및 경로/검색 기능, 한글 음성안내 기능이 포함된 버전을 공개합니다. 소스코드는 http://code.google.com/r/swkim01-osmand/ 에서 다운받으시면 되고, 빌드된 apk 파일을 첨부합니다.
근데 아직 오류나 버그가 있을지도 모르고 사용하다가 문제가 생길 수도 있으니 주의하시기 바랍니다.
OsmAnd_kr_0_7_2.apk
OsmAnd_kr_1_4_0.apk

OsmAnd 는 맵타일 정보를 OsmAnd 싸이트(download.osmand.net) 에서 온라인으로 가져오는데,
수정된 버전은 로컬 디렉토리의 정보 파일(custom_tile_sources.xml) 에 있는 맵도 참고합니다.
따라서, 첨부된
custom_tile_sources.xml 파일을 PC 에서는 $(사용자홈디렉토리/osmand/tiles/ 디렉토리에 복사하고,
스마트폰에는 /mnt/sdcard/osmand/tiles/ 디렉토리에 복사하여야 여러가지 맵들이 보이게 됩니다.
xml 방식을 사용하므로 지도가 갱신되었을 때 각 맵 url 의 버전 부분을 직접 수정하면 최신 버전으로 유지할 수 있습니다.
custom_tile_sources.xml
한글 음성안내 기능을 사용하려면 앱을 설치한 후 메뉴에서 오프라인 데이터 중 음성 TTS 데이터를 설치하면 됩니다.
혹시 설치가 되지 않으면 /sdcard/osmand/voice/ko-tts 디렉토리를 생성한 후 아래
첨부파일을 저장하면 됩니다.
그리고, 한글 음성 TTS (예를 들면 SMT(삼성 모바일 TTS): 진저브레드이하: http://kchc.tistory.com/1124 , ICS이상: http://blog.daum.net/thermidor/8933148 등 참고) 를 별도로 마켓이나 인터넷에서 구하여 설치하신 후 사용하세요.
_ttsconfig.p
3D 맵 보기를 위해서는 고도 데이터(DEM) 가 필요합니다. 고도 데이터는 현재 srtm hgt 형식만을 지원합니다.
이 파일들은 http://www.viewfinderpanoramas.org/Coverage%20map%20viewfinderpanoramas_org3.htm
또는 http://dds.cr.usgs.gov/srtm/version2_1/SRTM3/ 로부터 다운로드할 수 있습니다.
해당하는 지역의 hgt 압축파일들을 다운로드받아 압축을 풀고 /sdcard/osmand/heights/ 디렉토리에 두면 됩니다.

PC 에서 동작하는 별도의 맵 다운로드 프로그램은 다음 프로그램을 참고하세요.
PC 맵 다운로드 프로그램은 자바(java)를 설치한 후, 커맨드 창에서 "java -jar OsmAnd...jar" 명령으로 실행시키거나 더블클릭하면 되는데, 혹시 알집 등이 연결되어 실행이 실패하면 알집 설정에서 jar 확장자를 풀어주고 다시 실행하면 될 겁니다.
맵을 오프라인으로 미리 다운로드하여 사용하려고 하는 경우에는 이 프로그램을 사용하여 특정한 영역에 대해 설정한 줌레벨별로 지도를 다운로드한 후 DB 파일로 만들어 SD 카드 설치 디렉토리(/sdcard/osmand/tiles) 에 복사하고 나면 프로그램에서 지도가 보일 겁니다. (OsmAnd 에도 DB 파일은 아니지만 온라인으로 화면에 보이는 영역을 미리 다운로드하는 기능이 있습니다)
OsmAndMapCreator-0.7.2.jar
OsmAndMapCreator-1.1.0.jar

구글위성+구글 하이브리드
tokyo2.jpg

구글 지형도(3D)
jirisan2.jpg