모든 준비를 마쳤습니다!

개발을 시작하려면 개발자 문서로 이동하세요.

Google Maps Android API 활성화

개발을 시작하기 위해 Google Developers Console에서 우선적으로 해야 할 일을 몇 가지 소개하겠습니다.

  1. 프로젝트 생성 또는 선택
  2. Google Maps Android API 활성화
  3. 적합한 키 생성
계속

스트리트 뷰

Google 스트리트 뷰는 지정된 도로부터 커버리지 영역 전반에 걸쳐 360도 파노라마 뷰를 제공합니다.

이 비디오는 스트리트 뷰 서비스를 사용하여 사용자에게 지도의 주소를 실제 모습으로 보여주고, 목적지나 사용자가 관심을 가진 장소에 대한 구체적인 상황을 제공합니다.

Google Maps Android API v2를 통해 이용 가능한 커버리지는 Android 기기의 Google 지도 앱에서 이용 가능한 커버리지와 같습니다. 대화형 지도에서 지원되는 영역과 스트리트 뷰에 대한 자세한 내용은 스트리트 뷰 소개를 참조하세요.

StreetViewPanorama 클래스는 애플리케이션에서 스트리트 뷰 파노마라를 모델링합니다. UI 내에서 파노라마는 StreetViewPanoramaFragment 또는 StreetViewPanoramaView 객체로 나타납니다.

코드 샘플

Github의 ApiDemos 리포지토리에는 스트리트 뷰 사용법을 보여주는 샘플이 포함되어 있습니다.

Google Maps Android API의 스트리트 뷰 개요

Google Maps Android API는 Google 스트리트 뷰에서 사용되는 이미지를 얻고 조작하기 위한 스트리트 뷰 서비스를 제공합니다. 이미지는 파노라마로 반환됩니다.

각 스트리트 뷰 파노라마는 단일 이미지 또는 이미지 집합이며, 단일 위치에서 완전한 360도 뷰를 제공합니다. 이미지는 등장방형 도법(플라트 카레)을 따르며, 여기에는 360도 수평 뷰(완전한 래핑)와 180도 수직 뷰(위에서 수직 아래)가 포함됩니다. 그 결과 얻어지는 360도 파노라마는 이미지가 구체의 2차원 표면에 래핑된 프로젝션을 정의합니다.

StreetViewPanorama는 카메라를 중앙에 두고 파노라마를 구체로 렌더링하는 뷰어를 제공합니다. StreetViewPanoramaCamera 를 조작하여 카메라의 확대/축소와 방향(틸트 및 베어링)을 제어할 수 있습니다.

시작하기

시작 가이드에 따라 Google Maps Android API 프로젝트를 설정합니다. 이어서 아래 설명된 것처럼 스트리트 뷰 파노라마를 추가합니다.

Google Play 서비스 SDK 클라이언트 라이브러리에는 몇 가지 스트리트 뷰 샘플이 포함되어 있습니다. 이 샘플을 프로젝트로 가져와서 개발의 기초로 사용할 수 있습니다. 샘플을 가져오기 위한 지침은 소개를 참조하세요.

API 사용

아래 지침에 따라 Android 프래그먼트에 스트리트 뷰 파노라마를 추가합니다. 애플리케이션에 스트리트 뷰를 추가하는 가장 간단한 방법입니다. 그런 다음 프래그먼트, 뷰 및 파노라마 사용자 지정에 대해 자세히 읽어보세요.

스트리트 뷰 파노라마 추가

요약:

  1. 프래그먼트 객체를 스트리트 뷰 파노라마를 처리할 액티비티 에 추가합니다. 가장 쉬운 방법은 <fragment>요소를 Activity의 레이아웃 파일에 추가하는 것입니다.
  2. OnStreetViewPanoramaReadyCallback 인터페이스를 구현하고 onStreetViewPanoramaReady(StreetViewPanorama) 콜백 메서드를 사용하여 StreetViewPanorama 객체의 핸들을 가져옵니다.
  3. 프래그먼트에서 getStreetViewPanoramaAsync()를 호출하여 콜백을 등록합니다.

