본문 바로가기
안드로이드 코틀린

[Kotlin][Android] osmdroid marker표시 및 지도 상에서 위치 얻기

by teamnova 2022. 5. 16.
728x90

 

https://stickode.tistory.com/461 

osmdroid 사용은 위 포스터를 참고해주세요.

 

이번시간에는 맵뷰를 클릭시 해당 지점에 마커가 생성되게 하겠습니다.

우선, 지난 작성하셨던 포스팅까지는 진행이 되었다고 가정하겠습니다.

 

1. Main Activity Layout에 마지막 위치의 위경도를 텍스트로 띄워 줄 textView를 하나 추가 합니다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <org.osmdroid.views.MapView
        android:id="@+id/mapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
        
        
    <TextView
        android:id="@+id/description"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""
        android:textStyle="bold"        
        android:textSize="32sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

2. 터치시 좌측 상단에 지도상에서 터치한 곳의 위도와 경도가 표시되고, 길게 누른 경우 마커가 표시되게 리스너를 작성하고 붙여줍니다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val mapView = findViewById<MapView>(R.id.mapView)
        val mapController = mapView.controller
        mapController.setZoom(15.0)
        val startPoint = GeoPoint(37.5665, 126.9780);
        mapController.setCenter(startPoint);
        Configuration.getInstance().userAgentValue = BuildConfig.APPLICATION_ID
        mapView.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE)

        val tvDescription = findViewById<TextView>(R.id.description)

        val mapEventsReceiver = object : MapEventsReceiver {
            override fun singleTapConfirmedHelper(p: GeoPoint?): Boolean {
                if (p != null) {
                    tvDescription.text = "터치 지점 : \n위도 ${String.format("%.6f", p?.latitude)} \n경도 ${String.format("%.6f", p?.longitude)}"
                    return true
                }

                return false
            }

            override fun longPressHelper(p: GeoPoint?): Boolean {
                if (p == null) {
                    return false
                }

                val startMarker = Marker(mapView)
                startMarker.position = p
                startMarker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM)
                mapView.overlays.add(startMarker)
                mapView.invalidate()

                return true
            }
        }
        val mapEventsOverlay = MapEventsOverlay(mapEventsReceiver)
        mapView.overlays.add(mapEventsOverlay)

    }
}

 

--

결과물