한 걸음 두 걸음

android / 안드로이드 ] 네이버지도 api #02 좌표 설정하기 / naverMap 객체 본문

FrontEnd/Android

android / 안드로이드 ] 네이버지도 api #02 좌표 설정하기 / naverMap 객체

언제나 변함없이 2019. 8. 8. 13:00
반응형

결과화면

이제 본격적으로 마커도 달고 좌표도 지정하는 등의 방법으로 활용하고자 하는데,

이 떄 필요한 것이 바로 naverMap 즉 지도객체입니다.

네이버지도는

  1. 인터페이스
    로 구성되어 있는데요

뷰는 화면에 지도를 나타내는 역할을 합니다.(MapFragment, MapView)
인터페이스는 지도를 다루는(오버레이(마커 등)을 추가하고 상호작용 기능에 대한 기술) 것으로, (NaverMap)에 해당합니다.

우리는 여기서 바로 인터페이스(NaverMap)에 대해 알고 적용시켜보고자 합니다. 이는 콜백메서드를 통해서만 불러올 수 있는 객체이므로, (직접 만들 수 없습니다!) 잘 따라와주세요~

아, 혹시 에 대해서 보다 자세히 알고싶으시면 https://navermaps.github.io/android-map-sdk/guide-ko/2-1.html 튜토리얼을 참고해주시기 바랍니다.


NaverMap 객체 얻어오기

저는 xml에 MapFragment를 배치해두고 사용하고 있으므로 Activity에서 getMapAsync() 메서드로 OnMapReadyCallback을 등록하겠습니다.
공식문서에는 아래와 같이 나와있으나,

public class MapFragmentActivity extends FragmentActivity
    implements OnMapReadyCallback {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.map_fragment_activity);

        FragmentManager fm = getSupportFragmentManager();
        MapFragment mapFragment = (MapFragment).findFragmentById(R.id.map);
        if (mapFragment == null) {
            mapFragment = MapFragment.newInstance();
            fm.beginTransaction().add(R.id.map, mapFragment).commit();
        }

        mapFragment.getMapAsync(this);
    }

    @UiThread
    @Override
    public void onMapReady(@NonNull NaverMap naverMap) {
        // ...
    }
}

막상 이대로 넣어보면 MapFragment에서 에러가 납니다.

public class MainActivity extends FragmentActivity
        implements OnMapReadyCallback {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        MapFragment mapFragment = (MapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        if (mapFragment == null) {
            mapFragment = MapFragment.newInstance();
            getSupportFragmentManager().beginTransaction().add(R.id.map, mapFragment).commit();
        }

        mapFragment.getMapAsync(this);
    }

    @UiThread
    @Override
    public void onMapReady(@NonNull NaverMap naverMap) {
        // ...
    }
}

이렇게 바꿔주면 정상작동되네요ㅎㅎ
그럼 이제 onMapReady를 통해 비동기로 NaverMap 객체를 얻을 수 있습니다.
(NaverMap 객체가 준비되면 onMapReady() 콜백 메서드가 호출됩니다.)


네이버지도 목적지로 포커스 맞추기

저는 xml을 통해 객체를 생성하는 방법으로 만들고 있으므로, 프래그먼트에 다음 속성을 추가해줌으로써

app:navermap_latitude="36.763695"
app:navermap_longitude="127.281796"
app:navermap_zoom="14"

맨 처음 지도를 켰을 때 지도가 어디를 보고있는지 지정해줄 수 있습니다.
위도 경도는 구글지도에서 쉽게 얻을 수 있습니다.


네이버지도 목적지에 마커 설정하기

위에서 NaverMap객체도 얻었으니 이를 통해 좌표를 등록시켜볼까요~?
네이버지도는 위도, 경도 값을 받아 마커로 표시해줄 수 있습니다.

    @UiThread
    @Override
    public void onMapReady(@NonNull NaverMap naverMap) {
        // ...
        Marker marker = new Marker();
        marker.setPosition(new LatLng(36.763695, 127.281796));
        marker.setMap(naverMap);
    }

Activity에 작성해두었던 onMapReady에 위처럼 Marker코드를 작성해줍니다. 그러면

완성!

이보다 더 복합적으로 오버레이를 활용하고자 하신다면, 

https://navermaps.github.io/android-map-sdk/guide-ko/5-1.html를 참고해주세요!


참고) LatLng은 위도와 경도 값을 나타내는 클래스로, latitude(위도) longitude(경도) 값을 갖습니다.
(LatLng의 모든 속성은 final이므로 각 속성은 생성자로만 지정할 수 있고, 한 번 생성된 객체의 속성은 변경할 수 없습니다.)

이 외에도 영역지정을 위한 객체도 지원하는데 이에 대한 것은 문서를 참고하시고,
(*android의 GPS 센서값을 이용하는 방법으로 현재 위치의 위도 경도값을 알아낼 수 있습니다.)


출처 https://navermaps.github.io/android-map-sdk/guide-ko/2-1.html

반응형