다음은 각 단계에 대한 자세한 설명입니다.

프래그먼트 추가

액티비티 레이아웃 파일에 <fragment> 요소를 추가하고 프래그먼트 객체를 정의합니다. 이 요소에서 class 특성을 com.google.android.gms.maps.StreetViewPanoramaFragment(또는 SupportStreetViewPanoramaFragment)로 설정합니다.

다음은 레이아웃 파일에서 프래그먼트의 예시입니다.

<fragment
    android:name="com.google.android.gms.maps.StreetViewPanoramaFragment"
    android:id="@+id/streetviewpanorama"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

스트리트 뷰 코드 추가

앱에서 스트리트 뷰 파노라마를 사용하려면 OnStreetViewPanoramaReadyCallback 인터페이스를 구현하고 StreetViewPanoramaFragment 또는 StreetViewPanoramaView객체에서 콜백의 인스턴스를 설정해야 합니다. 이 튜토리얼에서 StreetViewPanoramaFragment를 사용하는 이유는 앱에 스트리트 뷰를 추가하는 가장 간단한 방법이기 때문입니다. 첫 단계는 콜백 인터페이스를 구현하는 것입니다.

public class MainActivity extends FragmentActivity
    implements OnStreetViewPanoramaReadyCallback {
...
}

ActivityonCreate() 메서드에서 레이아웃 파일을 콘텐츠 뷰로 설정합니다. 예를 들어, 레이아웃 파일에 main.xml이란 이름이 있으면 다음 코드를 사용합니다.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ...
}

FragmentManager.findFragmentById()를 호출하고, <fragment> 요소의 리소스 ID에 전달하여 프래그먼트의 핸들을 가져옵니다. 리소스 ID R.id.streetviewpanorama는 레이아웃 파일을 빌드할 때 Android 프로젝트에 자동으로 추가됩니다.

이어서 getStreetViewPanoramaAsync() 를 사용하여 프래그먼트에서 콜백을 설정합니다.

StreetViewPanoramaFragment streetViewPanoramaFragment =
    (StreetViewPanoramaFragment) getFragmentManager()
        .findFragmentById(R.id.streetviewpanorama);
streetViewPanoramaFragment.getStreetViewPanoramaAsync(this);

참고: getStreetViewPanoramaAsync()가 메인 스레드에서 호출되어야 콜백이 메인 스레드에서 실행됩니다. Google Play 서비스가 사용자의 기기에 설치되지 않은 경우,사용자가 Play 서비스를 설치할 때까지 콜백이 실행되지 않습니다.

onStreetViewPanoramaReady(StreetViewPanorama) 콜백 메서드를 사용하여 StreetViewPanorama의 null이 아닌(사용할 준비가 된) 인스턴스를 검색합니다.

@Override
public void onStreetViewPanoramaReady(StreetViewPanorama panorama) {
    panorama.setPosition(new LatLng(-33.87365, 151.20689));
}

초기 상태 구성에 대한 추가 정보

지도와 달리 스트리트 뷰 파노라마의 초기 상태를 구성할 수 없습니다. 그러나 지정된 옵션을 포함한 StreetViewPanoramaOptions 객체에 전달하여 파노라마를 프로그래밍 방식으로 구성할 수 있습니다.

mSvpView = new StreetViewPanoramaView(this,
    new StreetViewPanoramaOptions().position(SAN_FRAN));

StreetViewPanoramaFragment에 대한 추가 정보

StreetViewPanoramaFragmentAndroid Fragment 클래스의 서브클래스로, Android 프래그먼트에 스트리트 뷰 파노라마를 배치할 수 있게 해줍니다. StreetViewPanoramaFragment 객체는 파노라마의 컨테이너 역할을 하고, StreetViewPanorama 객체에 대한 액세스를 제공합니다.

