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 객체를 통해 세부정보를 확인할 수 있습니다.

대중교통 길찾기, 어디까지 써봤니? 구글지도, 네이버지도, 다음지도

대중교통으로 매일 먼 거리를 출퇴근하는 직장인, 대학생들에게 지도 서비스는 필수입니다. 하지만 무조건 많은 정보를 제공한다고 해서 좋은 지도 서비스가 아니라, 나에게 꼭 맞는 지도 서비스를 이용하는게 중요하겠죠? 구글지도, 네이버지도 그리고 다음지도의 대중교통 길찾기 서비스를 비교해보고 어떤 지도 서비스가 나에게 적합한지 한 번 알아볼까요?

 

1. 지금 내 위치는 어디지? : 구글지도, 네이버지도

지도 페이지에 접속하면 뜨는 초기화면에서, 지도가 내 현재 위치를 파악해 표시해주면 편리하겠죠? 여의도에 위치한 우리 사무실 컴퓨터에서 지도 페이지를 열어봤더니, 구글지도와 네이버지도에서는 초기 화면에서 현재 위치를 인식해 여의도의 지도를 표시해준 반면, 다음지도는 평촌시 범계역의 지도를 보여주고 있네요.

1.초기화면모음

 

2. 오늘은 천천히 가도 좋으니 조금만 걷고 싶은데.. : 구글지도

일반적으로 길찾기 서비스는 가장 빠른 길 위주로 경로 정보를 제공합니다. 그런데 어떤 날은 다리가 아파 시간이 더 걸리더라도 도보 시간이 적은 경로를 찾고 싶을 때가 있고, 어떤 날은 짐이 많아 환승이 불편할 때도 있죠. 구글지도에서는 ‘최적 경로’ ‘최소 환승’ ‘최소 도보시간’ 등의 세 가지 옵션을 제공해, 그날 그날 처한 상황에 따라 원하는 경로를 추천받을 수 있습니다.

2.옵션설정

 

3. 교통카드 잔액이 얼마 없는데, 요금은 얼마나 들까? : 네이버지도, 다음지도

충전식 교통카드를 사용하는 직장인, 대학생들에게는 대중교통 요금 역시 중요할 때가 있죠! 네이버지도와 다음지도는 경로 별 요금 정보를 알려주고 있는데요, 구글지도에는 요금 정보가 없습니다. 해외여행할 때 구글지도에서 요긴하게 사용했던 요금 정보 서비스가 국내에서는 아직 제공되지 않고 있네요.

3.요금)네이버   3.요금)다음

 

4. 답답한 지하철보다는 밖을 볼 수 있는 버스가 좋아! : 구글지도

저는 날씨가 좋은 날에는 창 밖을 구경할 수 있는 버스를, 비가 오는 날에는 쾌적한 지하철을 타는 게 좋더라구요. 구글지도에서는 버스, 지하철, 기차 중에서 선호하는 교통수단을 선택해(복수선택 가능) 경로를 검색하면 선택한 교통수단 위주로 경로를 구성해 추천해줘서 편리하답니다.

4.선호교통수단설정

 

5. 어.. 늦었네! 이 지하철에서 가장 빨리 환승할 수 있는 칸은 어디지? : 네이버지도, 다음지도

출퇴근 시간에 지하철을 타면 가장 불편한 게 바로 환승입니다. 특히 1호선이나 2호선, 9호선 등 유동인구가 많은 호선을 이용하는 경우, 환승 통로와 가까운 칸에 탑승하는 게 환승하는 시간도 절약해주고 또 도보 거리를 줄여줘서 출퇴근길이 훨씬 편해지죠. 네이버지도와 다음지도에서는 지하철 빠른 환승칸 정보를 제공해주고 있습니다.

5.빠른환승칸)네이버   5.빠른환승칸)다음

 

6. 내일 아침 9시 미팅인데, 버스는 몇 시에 오지? : 구글지도

약속시간을 반드시 지켜야 하는 스케줄에 있어서, 경로에 소요되는 시간 뿐 아니라 실제 그 시점의 정확한 대중교통 정보가 필요할 때가 있습니다. 버스는 몇 시에 도착하는지, 지하철은 몇 시 지하철을 타면 되는지와 같은 정보 말입니다. 구글지도에서는 길찾기 서비스를 사용하는 시점의 실시간 대중교통 정보를 제공하며 출발시간과 도착시간을 각각 따로 설정할 수도 있어서 유용하답니다.

6.시간설정(1)   6.시간설정(2)

 

7. 좀 더 쉽게 길찾기를 할 순 없을까? : 구글지도, 다음지도

대중교통 길찾기 서비스를 보다 편리하게 이용하기 위해선, 서비스를 제공받기까지의 클릭 수가 적을수록 좋은데요. 구글지도와 다음지도의 경우, 3번의 클릭이 필요했습니다. 네이버지도는 5번으로, 가장 많은 클릭 수를 요하는 것으로 나타났어요.

 

자, 이렇게 원하는 서비스에 따라 적합한 대중교통 길찾기 서비스를 골라서 사용하면 시간과 노력을 아낄 수 있겠죠?  각 지도 서비스들의 장단점을 비교해보고 다들 현명한 대중교통 길찾기 하세요! :)

 

 

[Google Maps] 싱크홀 지도, 나도 만들 수 있을까?

 

unnamed

 

