Google Play 서비스의 Place API를 이용한 지역정보 검색

  일반적으로 사람들이 자신의 주변의 위치정보를 생각할 때 자기 주위에 식당, 상점등과 같이 지리학적 좌표 정보보다는 텍스트 또는 문맥기반으로 장소에 대하여 검색하고 확인하기를 원합니다. Google Places ServicesGoogle의 Database를 통해 넓은 범위에 카테고리와 함께 약 1억개의 장소의 상세정보를 이용하여 사용자가 원하는 정보를 텍스트 또는 문맥기반으로 제공하는 위치기반 서비스입니다.

 

  기존의 Web Service와 javascript API환경에서 제공되다가, 2015년 3월부터 Google Play Service를 통해 Android와 iOS기반의 Native 환경에서 쉽고 편리하게 사용될 수 있도록 추가 되었습니다. 이번 블로그에서는 쉽고 편리하게 추가된 Android기반의 Google Places APIs에 대하여 간단히 소개하도록 하겠습니다.

1. Google Play 서비스

  Google Play 서비스는 Maps, Location, Google+와 같은 Google의 최신의 서비스들을 손쉽게 사용할 수 있도록 제공하는 서비스로서 Google Play 서비스는 Google Play services client library와 Google Play services APK를 통해 작동됩니다.

  Google Play services client library는 Google 서비스에 대한 인터페이스를 포함하고 있으며 서비스에 대한 접근권한을 확인합니다. Google Play services APK는 각 Google 서비스를 포함하고 있으며 Android OS의 background Service로서 각 Google 서비스들을 실행합니다. 그리고 구글 플레이 스토어를 통한 자동 플랫폼 업데이트를 지원하기 때문에 OS버전이나 통신사 버전에 따른 Device 지원에 대한 걱정없이 Google에서 제공하는 최신의 기능을 쉽고 빠르게 사용할 수 있습니다.

  Google Play 서비스 설정 방법은 “Google Play 서비스의 Fused Location Provider를 이용한 현재위치 측위블로그에서 3. Fused Location Provider를 이용한 위치 측위를 참고하시기 바랍니다.

2. Places APIs in Android

  Android기반의 Places API를 사용하면 장비 근처의 지역 사업체와 장소에 응답하는 위치인식 앱을 개발할 수 있습니다. 사용자가 어디에 있고 주변에 무엇이 있는지 탐색할 수 있도록 지원하고, 특정 의미를 지닌 장소를 기반으로 하는 앱을 구축할 수 있습니다. Android기반의 Places API는 PlacePicker UI 위젯, GeoDataApi, PlaceDetectionsAPI로 구분되고 Google Play Service에서 지원되는 모든 Android 버전에서 사용할 수 있습니다.  

  Google Play 서비스에서 GeoDataApi, PlaceDetectionsAPI를 사용하기 위해서는 GoogleApiClient와 아래와 같이 API 사용요청을 하면 됩니다. 설정은 아래와 같습니다.

private GoogleApiClient.Builder setGoogleServiceBuilder(){

GoogleApiClient.Builder mGoogleApiClientBuilder = new GoogleApiClient.Builder(this.activity);

//Places 서비스에 사용될 API 사용요청

mGoogleApiClientBuilder.addApi(Places.GEO_DATA_API);

mGoogleApiClientBuilder.addApi(Places.PLACE_DETECTION_API);

//Fused Location Provider 서비스에 사용될 API 사용요청

mGoogleApiClientBuilder.addApi(LocationServices.API);

                

CallbackConnectedGoogleService callbackConnectedGoogleService = new               

CallbackConnectedGoogleService(this);

mGoogleApiClientBuilder.addConnectionCallbacks(callbackConnectedGoogleService);

mGoogleApiClientBuilder.addOnConnectionFailedListener(callbackConnectedGoogleService);

GoogleApiClient mGoogleApiClient = mGoogleApiClientBuilder.build();

mGoogleApiClient.connect();

return mGoogleApiClientBuilder;

}

3. PlacePicker  UI 위젯

  PlacePicker  UI 위젯은  지리적 주소와 현지 사업체에 해당하는 장소를 포함한 대화형 지도와 주변 장소목록을 표시하는 UI 대화상자를 제공하는 서비스입니다.  지도와 해당 서비스의 필요한 옵션이 기본적으로 제공되기 때문에 개발시간을 줄일 수 있고, UI 대화상자를 제공하기 때문에 Places 서비스를 제공하는 다양한 앱들이  PlacePicker  UI 위젯를 사용하므로 다양한 앱들에서 사용자 경험의 일관성을 유지할 수 있습니다.