참고: Google Maps Android API가 객체를 지원하려면 API 레벨 12 이상이 필요StreetViewPanoramaFragment합니다. API 레벨 12 이전의 애플리케이션을 제작하고자 한다면,SupportStreetViewPanoramaFragment 클래스를 통해 같은 기능에 액세스할 수 있습니다. Android 지원 라이브러리도 포함해야 합니다.

참고: Google Maps Android API는 하나의 액티비티에서 여러 StreetViewPanoramaFragment 객체를 지원하지 않습니다.

StreetViewPanoramaView

StreetViewPanoramaView는 Android View 클래스의 서브클래스로, Android View에 스트리트 뷰 파노라마를 배치할 수 있게 해줍니다. View는 화면의 사각형 영역을 나타내며, Android 애플리케이션과 위젯의 기본적인 구성 블록입니다.

StreetViewPanoramaFragment와 마찬가지로 StreetViewPanoramaView는 파노라마의 컨테이너로 작동하고,StreetViewPanorama 객체를 통해 핵심 기능을 노출합니다. 이 클래스 사용자는 모든 수명 주기 메서드(예: onCreate(), onDestroy(), onResume(), onPause()))를 StreetViewPanoramaView 클래스의 해당 메서드로 전달해야 합니다.

참고: Google Maps Android API는 하나의 액티비티에서 여러 StreetViewPanoramaView 객체를 지원하지 않습니다.

사용자 제어 기능 사용자 지정

기본적으로, 스트리트 뷰 파노라마를 볼 때 사용자에게 다음 기능이 제공됩니다: 팬, 줌, 인접 파노라마로 이동. StreetViewPanorama의 메서드를 통해 사용자 제어 제스처를 활성화/비활성화할 수 있습니다. 제스처가 비활성화되어 있더라도 프로그래밍 방식으로 변경이 가능합니다.

setPanningGesturesEnabled()
사용자가 드래그로 카메라의 방향을 조절할 수 있는지 여부를 결정합니다.
      mSvp.setPanningGesturesEnabled(false);
setUserNavigationEnabled()
사용자가 다른 파노라마로 이동할 수 있는지 여부를 결정합니다. 사용자가 내비게이션 링크를 한 번 누르거나 뷰를 두 번 눌러서 새 파노라마로 이동할 수 있습니다.
      mSvp.setUserNavigationEnabled(false);
setZoomGesturesEnabled()
사용자가 손가락을 모아서 확대/축소할 수 있는지 여부를 결정합니다.
      mSvp.setZoomGesturesEnabled(false);

또한, 사용자에게 거리 이름을 표시할지 여부도 결정할 수 있습니다.

setStreetNamesEnabled()
사용자가 지상에 표시된 거리 이름을 볼 수 있는지 여부를 결정합니다.
      mSvp.setStreetNamesEnabled(false);

파노라마의 위치 설정

스트리트 뷰 파노라마의 위치를 설정하려면 StreetViewPanorama.setPosition()을 호출하여 LatLng를 전달합니다. radius를 선택적 매개변수로 전달할 수도 있습니다. 반경은 스트리트 뷰가 일치하는 파노라마를 찾을 영역을 넓히거나 좁힐 때 유용합니다. 반경이 0이라는 것은 파노라마가 지정된 LatLng와 정확히 연결되어야 한다는 뜻입니다. 기본 반경은 50입니다. 일치하는 영역에 파노라마가 하나 이상 있는 경우, API는 가장 일치하는 파노라마를 반환합니다.

private static final LatLng SAN_FRAN = new LatLng(37.765927, -122.449972);
mSvp.setPosition(SAN_FRAN);

또는, panoIdStreetViewPanorama.setPosition()에 전달하여 파노라마 ID에 기반한 위치를 설정할 수 있습니다.