몇 년 전까지만 해도 낯설었던 싱크홀의 공포가 요즘에 들어 많은 사람들을 두렵게 하고 있습니다. 우리나라에서 발생하는 싱크홀은, 엄밀히 말해 ‘싱크홀’이라기 보다는, ‘도로함몰’이라고 일컫는 게 맞다고 해요. 싱크홀은 주로 석회암 지반에서 지하수 등의 침식작용으로 형성되는 큰 동공을 이르는 말로, 자연적으로 생기는 것이라고 합니다. 이에 반해 도로함몰은 굴착공사, 상하도 누수 등의 인공적인 원인으로 도로면이 취약해져 발생한다고 합니다.

최근에는 도심에서 도로침몰이 빈번하게 발생해 시민들이 다치는 사고가 이어지고 있습니다. 그래서 서울시에서는 도로함몰 정보를 한눈에 볼 수 있는 ‘도로함몰 관리 지도’를 만들어 올해 12월부터 활용하기로 했습니다. 자세한 내용은 서울시 홈페이지 해당 게시판에서 확인하실 수 있는데요. 서울시의 ‘도로함몰 관리 지도’ 제작 발표에 따라, 과거 공개되었던 ‘싱크홀 위치 지도’가 다시 관심을 끌고 있습니다. 이 지도는 구글지도에 서울 시내 210여 개 싱크홀의 위치와 규모, 발생 원인, 조치 결과, 복구담당, 발생 시기 등의 정보를 담고 있습니다.

스크린샷_2015-06-05_오후_2_16_45

그런데, 이 글을 읽고 있는 당신도 이런 지도를 만들 수 있다는 사실! 알고 계신가요? 바로 구글의 My Maps 서비스를 통해 누구나 자신만의 특별한 지도를 제작할 수 있기 때문이죠.

My Maps(내 지도)는 고객, 본사 혹은 가맹점의 위치, 영업 권역 관리에 쓰이는 기업의 데이터를 쉽고 간단하게 시각화하고 분석하기 위한 Google 지도 서비스입니다. 위치 데이터를 손쉽게 지도 위에 나타낼 수 있으며 모든 사람과 혹은 원하는 사용자와 공유할 수 있습니다. 또, 스마트폰이나 태블릿에서도 ‘Google Maps Engine’을 다운로드받음으로써 웹과 동일하게 지도를 수정하고 볼 수 있습니다.

 

<My Maps 만드는 방법>
1) 먼저 maps.google.com에 접속해 지도를 열고, 오른쪽 위 버튼으로 로그인하세요.
2) 빈 검색창을 클릭하면 My Maps(내 지도) 탭이 나타납니다.
3) My Maps(내 지도)를 클릭하고, Create(만들기) 버튼을 클릭해 새로운 지도를 생성시킵니다.
4) 그러면 아래와 같이 “제목없는 지도”가 생성됩니다. 지도에 제목과 설명을 적어주세요.

제목없는_지도

 

5) My Maps에서는 10개까지의 지도 레이어가 설정 가능합니다. 원하는 레이어를 만든 뒤, 지도에  추가하고 싶은 지점을 직접 찾거나 검색을 통해 찾아 ‘지도에 추가’ 버튼을 눌러줍니다. 해당 위치를 내 지도에 추가하고 나면 디폴트로 빨간 색 핀 포인트가 생기는데요. 이 포인트의 색깔과 모양은 마음대로 바꿀 수 있어 취향에 맞게 지도를 꾸미는 맛도 쏠쏠하답니다~!

스크린샷_2015-06-05_오후_1_44_49

 

6) CSV, XLSX 또는 KML 파일로 된 데이터도 한꺼번에 지도 위에 표시할 수 있습니다. ‘정보 가져오기’ 버튼을 누른 뒤, 해당 파일을 드래그해 가져다 놓으면 다음과 같은 화면이 뜹니다. 여기에서 “주소”에만 체크해주어야 올바른 지도가 생성된다는 점, 주의하세요! 그리고 아이콘의 제목을 어떤 열로 사용할 것인지 선택해주면 됩니다.

스크린샷_2015-06-05_오후_2_06_43

 

저는 서울시의 한 프랜차이즈 치킨집 점포들에 대한 위치 데이터로 한 번 시도해봤는데요! 다음과 같은 서울시 치킨 점포 지도가 만들어졌습니다. 각 핀 포인트 위에 마우스를 가져다 놓으면 데이터 파일 내에 담겨있던 정보들, 저 같은 경우엔 매장명, 개업일, 주소, 전화번호 등이 표시되는 걸 알 수 있습니다.

arrow_up굽네치킨_서울__xlsx

스크린샷_2015-06-05_오후_2_12_32

 

7) 이렇게 완성된 나만의 지도는 불특정 다수에 공개할 수도, 특정 사용자와만 공유할 수도 있습니다. 지도 왼편에 ‘공유’ 버튼을 누르면 다음과 같은 작은 창이 뜹니다. 다섯 가지 옵션을 통해 원하는 공개 범위를 설정할 수 있습니다.

Little_world_of_mine_3

 

누구나 간단하게 만들 수 있는 Google My Maps! 저 같은 초보자들에게는 반가운 서비스가 아닐 수 없는데요. 마침 2015년 1월부터 My Maps Pro(구: Google Maps Engine Pro)의 모든 기능들이 무료로 변경되었다고 하니까, 나만의 지도를 만들어보고 싶은 분들은 꼭 활용해보세요!


다만, 맛집 지도나 여행 코스 등과 같은 간단한 사용자 지도가 아닌, 보다 더 많은 정보를 지도에 담고 싶다면 Google Maps API를 사용하길 추천합니다.