2.x → 3.x 마이그레이션 가이드
이 문서는 네이버 지도 Android SDK 버전 2.x를 버전 3.x로 마이그레이션하는 방법을 설명합니다.
더 이상 제공되지 않는 기능
다음 기능은 3.x SDK에 포함되어 제공되지 않으므로 별도로 제공되는 대체 수단을 사용해 앱에서 구현해야 합니다.
좌표-주소 변환 기능
3.x SDK는 2.x SDK에서 NMapActivity.findPlacemarkAtLocation()
을 호출해 사용할 수 있었던 좌표-주소 변환(Reverse geocoding) 기능을 제공하지 않습니다. 대신 NAVER CLOUD PLATFORM에서 제공하는 Reverse Geocoding API를 사용할 수 있습니다. 자세한 내용은 Reverse Geocoding을 참고하세요.
"네이버 지도앱 실행" 버튼
3.x SDK는 2.x SDK에서 NMapView.setBuiltInAppControls()
를 호출해 활성화할 수 있었던 "네이버 지도앱 실행" 버튼을 제공하지 않습니다. 대신 앱에서 직접 버튼을 배치하고 NAVER CLOUD PLATFORM에서 제공하는 지도앱 연동 URL Scheme 기능을 사용할 수 있습니다. 자세한 내용은 지도앱 연동 URL Scheme을 참고하세요.
마커 드래그
3.x SDK는 2.x SDK에서 NMapPOIitem.setFloatingMode()
를 호출해 사용할 수 있었던 마커 드래그 기능을 제공하지 않습니다. 마커를 드래그하는 대신 화면의 중심에 마커 역할을 하는 뷰를 고정하고 지도를 움직여 위치를 지정하는 것을 권장합니다. 자세한 내용은 데모 앱의 CameraEventActivity 예제를 참고하세요.
환경 설정
의존성 추가
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.19.1
으로 변경합니다.
또한 3.x SDK는 별도의 Maven 저장소를 통해 배포됩니다. 저장소 목록에 https://repository.map.naver.com/archive/maven
을 추가합니다.
// 앱 모듈 build.gradle
dependencies {
implementation 'com.naver.maps.open:naver-map-ncp-api:2.1.7'
}
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://repository.map.naver.com/archive/maven'
}
}
}
// 앱 모듈 build.gradle
dependencies {
implementation 'com.naver.maps:map-sdk:3.19.1'
}
자세한 내용은 시작하기 문서의 의존성 추가 절을 참고하세요.
클라이언트 ID 지정
3.x SDK는 NMapView.setNcpClientId()
를 호출하는 대신 AndroidManifest.xml
의 <meta-data>
를 지정하거나 NaverMapSdk.setClient()
를 호출해 클라이언트 ID를 지정합니다.
다음은 클라이언트 ID를 지정하는 예제입니다.
public class YourActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
NMapView mapView = findViewById(...);
mapView.setNcpClientId("YOUR_CLIENT_ID_HERE");
}
}
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"));
}
}
자세한 내용은 시작하기 문서의 클라이언트 ID 지정 절을 참고하세요.
지도 객체
지도 표시
3.x SDK는 MapFragment
또는 MapView
가 NMapView
를 대신해 지도에 대한 뷰 역할을 합니다.
다음은 레이아웃 XML을 사용해 지도를 화면에 나타내는 예제입니다.
<com.nhn.android.maps.NMapView
android:id="@+id/map_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
2.x
<com.nhn.android.maps.NMapView
android:id="@+id/map_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
3.x
<androidx.fragment.app.FragmentContainerView
android:id="@+id/map_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.naver.maps.map.MapFragment" />
자세한 내용은 지도 객체 문서의 MapFragment 또는 MapView 절을 참고하세요.
인터페이스 객체
3.x SDK는 NaverMap
이 NMapController
를 대신해 지도에 대한 인터페이스 역할을 합니다. NMapView.getMapController()
대신 MapFragment
또는 MapView
의 getMapAsync()
를 호출해 객체를 얻을 수 있습니다.
다음은 지도 뷰에 대한 인터페이스 객체를 얻어오는 예제입니다.
NMapController mapController = mapView.getMapController();
// ...
2.x
NMapController mapController = mapView.getMapController();
// ...
3.x
mapFragment.getMapAsync(naverMap -> {
// ...
});
자세한 내용은 지도 객체 문서의 NaverMap 객체 얻어오기 절을 참고하세요.
좌표
3.x SDK는 LatLng
가 NGeoPoint
를 대신해 좌표를 나타냅니다. LatLng
와 NGeoPoint
는 생성자 파라미터의 경위도 순서가 반대이므로 주의해야 합니다.
다음은 좌표 객체를 생성하고 토스트로 위도와 경도를 출력하는 예제입니다.
NGeoPoint coord = new NGeoPoint(126.9783740, 37.5670135); // 경도, 위도순
Toast.makeText(context, "위도: " + coord.latitude + ", 경도: " + coord.longitude, Toast.LENGTH_SHORT).show();
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();
자세한 내용은 좌표 객체 문서의 LatLng 절을 참고하세요.
지도 유형 지정
지도의 유형을 지정하려면 NMapController.setMapViewMode()
대신 NaverMap.setMapType()
을 호출합니다.
다음은 지도의 유형을 하이브리드로 지정하는 예제입니다.
mapController.setMapViewMode(NMapView.VIEW_MODE_HYBRID);
2.x
mapController.setMapViewMode(NMapView.VIEW_MODE_HYBRID);
3.x
naverMap.setMapType(NaverMap.MapType.Hybrid);
자세한 내용은 지도 옵션 문서의 지도 유형 절을 참고하세요.
레이어 그룹 지정
특정 레이어 그룹을 활성화하려면 NMapController.setMapViewTrafficMode()
, NMapController.setMapViewBicycleMode()
와 같은 개별 메서드 대신 NaverMap.setLayerGroupEnabled()
를 호출합니다.
다음은 실시간 교통정보, 자전거 레이어 그룹을 활성화하는 예제입니다.
mapController.setMapViewTrafficMode(true);
mapController.setMapViewBicycleMode(true);
2.x
mapController.setMapViewTrafficMode(true);
mapController.setMapViewBicycleMode(true);
3.x
naverMap.setLayerGroupEnabled(NaverMap.LAYER_GROUP_TRAFFIC, true);
naverMap.setLayerGroupEnabled(NaverMap.LAYER_GROUP_BICYCLE, true);
자세한 내용은 지도 옵션 문서의 레이어 그룹 절을 참고하세요.
카메라와 투영
카메라의 위치
3.x SDK는 2.x SDK와 다른 줌 레벨 체계를 사용합니다. 동일한 축척일 때 3.x SDK의 줌 레벨이 2.x SDK보다 4 정도 큽니다. 또한 줌 레벨의 타입이 int
에서 double
로 변경되었습니다.
3.x SDK는 좌표, 줌 레벨 등 카메라와 관련된 값을 낱개로 사용하는 2.x SDK와 달리 이러한 값을 묶은 CameraPosition
클래스를 사용합니다.
자세한 내용은 카메라와 투영 문서의 카메라의 위치 절을 참고하세요.
카메라의 현재 위치
카메라의 현재 위치를 얻어오려면 NMapController.getMapCenter()
및 NMapController.getZoomLevel()
을 호출하는 대신 NaverMap.getCameraPosition()
을 호출합니다.
다음은 카메라의 현재 위치를 얻고 토스트로 각 속성을 출력하는 예제입니다.
NGeoPoint center = mapController.getMapCenter();
int zoom = mapController.getZoomLevel();
Toast.makeText(context, "중심 위도: " + center.latitude + ", " +
"중심 경도: " + center.longitude + ", " +
"줌 레벨: " + zoom,
Toast.LENGTH_SHORT).show();
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();
자세한 내용은 카메라와 투영 문서의 카메라의 현재 위치 절을 참고하세요.
카메라 이동
카메라를 이동하려면 NMapController.setMapCenter()
를 호출하는 대신 CameraUpdate
객체를 생성해 moveCamera()
를 호출합니다.
다음은 카메라의 대상 좌표를 (37.5666102, 126.9783881)
지점으로, 줌 레벨을 15(2.x SDK 기준 11)로 변경하는 예제입니다.
mapController.setMapCenter(new NGeoPoint(126.9783881, 37.5666102), 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);
자세한 내용은 카메라 이동 문서의 API 호출로 카메라 이동하기 절을 참고하세요.
카메라 변경 이벤트
카메라 변경 이벤트를 받으려면 NMapView.setOnMapStateChangeListener()
대신 NaverMap.addOnCameraChangeListener()
를 호출해 이벤트 리스너를 등록합니다.
다음은 카메라 변경 이벤트를 받아 변경된 위치를 로깅하는 예제입니다.
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);
}
});
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);
});
자세한 내용은 카메라 이동 문서의 카메라 변경 이벤트 절을 참고하세요.
투영
화면 좌표와 지도 좌표를 상호 변환하려면 NMapProjection
대신 Projection
클래스를 사용합니다. NaverMap.getProjection()
을 호출해 인스턴스에 접근할 수 있습니다.
화면 좌표를 지도 좌표로 변환하려면 NMapProjection.fromPixels()
대신 Projection.fromScreenLocation()
을, 지도 좌표를 화면 좌표로 변환하려면 NMapProjection.toPixels()
대신 toScreenLocation()
을 호출합니다.
다음은 화면의 (100, 100)
지점을 지도 좌표로 변환하는 예제입니다.
mapView.getMapProjection().fromPixels(100, 100);
2.x
mapView.getMapProjection().fromPixels(100, 100);
3.x
LatLng coord = naverMap.getProjection().fromScreenLocation(new PointF(100, 100));
다음은 지도의 (37.5666102, 126.9783881)
지점을 화면 좌표로 변환하는 예제입니다.
Point point = new Point();
mapView.getMapProjection().toPixels(new NGeoPoint(126.9783881, 37.5666102), point);
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));
자세한 내용은 카메라와 투영 문서의 화면 좌표와 지도 좌표 간 변환 절을 참고하세요.
상호작용
컨트롤
3.x SDK에는 줌 컨트롤을 비롯한 여러 가지 컨트롤이 내장되어 있습니다. 2.x SDK에서 NMapView.setBuiltInZoomControls()
를 호출해 활성화하는 줌 컨트롤은 기본적으로 활성화되며, 비활성화하려면 UiSettings.setZoomButtonEnabled()
를 호출합니다. UiSettings
객체는 NaverMap.getUiSettings()
를 호출해 얻을 수 있습니다.
mapController.setBuiltInZoomControls(true, null);
2.x
mapController.setBuiltInZoomControls(true, null);
3.x
naverMap.getUiSettings().setZoomButtonEnabled(true);
자세한 내용은 사용자 인터페이스 문서의 컨트롤 절을 참고하세요.
UI 이벤트
지도의 클릭, 롱 클릭 이벤트를 받으려면 NMapView.setOnMapViewTouchEventListener()
대신 NaverMap.setOnMapClickListener()
및 NaverMap.setOnMapLongClickListener()
를 호출해 이벤트 리스너를 등록합니다.
다음은 지도의 클릭, 롱 클릭 이벤트를 받아 토스트로 클릭된 좌표를 출력하는 예제입니다.
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();
}
});
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());
자세한 내용은 사용자 인터페이스 문서의 UI 이벤트 절을 참고하세요.
위치
2.x SDK는 위치 추적 기능을 사용하려면 NMapLocationManager
, NMapCompassManager
, NMapMyLocationOverlay
를 생성하고 기능을 활성화하는 메서드를 각각 호출해야 했습니다.
3.x SDK에는 위치 추적 기능이 내장되어 있으므로 NaverMap.setLocationSource()
를 호출해 LocationSource
구현체를 지정하고 NaverMap.setLocationTrackingMode()
를 호출하면 위치 추적 기능이 활성화됩니다.
다음은 위치 추적 기능을 활성화하는 예제입니다.
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);
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);
자세한 내용은 위치 문서를 참고하세요.
오버레이
사용 준비
2.x SDK에서 오버레이 기능을 사용하려면 먼저 NMapViewerResourceProvider
와 NMapOverlayManager
를 생성하고, 각 오버레이에 NMapXXXdata
를 생성한 후 NMapOverlayManager.createXXX()
메서드를 호출해야 했습니다.
3.x SDK에서는 오버레이 객체 각각이 기능을 독립적으로 완결성 있게 수행하므로 이러한 준비 과정이 필요하지 않습니다. 필요한 오버레이 객체를 생성하고 속성을 객체에 직접 지정한 후 setMap()
을 호출하면 오버레이가 지도에 나타납니다.
다음은 오버레이 기능을 사용하기 위해 관련 객체를 준비하는 예제입니다.
NMapViewerResourceProvider mapViewerResourceProvider = new NMapViewerResourceProvider(context);
NMapOverlayManager overlayManager = new NMapOverlayManager(context, mapView, mapViewerResourceProvider);
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()
메서드로 Overlay.OnClickListener
를 지정합니다.
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();
}
}
});
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;
});
자세한 내용은 오버레이 공통 문서의 이벤트 절을 참고하세요.
마커
2.x SDK에서는 마커를 지도에 추가하려면 NMapPOIdata
를 생성하고 NMapOverlayManager.createPOIdataOverlay()
를 호출해야 했습니다.
3.x SDK에서는 Marker
객체를 생성하고 필요한 속성을 객체에 직접 지정한 후 setMap()
을 호출합니다.
마커 드래그 기능은 더 이상 제공되지 않습니다.
다음은 마커를 지도에 추가하는 예제입니다.
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);
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);
자세한 내용은 마커 문서를 참고하세요.
정보 창
2.x SDK에서는 마커의 제목을 지정한 경우 마커를 클릭하면 자동으로 마커 위에 정보 창이 나타났습니다. 정보 창을 별도로 생성하거나 동시에 한 개 이상 노출할 수 없었습니다.
3.x SDK에서는 정보 창도 마커처럼 독립적인 객체이므로 자유롭게 생성하고 추가할 수 있습니다. 정보 창을 지도에 추가하려면 InfoWindow
객체를 생성하고 필요한 속성을 객체에 직접 지정한 후 setMap()
을 호출합니다.
다음은 마커를 클릭하면 정보 창을 지도에 추가하는 예제입니다.
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);
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);
자세한 내용은 정보 창 문서를 참고하세요.
셰이프
2.x SDK에서는 셰이프를 지도에 추가하려면 NMapPathData
에 셰이프의 좌표를, NMapPathLineStyle
또는 NMapCircleStyle
객체를 이용해 셰이프의 스타일을 지정하고 NMapOverlayManager.createPathDataOverlay()
를 호출해야 했습니다.
3.x SDK에서는 PolylineOverlay
, PolygonOverlay
, CircleOverlay
등 유형별 셰이프 객체를 생성하고 필요한 속성을 객체에 직접 지정한 후 setMap()
을 호출합니다.
다음은 폴리라인을 지도에 추가하는 예제입니다.
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);
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);
다음은 폴리곤을 지도에 추가하는 예제입니다.
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);
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);
다음은 서클을 지도에 추가하는 예제입니다.
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);
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);
자세한 내용은 셰이프 문서를 참고하세요.
위치 오버레이
2.x SDK는 위치 오버레이와 위치 추적 기능이 분리되지 않아 NMapLocationManager
, NMapCompassManager
를 생성해야만 위치 오버레이를 생성할 수 있었습니다. 또한 오버레이의 위치 등을 임의로 지정할 수 없었습니다.
3.x SDK는 위치 오버레이가 위치 추적 기능과 독립적으로 동작하므로 NaverMap.getLocationOverlay()
를 호출해 인스턴스에 접근한 후 필요한 속성을 직접 지정할 수 있습니다.
NMapLocationManager mapLocationManager = new NMapLocationManager(context);
NMapCompassManager mapCompassManager = new NMapCompassManager(context);
NMapMyLocationOverlay myLocationOverlay = mapOverlayManager.createMyLocationOverlay(mapLocationManager, mapCompassManager);
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);
자세한 내용은 위치 오버레이 문서를 참고하세요.