Android
[Kotlin/Android] 네이버 지도 연결 후 위치 표시 (마커 표시) 및 마커 색상 변경
연나연
2024. 8. 19. 16:12
[Kotlin/Android] 네이버 지도 현위치 띄우기 (실시간 위치 연결) (tistory.com)
[Kotlin/Android] 네이버 지도 현위치 띄우기 (실시간 위치 연결)
[Kotlin/Android] 네이버 지도 연동하기 (tistory.com) [Kotlin/Android] 네이버 지도 연동하기NAVER MAP (네이버 지도) 연동하기 1. 어플리케이션 등록1. [네이버 클라우드 플랫폼] 접속2. [콘솔]로 이동 3. 회원
ynyn505.tistory.com
안녕하세요 !
바로 전 글에서는 네이버 지도 연결 후에 현위치 좌표 아이콘 띄우기를 했습니다.
이번에는 현위치 외에 표시하고 싶은 곳에 마커 표시를 하는 법을 알아보겠습니다.
아주아주 간단해요.
저는 메서드를 따로 줘서 만들었어요.
// 마커 표시 private fun setMarker(){ val marker1 = Marker() val marker2 = Marker() marker1.position = LatLng( 37.39710472617026, 126.97022259235382) marker2.position = LatLng(37.396550698344704, 126.97101652622223) // 디폴트색은 초록 // 유량 및 수압 구분값별로 색의 차이를 주는 코드 작성 marker1.icon = MarkerIcons.YELLOW; marker1.width = 70; marker1.height = 80 marker2.icon = MarkerIcons.RED; marker2.width = 70; marker2.height = 80 marker1.map = naverMap marker2.map = naverMap }
만약 저의 전 코드를 함께 사용한다면 이 부분을 꼭 보셔야 합니다.
평소처럼 아무생각없이 onCreateView() 에다가 setMarker()를 호출했다가 초기화되지 않았다는 에러가 떠서 확인해보니naverMap은 onMapReady가 호출될 때 초기화 되므로,
onCreateView() 에서 setMarker()를 호출하면 naverMap이 초기화 되기도 전에 사용되기 때문에 위와같은 에러가 뜨는 것 이였습니다.
참고하시면 좋을 것 같아요 ~~~
package com.example.android1_practice.ui.Map import android.Manifest import android.content.pm.PackageManager import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.content.ContextCompat import com.example.android1_practice.MainActivity import com.example.android1_practice.R import com.example.android1_practice.databinding.FragmentMapMainBinding import com.naver.maps.geometry.LatLng import com.naver.maps.map.LocationSource import com.naver.maps.map.LocationTrackingMode import com.naver.maps.map.MapFragment import com.naver.maps.map.NaverMap import com.naver.maps.map.OnMapReadyCallback import com.naver.maps.map.overlay.Marker import com.naver.maps.map.util.FusedLocationSource import com.naver.maps.map.util.MarkerIcons class MapMainFragment : Fragment() , OnMapReadyCallback { lateinit var _binding: FragmentMapMainBinding lateinit var mainActivity : MainActivity // 필요한 전역변수 세 개 만들어주기 private lateinit var locationSource: LocationSource private lateinit var naverMap: NaverMap // 위치 권한 요청 코드 private val LOCATION_PERMISSION_REQUEST_CODE = 1000 // 위치 권한 배열 private val PERMISSIONS = arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION) override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { // Inflate the layout for this fragment _binding = FragmentMapMainBinding.inflate(inflater) mainActivity = activity as MainActivity // 여기에 setMarker() 를 호출하면 UninitializedPropertyAccessException 에러가 남. // 그 이유: naverMap은 onMapReady가 호출될 때 초기화 되므로, naverMap이 초기화 되기도 전에 사용되기 때문 // 고로 onMapReady() 에서 호출해줘야함 // setMarker() return _binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 위치 권한이 있는지 확인하고 지도 초기화 if (hasPermission()) { initMapView() } else { requestPermissions(PERMISSIONS, LOCATION_PERMISSION_REQUEST_CODE) } } private fun initMapView() { val fm = childFragmentManager var mapFragment = fm.findFragmentById(R.id.naverMap) as MapFragment? if (mapFragment == null) { mapFragment = MapFragment.newInstance() if (mapFragment != null) { fm.beginTransaction().add(R.id.naverMap, mapFragment).commit() } } // OnMapReadyCallback 등록 if (mapFragment != null) { mapFragment.getMapAsync(this) } locationSource = FusedLocationSource(this, LOCATION_PERMISSION_REQUEST_CODE) } // 위치 권한 확인 private fun hasPermission(): Boolean { for (permission in PERMISSIONS) { if (ContextCompat.checkSelfPermission(requireContext(), permission) != PackageManager.PERMISSION_GRANTED) { return false } } return true } override fun onMapReady(p0: NaverMap) { this.naverMap = p0 // LocationSource 설정 naverMap.locationSource = locationSource // 현재 위치 버튼 활성화 naverMap.uiSettings.isLocationButtonEnabled = true // 위치 추적 모드 설정 naverMap.locationTrackingMode = LocationTrackingMode.Follow setMarker() } // 마커 표시 private fun setMarker(){ val marker1 = Marker() val marker2 = Marker() marker1.position = LatLng( 37.39710472617026, 126.97022259235382) marker2.position = LatLng(37.396550698344704, 126.97101652622223) // 디폴트색은 초록 // 유량 및 수압 구분값별로 색의 차이를 주는 코드 작성 marker1.icon = MarkerIcons.YELLOW; marker1.width = 70; marker1.height = 80 marker2.icon = MarkerIcons.RED; marker2.width = 70; marker2.height = 80 marker1.map = naverMap marker2.map = naverMap } }
그렇게 참고는 미래의 나만 하겠지 뭐... ㅎㅎ...
연나 화팅
! 끝 !