int PLACE_PICKER_REQUEST = 1;

PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder();

builder.setLatLngBounds(latLngBounds); // 검색  Bounds 설정

Context context = getApplicationContext();

startActivityForResult(builder.build(context), PLACE_PICKER_REQUEST);

  PlacePicker UI 위젯은 PlacePicker를 통해 제공되며 IntentBuilder()를 사용하여 PlacePicker UI 위젯 Activity에 대한 Intent Builder을 생성합니다. 생성된 builder의 setLatlngBounds() 함수를 이용하여 주변 검색 Bounds 정보를 설정할 수 있습니다. startActivityForResult()를 통해 PlacePicker UI 위젯 Activity를 전환할 수 있다.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (requestCode == PLACE_PICKER_REQUEST) {

if (resultCode == RESULT_OK) {

Place place = PlacePicker.getPlace(data, this);

String toastMsg = String.format(Place: %s“, place.getName());

Toast.makeText(this, toastMsg, Toast.LENGTH_LONG).show();

}

}

}

그리고  PlacePicker UI 위젯을 호출할 때 startActivityForResult()로 Activity를 호출하였기 때문에 onActivityResult()를 통해 PlacePicker UI 위젯에 대하여 Place에 대한 결과 정보를 받을 수 있습니다.

4. PlaceDetectionsAPI를 이용한 Current Place  검색

  지난 블로그에서 Fused Location Provider API가 가장 최근의 Android Device의 위치정보를 위도, 경도와 같은 지리적 좌표로 검색하였다면 PlaceDetectionsAPI는 가장 최근에 Android Device가 있었던 Place의 정보를 얻을 수 있습니다.  PlaceDetectionApi는 Android 장비의 현재 장소에 대한 빠른 엑세스를 제공하고, 특정 장소에서 Android 장비를 위치를 보고하는 기회를 제공합니다.

PendingResult<PlaceLikelihoodBuffer> result =

Places.PlaceDetectionApi .getCurrentPlace(mGoogleApiClient, null);

result.setResultCallback(new ResultCallback<PlaceLikelihoodBuffer>() {

@Override

public void onResult(PlaceLikelihoodBuffer likelyPlaces) {

for (PlaceLikelihood placeLikelihood : likelyPlaces) {

Log.i(TAG, String.format(“Place ‘%s’ has likelihood: %g”,

placeLikelihood.getPlace().getName(),

placeLikelihood.getLikelihood()));

}

likelyPlaces.release();

}

});

  PlaceDetectionApi의 getCurrentPlace()를 통해 제공되며 호출할 때 PlaceFilter를 통해 하나 이상의 장소로 결과를 제한하거나 현재 영업중인 장소만을 선택할 수 있습니다. PlaceDetectionApi의 getCurrentPlace() 호출 후 결과는 PendingResult에서 PlaceLikelihhod를 포함하는 PlaceLikelihoodBuffer를 반환됩니다. PlaceLikelihhod에서 getPlace()를 호출하여 Place 정보를 검색하고 getLikelihood()를 통해 해당 장소가 가장 일치할 가능성이 높은 Place를 선별할 수 있습니다.

5. GeoDataApi

  Places API에서 GeoDataApi를 이용하여 Google Database에 대한 접근할 수 있으며  자동완성, Place 추가, Place 상세점보 검색의 기능을 제공합니다.

6. GeoDataApi의 자동완성

  자동완성은 텍스트 기반 위치 검색 퀴리에 대한 응답으로 장소 예측정보를 반환하는 기능입니다. 검색할 문자열과 필터정보를 설정하여 요청하면 사업체, 주소 및 관심 지점과 같은 Place를 사용자 유형에 따라 반환사는 방식으로 작동됩니다.

PendingResult result = Places.GeoDataApi.getAutocompletePredictions(

mGoogleApiClient, query, mBounds, mAutocompleteFilter);

  자동완성은 GeoDataApi의 getAutocompletePrediction()를 통해 제공되며 검색할 문자열 쿼리와 검색할 지역의 영역을 설정하여 호출하면 PendingResult에서AutocompletePrediction을 포함하는 AutocompletePredictionBuffer를 반환합니다. AutocompletePrediction를 통해 예측된 정보를 확인할 수 있습니다.

