osmdroid는 구글 맵, 네이버 맵처럼 안드로이드 지도 라이브러리이다. 10년 이상된 라이브러리지만 업데이트가 계속되고 있다.
사실 일반적인 앱에서는 구글 맵이나 네이버 맵만 사용해도 원하는 지도 기능을 만들 수 있다.
하지만 인터넷을 못 쓰거나 자체 지도 서버를 사용하는 앱은 다른 방법을 써야 한다. 내 경우 회사에서 만드는 기능이 osmdroid로 적합해서 사용했다.
osmdroid는 구글 맵, 네이버 맵과 비교해서 다음 특징이 있다.
osmdroid는 xml 기반으로 만들어졌기 때문에 xml로 ui를 만드는게 편하다. Compose에서는 AndroidView를 사용하면 구현이 될 거 같은데 해보지는 않았다.
먼저 라이브러리를 추가한다. 자세한 추가 방법은 공식 문서를 참조
// build.gradle.kts
dependencies{
implementation("org.osmdroid:osmdroid-android:6.1.13")
}
지도 이미지를 네트워크로 받으려면 인터넷 권한이 필요하고, 지도 이미지를 앱에 저장하려면 저장 권한이 필요하다. 자세한 권한은 공식 문서를 참조
// AndroidManifest.xml
// 네트워크 통해서 지도 이미지 사용
<uses-permission android:name="android.permission.INTERNET"/>
// 오프라인 지도 사용하거나 지도를 앱에 저장하려면 사용
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
지도를 화면에 추가한다.
<org.osmdroid.views.MapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
코드에서 지도를 설정한다. 지도 타일은 setTileSource에서 설정할 수 있다. 여기서는 기본 타일로 설정한다.
class MainActivity : AppCompatActivity() {
private lateinit var mapView: MapView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 지도 설정을 초기화/로딩
val context = applicationContext
Configuration
.getInstance()
.load(context, PreferenceManager.getDefaultSharedPreferences(context))
setContentView(R.layout.activity_main)
mapView = findViewById(R.id.mapView)
// 지도 타일 설정
mapView.setTileSource(TileSourceFactory.MAPNIK)
}
}
❗ 코드에는 권한 요청을 넣지 않았는데, 외부 저장소에 지도 이미지를 저장하는게 아니면 필요가 없어서 일단 제외했다. 권한이 필요한 경우 관련 코드를 추가해야 한다.
PreferenceManager가 deprecated된 경우, androidx 라이브러리를 추가해야 한다.
implementation("androidx.preference:preference:1.2.1")
마지막으로 생명주기 관련 코드를 추가한다.
override fun onResume() {
super.onResume()
mapView.onResume()
}
override fun onPause() {
super.onPause()
mapView.onPause()
}
❗ 사실 라이브러리 코드를 보면 알지만, 저 코드를 추가하지 않아도 지도는 동작한다.
다만 지도 위에 올라가는 오버레이가 생명주기 작업을 해야하면 코드를 추가해야 한다.
이제 앱을 실행하면 지도가 나타난다.
일반적인 앱을 만드는 경우 osmdroid를 굳이 사용하지 않아도 된다. 하지만 나처럼 인터넷도 사용할 수 없고 커스텀 지도를 사용해야 하고 지도 위에 그림을 그리는 경우, osmdroid는 좋은 라이브러리라 생각한다. 다른 글에서는 내가 개발하면서 사용한 기능을 소개할 예정이다.
좋은 정보 감사합니다