---
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) 문서를 참고하세요.