– 자동완성을 이용한 주변 Place 검색

image02

7. GeoDataApi의 Place 추가

  Places 추가는 사용자가 직접 Place에 대한 정보를 Place에 대한 Google Database에 추가할 수 있습니다. 새로 추가된 장소는 중재 큐에 추가되며 중재 절차에 승인을 통해 통과하게 되면 Google Database 및 Google 지도에 추가됩니다. 중재 정차에 승인되지 않은 정보는 자신의 앱 이외의 다른 앱들에서는 검색되지 않습니다. 중재 절차 승인에 통과 가능성을 높이기 위해서는 가능한 많은 정보를 포함해야 하며 특히, 주소, 전화번호 및 웹사이트가 가장 중요합니다.

AddPlaceRequest place = new AddPlaceRequest(

        “Manly Sea Life Sanctuary”, // Name

        new LatLng(-33.7991, 151.2813), // Latitude and longitude

        “W Esplanade, Manly NSW 2095”, // Address

        Collections.singletonList(Place.TYPE_AQUARIUM), // Place types

        “+61 1800 199 742”, // Phone number

        Uri.parse(“http://www.manlysealifesanctuary.com.au/”) // Website

    );

Places.GeoDataApi.addPlace(mGoogleApiClient, place)

    .setResultCallback(new ResultCallback<PlaceBuffer>() {

        @Override

        public void onResult(PlaceBuffer places) {

            Log.i(TAG, “Place add result: ” + places.getStatus().toString());

            Log.i(TAG, “Added place: ” + places.get(0).getName().toString());

            places.release();

        }

    });

  Place 추가는 GeoDataApi의 addPlace()를 통해 제공되며 호출할 때 추가할 Place에 대한 정보를 AddPlaceRequest에 설정할 수 있으며 처리 후 PendingResult에서 PlaceBuffer로 반환됩니다. 추가된 Place 정보는 고유한 Place ID를 가지며, 이 시점부터 앱에서 Place 세부정보를 검색하는데 사용할 수 있습니다. 추가된 Place는 PlacePicker와 Current Position에서도 사용할 수 있습니다.

– Place 추가 : 추가할 위치 검색

image01

– Place 추가 : Place  추가 후 검색

image00

8. Places ID와 Places 상세정보 검색

  지금까지 위에서 살펴본 Current Position, 자동완성, Place 추가에서 제공되는 Place 정보에는 모두 Place ID를 제공하고 있으며,  Place 객체의 getId()를 이용하여 해당 정보를 확인할 수 있습니다. 이 정보를 이용하여 Place에 대한 이름 및 주소, 위도/경도 좌표로 지정된 지리적 위치, Place 유형 등을 포함한 풍부한 정보를 검색할 수 있습니다.

  Place ID에 하나의 Place만 참조할 수 있지만 예외적으로 2개 이상의 Place ID를 가질 수 있습니다. 가장 일반적인 경우는 애플리케이션에서 최초로 범위가 지정된 Place를 추가한 다음 Google의 범위를 수신하는 경우입니다. 그리고 사업체를 새 위치로 이전하는 경우와 같이 Place가 새로운 Place ID를 얻을 수 있는 경우도 있습니다. 그러므로 Place ID를 지정하여 Place를 요청하는 경우, 응답에서 항상 동일한 Place를 수신할 수 는 있지만 있지만 응답이 요청한 것과 다른 Place ID를 포함할 수도 있습니다.

Places.GeoDataApi.getPlaceById(mGoogleApiClient, placeId)

    .setResultCallback(new ResultCallback<PlaceBuffer>() {

  @Override

  public void onResult(PlaceBuffer places) {

    if (places.getStatus().isSuccess()) {

      final Place myPlace = places.get(0);

      Log.i(TAG, “Place found: “ + myPlace.getName());

    }

    places.release();

  }

});

Place에 대한 세부정보 검색은 GeoDataApi의 getPlaceById()를 통해 제공되며 호출할 때 Place ID를 설정하면 처리 후 PendingResult에서 Placebuffer를 반환됩니다. Placebuffer를 통해 반환된 Place 목록 중 Place ID와 일치하는 Place 객체를 통해 세부정보를 확인할 수 있습니다.