인접 파노라마의 파노라마 ID를 검색하려면 먼저 getLocation() 을 사용하여 StreetViewPanoramaLocation을 검색합니다. 이 객체는 현재 파노라마의 ID와 StreetViewPanoramaLink 객체의 배열을 포함합니다. 각 객체는 현재 파노라마에 연결된 파노라마 ID를 포함합니다.

StreetViewPanoramaLocation location = mSvp.getLocation();
if (location != null && location.links != null) {
    mSvp.setPosition(location.links[0].panoId);
}

확대 및 축소

StreetViewPanoramaCamera.zoom을 설정하여 확대/축소 수준을 프로그래밍 방식으로 변경할 수 있습니다. 확대/축소를 1.0로 설정하면 이미지가 2의 배수로 확대됩니다.

다음 스니펫은 StreetViewPanoramaCamera.Builder()를 사용하여 기존 카메라의 틸트와 베어링으로 새 카메라를 구성하고 확대/축소 배율을 50% 늘립니다.

private static final float ZOOM_BY = 0.5f;
StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder()
    .zoom(mSvp.getPanoramaCamera().zoom + ZOOM_BY)
    .tilt(mSvp.getPanoramaCamera().tilt)
    .bearing(mSvp.getPanoramaCamera().bearing)
    .build();

카메라 방향(시점) 설정

StreetViewPanoramaCamera에서 베어링과 틸트를 설정하여 스트리트 뷰 카메라의 방향을 결정할 수 있습니다.

베어링
카메라가 가리키는 방향으로, 카메라 중심 주위에 정북에서 시계방향으로 도 단위로 지정됩니다. 정북쪽은 0, 동쪽은 90, 남쪽은 180, 서쪽은 270입니다.
틸트
Y축이 위나 아래로 기울어집니다. 범위는 -90~0, 0~90입니다. 90은 카메라가 똑바로 아래를 향하고, 0은 수평이고, -90은 똑바로 위를 향합니다. 편차는 카메라의 최초 기본 피치에서부터 측정되고, (항상 그렇지는 않지만) 대개 평평한 수평입니다. 예를 들어, 언덕에서 촬영한 이미지는 기본 피치가 수평이 아닐 것입니다.

다음 스니펫은 StreetViewPanoramaCamera.Builder()를 사용하여 기존 카메라의 확대/축소와 틸트로 새 카메라를 구성하고 베어링을 왼쪽으로 30도 변경합니다.

private static final int PAN_BY = 30;
StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder()
    .zoom(mSvp.getPanoramaCamera().zoom)
    .tilt(mSvp.getPanoramaCamera().tilt)
    .bearing(mSvp.getPanoramaCamera().bearing - PAN_BY)
    .build();

다음 스니펫은 카메라를 위쪽으로 30도 틸트합니다.

float tilt = mSvp.getPanoramaCamera().tilt + 30;
tilt = (tilt > 90) ? 90 : tilt;

StreetViewPanoramaCamera previous = mSvp.getPanoramaCamera();

StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder(previous)
    .tilt(tilt)
    .build();

카메라 이동 애니메이트

카메라 이동을 애니메니트하려면 StreetViewPanorama.animateTo()를 호출합니다. 애니메이션은 현재 카메라 특성과 새 카메라 특성 사이에 보간됩니다. 애니메이션 없이 바로 카메라로 점프하려면 기간을 0으로 설정하면 됩니다.

// Set the tilt to zero, keeping the zoom and bearing at current values.
// Animate over a duration of 500 milliseconds.
long duration = 500;
float tilt = 0;
StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder()
    .zoom(mSvp.getPanoramaCamera().zoom)
    .bearing(mSvp.getPanoramaCamera().bearing)
    .tilt(tilt)
    .build();

mSvp.animateTo(camera, duration);

다음에 대한 의견 보내기...

Google Maps Android API
Google Maps Android API
도움이 필요하시나요? 지원 페이지를 방문하세요.