--- title: "Android 2.x → 3.x 마이그레이션 " slug: "naveropenapiv3-maps-android-sdk-v3-migration" tags: ["Mobile Dynamic Map"] updated: 2026-10-22T09:13:28Z published: 2026-10-22T09:13:28Z canonical: "guide-gov.ncloud-docs.com/naveropenapiv3-maps-android-sdk-v3-migration" --- > ## Documentation Index > Fetch the complete documentation index at: https://guide-gov.ncloud-docs.com/llms.txt > Use this file to discover all available pages before exploring further. # Android 2.x → 3.x 마이그레이션 Classic/VPC 환경에서 이용 가능합니다. ## 2.x → 3.x 마이그레이션 가이드 이 문서는 네이버 지도 Android SDK 버전 2.x를 [버전 3.x](/docs/naveropenapiv3-maps-android-sdk-v3-start)로 마이그레이션하는 방법을 설명합니다. ## 더 이상 제공되지 않는 기능 다음 기능은 3.x SDK에 포함되어 제공되지 않으므로 별도로 제공되는 대체 수단을 사용해 앱에서 구현해야 합니다. ### 좌표-주소 변환 기능 3.x SDK는 2.x SDK에서 `NMapActivity.findPlacemarkAtLocation()`을 호출해 사용할 수 있었던 좌표-주소 변환(Reverse geocoding) 기능을 제공하지 않습니다. 대신 NAVER CLOUD PLATFORM에서 제공하는 Reverse Geocoding API를 사용할 수 있습니다. 자세한 내용은 [Reverse Geocoding](/docs/naveropenapiv3-maps-reverse-geocoding-reverse-geocoding)을 참고하세요. ### "네이버 지도앱 실행" 버튼 3.x SDK는 2.x SDK에서 `NMapView.setBuiltInAppControls()`를 호출해 활성화할 수 있었던 "네이버 지도앱 실행" 버튼을 제공하지 않습니다. 대신 앱에서 직접 버튼을 배치하고 NAVER CLOUD PLATFORM에서 제공하는 지도앱 연동 URL Scheme 기능을 사용할 수 있습니다. 자세한 내용은 [지도앱 연동 URL Scheme](/docs/naveropenapiv3-maps-url-scheme-url-scheme)을 참고하세요. ### 마커 드래그 3.x SDK는 2.x SDK에서 `NMapPOIitem.setFloatingMode()`를 호출해 사용할 수 있었던 마커 드래그 기능을 제공하지 않습니다. 마커를 드래그하는 대신 화면의 중심에 마커 역할을 하는 뷰를 고정하고 지도를 움직여 위치를 지정하는 것을 권장합니다. 자세한 내용은 데모 앱의 [CameraEventActivity](https://github.com/navermaps/android-map-sdk/blob/master/app/src/main/java/com/naver/maps/map/demo/java/camera/CameraEventActivity.java) 예제를 참고하세요. ## 환경 설정 ### 의존성 추가 3.x SDK의 라이브러리 그룹 ID는 `com.naver.maps.open`에서 `com.naver.maps`로, 아티팩트 ID는 `naver-map-ncp-api`에서 `map-sdk`로 변경되었습니다. 따라서 의존성 선언을 `com.naver.maps.open:naver-map-ncp-api:2.1.x`에서 `com.naver.maps:map-sdk:3.11.0`으로 변경합니다. 또한 3.x SDK는 별도의 Bintray 저장소를 통해 배포됩니다. 저장소 목록에 `https://naver.jfrog.io/artifactory/maven/`을 추가합니다. #### 2.x ``` // 앱 모듈 build.gradle dependencies { implementation 'com.naver.maps.open:naver-map-ncp-api:2.1.7' } ``` #### 3.x ``` // 루트 프로젝트 build.gradle allprojects { repositories { maven { url 'https://naver.jfrog.io/artifactory/maven/' } } } // 앱 모듈 build.gradle dependencies { implementation 'com.naver.maps:map-sdk:3.11.0' } ``` 자세한 내용은 [시작하기](https://navermaps.github.io/android-map-sdk/guide-ko/1.html) 문서의 [의존성 추가](https://navermaps.github.io/android-map-sdk/guide-ko/1.html#%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%B6%94%EA%B0%80) 절을 참고하세요. ### 클라이언트 ID 지정 3.x SDK는 `NMapView.setNcpClientId()`를 호출하는 대신 [AndroidManifest.xml](https://developer.android.com/guide/topics/manifest/manifest-intro)의 [`<meta-data>`](https://developer.android.com/guide/topics/manifest/meta-data-element)를 지정하거나 [NaverMapSdk.setClient()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMapSdk.html#setClient-com.naver.maps.map.NaverMapSdk.Client-)를 호출해 클라이언트 ID를 지정합니다. 다음은 클라이언트 ID를 지정하는 예제입니다. #### 2.x ``` public class YourActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); NMapView mapView = findViewById(...); mapView.setNcpClientId("YOUR_CLIENT_ID_HERE"); } } ``` #### 3.x ``` public class YourApplication extends Application { @Override public void onCreate() { super.onCreate(); NaverMapSdk.getInstance(this).setClient( new NaverMapSdk.NaverCloudPlatformClient("YOUR_CLIENT_ID_HERE")); } } ``` 자세한 내용은 [시작하기](https://navermaps.github.io/android-map-sdk/guide-ko/1.html) 문서의 [클라이언트 ID 지정](https://navermaps.github.io/android-map-sdk/guide-ko/1.html#%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8-id-%EC%A7%80%EC%A0%95) 절을 참고하세요. ## 지도 객체 ### 지도 표시 3.x SDK는 [MapFragment](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/MapFragment.html) 또는 [MapView](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/MapView.html) 가 `NMapView`를 대신해 지도에 대한 뷰 역할을 합니다. 다음은 레이아웃 XML을 사용해 지도를 화면에 나타내는 예제입니다. #### 2.x ``` ``` #### 3.x ``` ``` 자세한 내용은 [지도 객체](https://navermaps.github.io/android-map-sdk/guide-ko/2-1.html) 문서의 [MapFragment](https://navermaps.github.io/android-map-sdk/guide-ko/2-1.html#mapfragment) 또는 [MapView](https://navermaps.github.io/android-map-sdk/guide-ko/2-1.html#mapview) 절을 참고하세요. ### 인터페이스 객체 3.x SDK는 [NaverMap](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html)이 `NMapController`를 대신해 지도에 대한 인터페이스 역할을 합니다. `NMapView.getMapController()` 대신 `MapFragment` 또는 `MapView`의 [getMapAsync()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/MapFragment.html#getMapAsync-com.naver.maps.map.OnMapReadyCallback-)를 호출해 객체를 얻을 수 있습니다. 다음은 지도 뷰에 대한 인터페이스 객체를 얻어오는 예제입니다. #### 2.x ``` NMapController mapController = mapView.getMapController(); // ... ``` #### 3.x ``` mapFragment.getMapAsync(naverMap -> { // ... }); ``` 자세한 내용은 [지도 객체](https://navermaps.github.io/android-map-sdk/guide-ko/2-1.html) 문서의 [NaverMap 객체 얻어오기](https://navermaps.github.io/android-map-sdk/guide-ko/2-1.html#navermap-%EA%B0%9D%EC%B2%B4-%EC%96%BB%EC%96%B4%EC%98%A4%EA%B8%B0) 절을 참고하세요. ### 좌표 3.x SDK는 LatLng가 `NGeoPoint`를 대신해 좌표를 나타냅니다. `LatLng`와 `NGeoPoint`는 생성자 파라미터의 경위도 순서가 반대이므로 주의해야 합니다. 다음은 좌표 객체를 생성하고 토스트로 위도와 경도를 출력하는 예제입니다. #### 2.x ``` NGeoPoint coord = new NGeoPoint(126.9783740, 37.5670135); // 경도, 위도순 Toast.makeText(context, "위도: " + coord.latitude + ", 경도: " + coord.longitude, Toast.LENGTH_SHORT).show(); ``` #### 3.x ``` LatLng coord = new LatLng(37.5670135, 126.9783740); // 위도, 경도순 Toast.makeText(context, "위도: " + coord.latitude + ", 경도: " + coord.longitude, Toast.LENGTH_SHORT).show(); ``` 자세한 내용은 [좌표 객체](https://navermaps.github.io/android-map-sdk/guide-ko/2-2.html) 문서의 LatLng 절을 참고하세요. ### 지도 유형 지정 지도의 유형을 지정하려면 `NMapController.setMapViewMode()` 대신 [NaverMap.setMapType()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html#setMapType-com.naver.maps.map.NaverMap.MapType-)을 호출합니다. 다음은 지도의 유형을 하이브리드로 지정하는 예제입니다. #### 2.x ``` mapController.setMapViewMode(NMapView.VIEW_MODE_HYBRID); ``` #### 3.x ``` naverMap.setMapType(NaverMap.MapType.Hybrid); ``` 자세한 내용은 [지도 옵션](https://navermaps.github.io/android-map-sdk/guide-ko/2-3.html) 문서의 [지도 유형](https://navermaps.github.io/android-map-sdk/guide-ko/2-3.html#%EC%A7%80%EB%8F%84-%EC%9C%A0%ED%98%95) 절을 참고하세요. ### 레이어 그룹 지정 특정 레이어 그룹을 활성화하려면 `NMapController.setMapViewTrafficMode()`, `NMapController.setMapViewBicycleMode()`와 같은 개별 메서드 대신 [NaverMap.setLayerGroupEnabled()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html#setLayerGroupEnabled-java.lang.String-boolean-)를 호출합니다. 다음은 실시간 교통정보, 자전거 레이어 그룹을 활성화하는 예제입니다. #### 2.x ``` mapController.setMapViewTrafficMode(true); mapController.setMapViewBicycleMode(true); ``` #### 3.x ``` naverMap.setLayerGroupEnabled(NaverMap.LAYER_GROUP_TRAFFIC, true); naverMap.setLayerGroupEnabled(NaverMap.LAYER_GROUP_BICYCLE, true); ``` 자세한 내용은 [지도 옵션](https://navermaps.github.io/android-map-sdk/guide-ko/2-3.html) 문서의 [레이어 그룹](https://navermaps.github.io/android-map-sdk/guide-ko/2-3.html#%EB%A0%88%EC%9D%B4%EC%96%B4-%EA%B7%B8%EB%A3%B9) 절을 참고하세요. ## 카메라와 투영 ### 카메라의 위치 3.x SDK는 2.x SDK와 다른 줌 레벨 체계를 사용합니다. 동일한 축척일 때 3.x SDK의 줌 레벨이 2.x SDK보다 4 정도 큽니다. 또한 줌 레벨의 타입이 `int`에서 `double`로 변경되었습니다. 3.x SDK는 좌표, 줌 레벨 등 카메라와 관련된 값을 낱개로 사용하는 2.x SDK와 달리 이러한 값을 묶은 [CameraPosition](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/CameraPosition.html) 클래스를 사용합니다. 자세한 내용은 [카메라와 투영](https://navermaps.github.io/android-map-sdk/guide-ko/3-1.html) 문서의 [카메라의 위치](https://navermaps.github.io/android-map-sdk/guide-ko/3-1.html#%EC%B9%B4%EB%A9%94%EB%9D%BC%EC%9D%98%20%EC%9C%84%EC%B9%98) 절을 참고하세요. ### 카메라의 현재 위치 카메라의 현재 위치를 얻어오려면 `NMapController.getMapCenter()` 및 `NMapController.getZoomLevel()`을 호출하는 대신 [NaverMap.getCameraPosition()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html#getCameraPosition--)을 호출합니다. 다음은 카메라의 현재 위치를 얻고 토스트로 각 속성을 출력하는 예제입니다. #### 2.x ``` NGeoPoint center = mapController.getMapCenter(); int zoom = mapController.getZoomLevel(); Toast.makeText(context, "중심 위도: " + center.latitude + ", " + "중심 경도: " + center.longitude + ", " + "줌 레벨: " + zoom, Toast.LENGTH_SHORT).show(); ``` #### 3.x ``` CameraPosition cameraPosition = naverMap.getCameraPosition(); Toast.makeText(context, "대상 지점 위도: " + cameraPosition.target.latitude + ", " + "대상 지점 경도: " + cameraPosition.target.longitude + ", " + "줌 레벨: " + cameraPosition.zoom + ", " + "기울임 각도: " + cameraPosition.tilt + ", " + "베어링 각도: " + cameraPosition.bearing, Toast.LENGTH_SHORT).show(); ``` 자세한 내용은 [카메라와 투영](https://navermaps.github.io/android-map-sdk/guide-ko/3-1.html) 문서의 [카메라의 현재 위치](https://navermaps.github.io/android-map-sdk/guide-ko/3-1.html#%EC%B9%B4%EB%A9%94%EB%9D%BC%EC%9D%98-%ED%98%84%EC%9E%AC-%EC%9C%84%EC%B9%98) 절을 참고하세요. ### 카메라 이동 카메라를 이동하려면 `NMapController.setMapCenter()`를 호출하는 대신 [CameraUpdate](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/CameraUpdate.html) 객체를 생성해 [moveCamera()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html#moveCamera-com.naver.maps.map.CameraUpdate-)를 호출합니다. 다음은 카메라의 대상 좌표를 `(37.5666102, 126.9783881)` 지점으로, 줌 레벨을 15(2.x SDK 기준 11)로 변경하는 예제입니다. #### 2.x ``` mapController.setMapCenter(new NGeoPoint(126.9783881, 37.5666102), 11); ``` #### 3.x ``` CameraUpdate cameraUpdate = CameraUpdate.scrollAndZoomTo(new LatLng(37.5666102, 126.9783881), 15); ``` 자세한 내용은 [카메라 이동](https://navermaps.github.io/android-map-sdk/guide-ko/3-2.html) 문서의 [API 호출로 카메라 이동하기](https://navermaps.github.io/android-map-sdk/guide-ko/3-2.html#api-%ED%98%B8%EC%B6%9C%EB%A1%9C-%EC%B9%B4%EB%A9%94%EB%9D%BC-%EC%9D%B4%EB%8F%99%ED%95%98%EA%B8%B0) 절을 참고하세요. ### 카메라 변경 이벤트 카메라 변경 이벤트를 받으려면 `NMapView.setOnMapStateChangeListener()` 대신 [NaverMap.addOnCameraChangeListener()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html#addOnCameraChangeListener-com.naver.maps.map.NaverMap.OnCameraChangeListener-)를 호출해 이벤트 리스너를 등록합니다. 다음은 카메라 변경 이벤트를 받아 변경된 위치를 로깅하는 예제입니다. #### 2.x ``` mapView.setOnMapStateChangeListener(new NMapView.OnMapStateChangeListener() { @Override public void onMapInitHandler(NMapView mapView, NMapError errorInfo) { // 미사용 } @Override public void onAnimationStateChange(NMapView mapView, int animType, int animState) { // 미사용 } @Override public void onMapCenterChange(NMapView mapView, NGeoPoint center) { Log.i("NaverMap", "중심 변경 - 위도: " + center.latitude + ", 경도: " + center.longitude); } @Override public void onZoomLevelChange(NMapView mapView, int level) { Log.i("NaverMap", "줌 레벨 변경: " + level); } }); ``` #### 3.x ``` naverMap.addOnCameraChangeListener((reason, animated) -> { CameraPosition cameraPosition = naverMap.getCameraPosition(); Log.i("NaverMap", "카메라 변경 - 대상 지점 위도: " + cameraPosition.target.latitude + ", " + "대상 지점 경도: " + cameraPosition.target.longitude + ", " + "줌 레벨: " + cameraPosition.zoom + ", " + "기울임 각도: " + cameraPosition.tilt + ", " + "베어링 각도: " + cameraPosition.bearing); }); ``` 자세한 내용은 [카메라 이동](https://navermaps.github.io/android-map-sdk/guide-ko/3-2.html) 문서의 [카메라 변경 이벤트](https://navermaps.github.io/android-map-sdk/guide-ko/3-2.html#%EC%B9%B4%EB%A9%94%EB%9D%BC-%EB%B3%80%EA%B2%BD-%EC%9D%B4%EB%B2%A4%ED%8A%B8) 절을 참고하세요. ### 투영 화면 좌표와 지도 좌표를 상호 변환하려면 `NMapProjection` 대신 [Projection](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/Projection.html) 클래스를 사용합니다. [NaverMap.getProjection()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html#getProjection--)을 호출해 인스턴스에 접근할 수 있습니다. 화면 좌표를 지도 좌표로 변환하려면 `NMapProjection.fromPixels()` 대신 [Projection.fromScreenLocation()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/Projection.html#fromScreenLocation-android.graphics.PointF-)을, 지도 좌표를 화면 좌표로 변환하려면 `NMapProjection.toPixels()` 대신 [toScreenLocation()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/Projection.html#toScreenLocation-com.naver.maps.geometry.LatLng-)을 호출합니다. 다음은 화면의 `(100, 100)` 지점을 지도 좌표로 변환하는 예제입니다. #### 2.x ``` mapView.getMapProjection().fromPixels(100, 100); ``` #### 3.x ``` LatLng coord = naverMap.getProjection().fromScreenLocation(new PointF(100, 100)); ``` 다음은 지도의 `(37.5666102, 126.9783881)` 지점을 화면 좌표로 변환하는 예제입니다. #### 2.x ``` Point point = new Point(); mapView.getMapProjection().toPixels(new NGeoPoint(126.9783881, 37.5666102), point); ``` #### 3.x ``` PointF point = naverMap.getProjection().toScreenLocation(new LatLng(37.5666102, 126.9783881)); ``` 자세한 내용은 [카메라와 투영](https://navermaps.github.io/android-map-sdk/guide-ko/3-1.html) 문서의 [화면 좌표와 지도 좌표 간 변환](https://navermaps.github.io/android-map-sdk/guide-ko/3-1.html#%ED%99%94%EB%A9%B4-%EC%A2%8C%ED%91%9C%EC%99%80-%EC%A7%80%EB%8F%84-%EC%A2%8C%ED%91%9C-%EA%B0%84-%EB%B3%80%ED%99%98) 절을 참고하세요. ## 상호작용 ### 컨트롤 3.x SDK에는 줌 컨트롤을 비롯한 여러 가지 컨트롤이 내장되어 있습니다. 2.x SDK에서 `NMapView.setBuiltInZoomControls()`를 호출해 활성화하는 줌 컨트롤은 기본적으로 활성화되며, 비활성화하려면 [UiSettings.setZoomButtonEnabled()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/UiSettings.html#setZoomButtonEnabled-boolean-)를 호출합니다. `UiSettings` 객체는 [NaverMap.getUiSettings()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html#getUiSettings--)를 호출해 얻을 수 있습니다. #### 2.x ``` mapController.setBuiltInZoomControls(true, null); ``` #### 3.x ``` naverMap.getUiSettings().setZoomButtonEnabled(true); ``` 자세한 내용은 [사용자 인터페이스](https://navermaps.github.io/android-map-sdk/guide-ko/4-1.html) 문서의 [컨트롤](https://navermaps.github.io/android-map-sdk/guide-ko/4-1.html#%EC%BB%A8%ED%8A%B8%EB%A1%A4) 절을 참고하세요. ### UI 이벤트 지도의 클릭, 롱 클릭 이벤트를 받으려면 `NMapView.setOnMapViewTouchEventListener()` 대신 [NaverMap.setOnMapClickListener()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html#setOnMapClickListener-com.naver.maps.map.NaverMap.OnMapClickListener-) 및 [NaverMap.setOnMapLongClickListener()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html#setOnMapLongClickListener-com.naver.maps.map.NaverMap.OnMapLongClickListener-)를 호출해 이벤트 리스너를 등록합니다. 다음은 지도의 클릭, 롱 클릭 이벤트를 받아 토스트로 클릭된 좌표를 출력하는 예제입니다. #### 2.x ``` mapView.setOnMapViewTouchEventListener(new NMapView.OnMapViewTouchEventListener() { @Override public void onLongPress(NMapView mapView, MotionEvent ev) { NGeoPoint coord = mapView.getMapProjection().fromPixels((int)ev.getX(), (int)ev.getY()); Toast.makeText(this, "롱 클릭: " + coord.latitude + ", " + coord.longitude, Toast.LENGTH_SHORT).show(); } @Override public void onLongPressCanceled(NMapView mapView) { // 미사용 } @Override public void onTouchDown(NMapView mapView, MotionEvent ev) { // 미사용 } @Override public void onTouchUp(NMapView mapView, MotionEvent ev) { // 미사용 } @Override public void onScroll(NMapView mapView, MotionEvent e1, MotionEvent e2) { // 미사용 } @Override public void onSingleTapUp(NMapView mapView, MotionEvent ev) { NGeoPoint coord = mapView.getMapProjection().fromPixels((int)ev.getX(), (int)ev.getY()); Toast.makeText(this, "클릭: " + coord.latitude + ", " + coord.longitude, Toast.LENGTH_SHORT).show(); } }); ``` #### 3.x ``` naverMap.setOnMapClickListener((point, coord) -> Toast.makeText(this, "클릭: " + coord.latitude + ", " + coord.longitude, Toast.LENGTH_SHORT).show()); naverMap.setOnMapLongClickListener((point, coord) -> Toast.makeText(this, "롱 클릭: " + coord.latitude + ", " + coord.longitude, Toast.LENGTH_SHORT).show()); ``` 자세한 내용은 [사용자 인터페이스](https://navermaps.github.io/android-map-sdk/guide-ko/4-1.html) 문서의 [UI 이벤트](https://navermaps.github.io/android-map-sdk/guide-ko/4-1.html#ui-%EC%9D%B4%EB%B2%A4%ED%8A%B8) 절을 참고하세요. ### 위치 2.x SDK는 위치 추적 기능을 사용하려면 `NMapLocationManager`, `NMapCompassManager`, `NMapMyLocationOverlay`를 생성하고 기능을 활성화하는 메서드를 각각 호출해야 했습니다. 3.x SDK에는 위치 추적 기능이 내장되어 있으므로 [NaverMap.setLocationSource()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html#setLocationSource-com.naver.maps.map.LocationSource-)를 호출해 [LocationSource](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/LocationSource.html) 구현체를 지정하고 [NaverMap.setLocationTrackingMode()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html#setLocationTrackingMode-com.naver.maps.map.LocationTrackingMode-)를 호출하면 위치 추적 기능이 활성화됩니다. 다음은 위치 추적 기능을 활성화하는 예제입니다. #### 2.x ``` NMapController mapController = mapView.getMapController(); NMapLocationManager mapLocationManager = new NMapLocationManager(context); mapLocationManager.setOnLocationChangeListener(onMyLocationChangeListener); mapLocationManager.enableMyLocation(new NMapLocationManager.OnLocationChangeListener() { @Override public boolean onLocationChanged(NMapLocationManager locationManager, NGeoPoint myLocation) { mapController.animateTo(myLocation); return true; } @Override public void onLocationUpdateTimeout(NMapLocationManager locationManager) { // 미사용 } @Override public void onLocationUnavailableArea(NMapLocationManager locationManager, NGeoPoint myLocation) { // 미사용 } }); NMapCompassManager mapCompassManager = new NMapCompassManager(context); mapCompassManager.enableCompass(); NMapViewerResourceProvider mapViewerResourceProvider = new NMapViewerResourceProvider(context); NMapOverlayManager overlayManager = new NMapOverlayManager(context, mapView, mapViewerResourceProvider); NMapMyLocationOverlay myLocationOverlay = mapOverlayManager.createMyLocationOverlay(mapLocationManager, mapCompassManager); myLocationOverlay.setCompassHeadingVisible(true); mapView.setAutoRotateEnabled(true, false); ``` #### 3.x ``` naverMap.setLocationSource(new FusedLocationSource(activity, LOCATION_PERMISSION_REQUEST_CODE)); naverMap.setLocationTrackingMode(LocationTrackingMode.Face); ``` 자세한 내용은 [위치](https://navermaps.github.io/android-map-sdk/guide-ko/4-2.html) 문서를 참고하세요. ## 오버레이 ### 사용 준비 2.x SDK에서 오버레이 기능을 사용하려면 먼저 `NMapViewerResourceProvider`와 `NMapOverlayManager`를 생성하고, 각 오버레이에 `NMapXXXdata`를 생성한 후 `NMapOverlayManager.createXXX()` 메서드를 호출해야 했습니다. 3.x SDK에서는 오버레이 객체 각각이 기능을 독립적으로 완결성 있게 수행하므로 이러한 준비 과정이 필요하지 않습니다. 필요한 오버레이 객체를 생성하고 속성을 객체에 직접 지정한 후 `setMap()`을 호출하면 오버레이가 지도에 나타납니다. 다음은 오버레이 기능을 사용하기 위해 관련 객체를 준비하는 예제입니다. #### 2.x ``` NMapViewerResourceProvider mapViewerResourceProvider = new NMapViewerResourceProvider(context); NMapOverlayManager overlayManager = new NMapOverlayManager(context, mapView, mapViewerResourceProvider); ``` #### 3.x ``` // 준비 과정 불필요 ``` ### 클릭 이벤트 2.x SDK에서는 오버레이의 클릭 이벤트를 받으려면 오버레이 유형별로 `setOnFocusChangeListener()`, `setOnStateChangeListener()` 같은 메서드를 각각 호출해야 했습니다. 3.x SDK에서는 [Overlay.setOnClickListener()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/overlay/Overlay.html#setOnClickListener-com.naver.maps.map.overlay.Overlay.OnClickListener-) 메서드로 [Overlay.OnClickListener](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/overlay/Overlay.OnClickListener.html)를 지정합니다. #### 2.x ``` NMapPOIdataOverlay overlay = ... overlay.setOnStateChangeListener(new NMapPOIdataOverlay.OnStateChangeListener() { @Override public void onCalloutClick(NMapPOIdataOverlay poiDataOverlay, NMapPOIitem item) { Toast.makeText(context, "정보 창 클릭", Toast.LENGTH_SHORT).show(); } @Override public void onFocusChanged(NMapPOIdataOverlay poiDataOverlay, NMapPOIitem item) { if (item != null) { Toast.makeText(context, "오버레이 클릭", Toast.LENGTH_SHORT).show(); } } }); ``` #### 3.x ``` Overlay overlay = ... overlay.setOnClickListener(o -> { Toast.makeText(context, "오버레이 클릭", Toast.LENGTH_SHORT).show(); return true; }); ``` 자세한 내용은 [오버레이 공통](https://navermaps.github.io/android-map-sdk/guide-ko/5-1.html) 문서의 [이벤트](https://navermaps.github.io/android-map-sdk/guide-ko/5-1.html#%EC%9D%B4%EB%B2%A4%ED%8A%B8) 절을 참고하세요. ### 마커 2.x SDK에서는 마커를 지도에 추가하려면 `NMapPOIdata`를 생성하고 `NMapOverlayManager.createPOIdataOverlay()`를 호출해야 했습니다. 3.x SDK에서는 [Marker](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/overlay/Marker.html) 객체를 생성하고 필요한 속성을 객체에 직접 지정한 후 `setMap()`을 호출합니다. 마커 드래그 기능은 더 이상 제공되지 않습니다. 다음은 마커를 지도에 추가하는 예제입니다. #### 2.x ``` NMapPOIdata poiData = new NMapPOIdata(1, mapViewerResourceProvider); poiData.beginPOIdata(1); poiData.addPOIitem(126.9783740, 37.5670135, null, NMapPOIflagType.PIN, 0); poiData.endPOIdata(); NMapPOIdataOverlay marker = mapOverlayManager.createPOIdataOverlay(poiData, null); marker.showAllPOIdata(0); ``` #### 3.x ``` Marker marker = new Marker(); marker.setPosition(new LatLng(37.5670135, 126.9783740)); marker.setMap(naverMap); ``` 자세한 내용은 [마커](https://navermaps.github.io/android-map-sdk/guide-ko/5-2.html) 문서를 참고하세요. ### 정보 창 2.x SDK에서는 마커의 제목을 지정한 경우 마커를 클릭하면 자동으로 마커 위에 정보 창이 나타났습니다. 정보 창을 별도로 생성하거나 동시에 한 개 이상 노출할 수 없었습니다. 3.x SDK에서는 정보 창도 마커처럼 독립적인 객체이므로 자유롭게 생성하고 추가할 수 있습니다. 정보 창을 지도에 추가하려면 [InfoWindow](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/overlay/InfoWindow.html) 객체를 생성하고 필요한 속성을 객체에 직접 지정한 후 `setMap()`을 호출합니다. 다음은 마커를 클릭하면 정보 창을 지도에 추가하는 예제입니다. #### 2.x ``` NMapPOIdata poiData = new NMapPOIdata(1, mapViewerResourceProvider); poiData.beginPOIdata(1); poiData.addPOIitem(126.9783740, 37.5670135, "정보 창 내용", NMapPOIflagType.PIN, 0); poiData.endPOIdata(); NMapPOIdataOverlay marker = mapOverlayManager.createPOIdataOverlay(poiData, null); marker.setOnStateChangeListener(new NMapPOIdataOverlay.OnStateChangeListener() { @Override public void onCalloutClick(NMapPOIdataOverlay poiDataOverlay, NMapPOIitem item) { Toast.makeText(context, "정보 창 클릭", Toast.LENGTH_SHORT).show(); } @Override public void onFocusChanged(NMapPOIdataOverlay poiDataOverlay, NMapPOIitem item) { // 미사용 } }); marker.showAllPOIdata(0); ``` #### 3.x ``` InfoWindow infoWindow = new InfoWindow(); infoWindow.setAdapter(new InfoWindow.DefaultTextAdapter(context) { @NonNull @Override public CharSequence getText(@NonNull InfoWindow infoWindow) { return (CharSequence)infoWindow.getMarker().getTag(); } }); infoWindow.setOnClickListener(overlay -> { Toast.makeText(context, "정보 창 클릭", Toast.LENGTH_SHORT).show(); return true; }); Marker marker = new Marker(); marker.setPosition(new LatLng(37.5670135, 126.9783740)); marker.setTag("정보 창 내용"); marker.setOnClickListener(overlay -> { infoWindow.open((Marker)overlay); return true; }); marker.setMap(naverMap); ``` 자세한 내용은 [정보 창](https://navermaps.github.io/android-map-sdk/guide-ko/5-3.html) 문서를 참고하세요. ### 셰이프 2.x SDK에서는 셰이프를 지도에 추가하려면 `NMapPathData`에 셰이프의 좌표를, `NMapPathLineStyle` 또는 `NMapCircleStyle` 객체를 이용해 셰이프의 스타일을 지정하고 `NMapOverlayManager.createPathDataOverlay()`를 호출해야 했습니다. 3.x SDK에서는 [PolylineOverlay](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/overlay/PolylineOverlay.html), [PolygonOverlay](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/overlay/PolygonOverlay.html), [CircleOverlay](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/overlay/CircleOverlay.html) 등 유형별 셰이프 객체를 생성하고 필요한 속성을 객체에 직접 지정한 후 `setMap()`을 호출합니다. 다음은 폴리라인을 지도에 추가하는 예제입니다. #### 2.x ``` NMapPathLineStyle pathLineStyle = new NMapPathLineStyle(context); pathLineStyle.setPataDataType(NMapPathLineStyle.DATA_TYPE_POLYLINE); pathLineStyle.setLineColor(0x00FF00, 0xFF); NMapPathData pathData = new NMapPathData(9); pathData.initPathData(); pathData.addPathPoint(126.97714, 37.57152, NMapPathLineStyle.TYPE_SOLID); pathData.addPathPoint(126.98268, 37.56607, 0); pathData.addPathPoint(126.97707, 37.56445, 0); pathData.addPathPoint(126.97822, 37.55855, 0); pathData.endPathData(); NMapPathDataOverlay polyline = mapOverlayManager.createPathDataOverlay(pathData); polyline.showAllPathData(0); ``` #### 3.x ``` PolylineOverlay polyline = new PolylineOverlay(); polyline.setCoords(Arrays.asList( new LatLng(37.57152, 126.97714), new LatLng(37.56607, 126.98268), new LatLng(37.56445, 126.97707), new LatLng(37.55855, 126.97822) )); polyline.setColor(0xFF00FF00); polyline.setMap(naverMap); ``` 다음은 폴리곤을 지도에 추가하는 예제입니다. #### 2.x ``` NMapPathLineStyle pathLineStyle = new NMapPathLineStyle(context); pathLineStyle.setPataDataType(NMapPathLineStyle.DATA_TYPE_POLYGON); pathLineStyle.setFillColor(0xFFFFFF, 0xFF); pathLineStyle.setLineColor(0x00FF00, 0xFF); NMapPathData pathData = new NMapPathData(5); pathData.initPathData(); pathData.addPathPoint126.9712268, 37.5640984, NMapPathLineStyle.TYPE_SOLID); pathData.addPathPoint126.9767904, 37.5651279, 0); pathData.addPathPoint126.9832241, 37.5625365, 0); pathData.addPathPoint126.9809297, 37.5585305, 0); pathData.addPathPoint126.974617, 37.5590777, 0); pathData.endPathData(); pathData.setPathLineStyle(pathLineStyle); NMapPathDataOverlay polygon = mapOverlayManager.createPathDataOverlay(pathData); polygon.showAllPathData(0); ``` #### 3.x ``` PolygonOverlay polygon = new PolygonOverlay(); polygon.setCoords(Arrays.asList( new LatLng(37.5640984, 126.9712268), new LatLng(37.5651279, 126.9767904), new LatLng(37.5625365, 126.9832241), new LatLng(37.5585305, 126.9809297), new LatLng(37.5590777, 126.974617) )); polygon.setColor(0xFFFFFFFF); polygon.setOutlineColor(0xFF00FF00); polygon.setMap(naverMap); ``` 다음은 서클을 지도에 추가하는 예제입니다. #### 2.x ``` NMapCircleStyle circleStyle = new NMapCircleStyle(context); circleStyle.setFillColor(0xFFFFFF, 0xFF); circleStyle.setStrokeColor(0x00FF00, 0xFF); NMapCircleData circleData = new NMapCircleData(1); circleData.initCircleData(); circleData.addCirclePoint(126.9783881, 37.5666102, 50f); circleData.endCircleData(); circleData.setCircleStyle(circleStyle); NMapPathDataOverlay circle = mapOverlayManager.createPathDataOverlay(pathData); circle.showAllPathData(0); ``` #### 3.x ``` CircleOverlay circle = new CircleOverlay(); circle.setCenter(new LatLng(37.5666102, 126.9783881)); circle.setRadius(50); circle.setColor(0xFFFFFFFF); circle.setOutlineColor(0xFF00FF00); circle.setMap(naverMap); ``` 자세한 내용은 [셰이프](https://navermaps.github.io/android-map-sdk/guide-ko/5-4.html) 문서를 참고하세요. ### 위치 오버레이 2.x SDK는 위치 오버레이와 위치 추적 기능이 분리되지 않아 `NMapLocationManager`, `NMapCompassManager`를 생성해야만 위치 오버레이를 생성할 수 있었습니다. 또한 오버레이의 위치 등을 임의로 지정할 수 없었습니다. 3.x SDK는 위치 오버레이가 위치 추적 기능과 독립적으로 동작하므로 [NaverMap.getLocationOverlay()](https://navermaps.github.io/android-map-sdk/reference/com/naver/maps/map/NaverMap.html#getLocationOverlay--)를 호출해 인스턴스에 접근한 후 필요한 속성을 직접 지정할 수 있습니다. #### 2.x ``` NMapLocationManager mapLocationManager = new NMapLocationManager(context); NMapCompassManager mapCompassManager = new NMapCompassManager(context); NMapMyLocationOverlay myLocationOverlay = mapOverlayManager.createMyLocationOverlay(mapLocationManager, mapCompassManager); ``` #### 3.x ``` LocationOverlay locationOverlay = naverMap.getLocationOverlay(); locationOverlay.setVisible(true); ``` 자세한 내용은 [위치 오버레이](https://navermaps.github.io/android-map-sdk/guide-ko/5-5.html) 문서를 참고하세요.