이 문서에서는 클라이언트 측 지오펜싱의 정의, 사용 시기, 모바일 애플리케이션의 사용 사례에 이를 적용하는 방법을 설명합니다. 또한 Google Navigation SDK를 사용하여 Android에서 예시를 구현하는 방법도 보여줍니다.
회사는 휴대기기가 특정 지역을 진입하거나 이탈할 때 이를 알아야 하는 경우가 많습니다. 이는 가상 지리적 경계 또는 지오펜스를 유지하여 기기가 경계를 넘을 때 소프트웨어가 이벤트를 트리거하도록 합니다.
특정 차량이 경계를 통과하는 시점을 파악하는 것은 다음과 같은 여러 사용 사례에서 중요합니다.
- 고객 참여도: 비즈니스는 지오펜싱을 사용하여 특별 이벤트, 이벤트 또는 신제품에 대한 푸시 알림을 최종 사용자에게 보낼 수 있습니다.
- 보안 및 안전: 비즈니스는 지오펜싱을 사용하여 데이터 센터나 창고와 같은 민감한 지역 주변에 가상 경계를 설정하고 누군가 해당 지역을 출입하면 보안 요원에게 알릴 수 있습니다.
- 교통: 비즈니스에서 지오펜싱을 사용하여 차량의 위치를 추적하고 경로 및 일정을 최적화할 수 있습니다.
따라서 클라이언트용 앱 내에서 이러한 영역(다각형)을 나타내는 방법을 알아야 합니다. 이 앱은 기기 위치를 추적하고 특정 지오펜스를 침범했는지 확인해야 합니다.
범위
이 문서에서는 지오펜싱의 클라이언트 측 구현에 중점을 둡니다. 즉, 클라이언트 앱에는 다음이 있어야 합니다.
- 침해 여부를 확인해야 하는 다각형
- 사용자의 실시간 위치
- 현재 위치가 다각형 내부 또는 외부에 있는지 확인하는 로직입니다.
이 가이드에는 Android의 예가 포함되어 있지만 iOS에서도 이와 동일한 방법을 사용할 수 있습니다. Android 위치 서비스에는 원형 지오펜스에 관한 기본 구현이 있으며 여기에서 확인할 수 있습니다. 아래의 참조 코드와 설명을 통해 더 복잡한 구현을 시작할 수 있습니다.
Navigation SDK
Navigation SDK는 드라이버 앱에 추가된 네이티브 Android / iOS 라이브러리입니다. 다음과 같은 책임이 있습니다.
- 앱을 실행하는 앱에서 도로 스냅 위치를 가져옵니다. 이는 Android의 FusedLocationProvider (FLP)보다 더 정확합니다. Google의 도로망을 사용하여 위치를 가장 가까운 도로 구간에 맞추어 도착예정시간을 훨씬 더 정확하게 만들고 FLP의 기타 정보를 제공하기 때문입니다.
- 실시간 교통정보 및 기타 경로 제한을 고려하여 운전자가 A 지점에서 B 지점으로 효율적으로 이동할 수 있는 세부 경로 안내 환경입니다.
- 이벤트 리스너 및 등록된 콜백을 통해 이벤트 실행
리스너
Navigation SDK에는 사용할 수 있는 여러 리스너가 있습니다. 다음과 같습니다...
- RoadSnappedLocation 제공자를 통한 위치 변경
- ReroutingListener를 통해 경로 변경 이벤트(사용자가 유턴, 좌회전 등을 놓치고 권장 경로에서 벗어남)
- ArrivalListener를 통해 도착 이벤트 (사용자가 계획된 목적지에 도착)입니다.
- RemainingTimeOrDistanceChangedListener를 통해 사용할 수 있는 남은 거리 및 도착예정시간 이벤트 (운전자가 목적지에 도착하려고 할 때 알림 받기 - 미터기 기준, 운전자가 목적지에 도착하기 직전에 알림을 받음 - 시간 기준)
이 가이드에서는 RoadSnappedLocationProvider와 그 LocationListener만 사용됩니다.
클라이언트 측 지오펜싱 솔루션
이제 클라이언트 측 지오펜싱 기능을 빌드해 보겠습니다. 아래 예에서는 세부 경로 모드에서 작동하는 Navigation SDK와 경로에 정의된 다각형이 지오펜스를 나타냅니다.
- 지오펜싱은 BigQuery에 저장되고 백엔드에서 가져옵니다.
- 백엔드는 주기적으로 드라이브 앱에 지오펜스를 푸시합니다.
- 운전자가 이동하고 운전자 앱이 정기적으로 지오펜스에서 트리거를 확인합니다.
- 운전자 앱은 백엔드가 작업을 실행할 수 있도록 트리거 이벤트를 백엔드에 알립니다.
차량이 경로를 따라 이동할 때 앱은 다각형이 위반되었는지 정기적으로 확인합니다. 앱에서 지오펜싱을 넘은 것을 감지하면 UI에 지오펜싱 위반됨이라는 메시지가 표시됩니다.
Android-Maps-Utils의 종속 항목 구성
이 솔루션은 Google Maps Android API를 사용하는 다양한 애플리케이션에 유용한 유틸리티가 포함된 오픈소스 라이브러리인 Android-Maps-Utils를 사용합니다.
이 라이브러리는 공개 상태이며 GitHub에 호스팅되어 있으며 다음 주소에서 액세스할 수 있습니다.
- Android: https://github.com/googlemaps/android-maps-utils
- iOS: https://github.com/googlemaps/google-maps-ios-utils
이 라이브러리를 Android 앱 (이 문서에서 다루는 범위)에 포함하려면 build.gradle 파일을 수정하여 이 라이브러리를 포함해야 합니다. 이 build.gradle 파일은 프로젝트 수준이 아니라 빌드 중인 모듈 (앱)을 위한 것입니다.
dependencies {
...
// Utilities for Maps SDK for Android (requires Google Play Services)
implementation 'com.google.maps.android:android-maps-utils:2.3.0'
}
그런 다음 Gradle을 최신 build.gradle 파일과 동기화한 후 Java 파일에서 com.google.maps.android.PolyUtil을 가져올 수 있습니다.
import com.google.android.gms.maps.model.PolygonOptions;
import com.google.maps.android.PolyUtil;
지오펜스 정의
여기서 PolygonOptions
도 가져오고 있습니다. 그 이유는 이것이 다각형을 나타내는 데 사용되기 때문입니다.
mPolygonOptions = new PolygonOptions()
.add(new LatLng(29.4264525,-98.4948758))
.add(new LatLng(29.4267029,-98.4948758))
.add(new LatLng(29.4273742,-98.4945822))
.add(new LatLng(29.4264562,-98.4943592))
.fillColor(0x0000ff36)
.strokePattern(Arrays.asList(new Dash(45.0f), new Gap(10.0f)))
.strokeColor(Color.BLUE)
.strokeWidth(5);
위에서 볼 수 있듯이 사전 설정된 좌표(위도, 경도) 쌍으로 고정된 다각형을 정의합니다. 하지만 실제 시나리오에서는 이러한 좌표와 다각형 정의가 대부분 백엔드 엔드포인트에서 가져오며 원격으로 가져올 가능성이 높습니다. 즉, 앱이 즉석에서 다각형을 만들어야 합니다.
PolygonOptions
에 지정할 수 있는 항목에 관한 자세한 내용은 여기를 확인하세요.
프래그먼트 또는 활동을 만들 때 다각형을 정의해야 합니다. 예를 들면 다음과 같습니다.
protected void onCreate(Bundle savedInstanceState) {
...
mPolygonOptions = new PolygonOptions()
.add(new LatLng(29.4264525,-98.4948758))
.add(new LatLng(29.4267029,-98.4948758))
.add(new LatLng(29.4273742,-98.4945822))
.add(new LatLng(29.4264562,-98.4943592))
.fillColor(0x0000ff36)
.strokePattern(Arrays.asList(new Dash(45.0f), new Gap(10.0f)))
.strokeColor(Color.BLUE)
.strokeWidth(5);
...// more code here
}
위치 업데이트 수신 대기
지오펜싱을 정의한 후에는 기기의 최신 위치를 반환하는 RoadSnappedLocationProvider
라는 앞서 언급한 Navigation SDK의 이벤트를 구독하는 위치 업데이트 리스너를 만들기만 하면 됩니다.
mLocListener = new RoadSnappedLocationProvider.LocationListener() {
@Override
public void onLocationChanged(Location snapped) {
LatLng snappedL = new LatLng(snapped.getLatitude(), snapped.getLongitude());
if(PolyUtil.containsLocation(snappedL, mPolygonOptions.getPoints(), true) && !mGeofenceBreached){
Log.d("Geofence", "Vehicle has breached the polygon");
}
}
@Override
public void onRawLocationUpdate(Location location) {
}
};
Android-Maps-Utils를 사용하면 PolyUtil.containsLocation
를 사용하여 수신된 위치가 사전 정의된 다각형 내에 있는지 확인할 수 있습니다. 아래 예에서는 지오펜싱을 나타내는 사전 정의된 다각형이 사용되지만 실제로는 다각형이 여러 개 있을 수 있으며 루프가 필요합니다.
다른 접근 방식
이 문서에서는 맞춤 지오펜스(다각형) 침입을 확인하는 고객용 애플리케이션에 중점을 둡니다. 하지만 백엔드에서 이러한 검사를 수행할 수 있는 시나리오가 있습니다.
즉, 앱이 백엔드에 위치 업데이트를 보고하고 이 백엔드는 차량이 특정 다각형을 위반했는지 확인하므로 클라이언트 앱에 의존하지 않고 검증을 수행합니다.
가능한 해결책은 다음과 같습니다.
[실행 환경] 서버 측 지오펜싱 아키텍처
지역 경계에 대한 서버 측 접근 방식을 보여주는 아키텍처 예시
- Driver SDK를 사용하는 운전자 앱은 Fleet Engine에 위치 업데이트를 전송합니다. 위치 업데이트 및 인앱 탐색은 Navigation SDK를 통해 이루어집니다.
- Fleet Engine은 이러한 업데이트를 Cloud Logging 또는 Pub/Sub로 출력합니다.
- 백엔드에서 이러한 위치 신호를 수집합니다.
- 지오펜스는 백엔드에서 분석할 수 있도록 BigQuery에 저장됩니다.
- 지오펜싱이 트리거되면 운전자 앱에 알림이 전송됩니다.
이 아키텍처에서는 Driver SDK와 Fleet Engine이 사용됩니다. Fleet Engine은 PubSub 업데이트를 내보내고 Cloud Logging에 로그 항목을 생성할 수 있습니다. 두 경우 모두 차량 위치를 가져올 수 있습니다.
그러면 백엔드에서 PubSub 대기열을 모니터링하거나 로그를 읽고 차량 업데이트를 확인할 수 있습니다. 그런 다음 업데이트가 발생할 때마다(또는 심각도에 따라 몇 초 또는 몇 분마다) 백엔드에서 BigQuery GIS 함수를 호출하여 특정 차량이 지오펜스 내에 있는지 또는 외부에 있는지 확인할 수 있습니다. 하나 이상의 지오펜스가 침범된 경우 백엔드가 작동하여 내부 파이프라인 또는 기타 관련 워크플로를 트리거할 수 있습니다.
결론
지오펜싱은 다양한 목적으로 사용할 수 있는 강력한 도구입니다. 비즈니스는 지오펜싱을 사용하여 관련성 높은 광고 및 프로모션으로 최종 사용자를 타겟팅하고, 위치 기반 서비스를 제공하고, 보안 및 안전을 개선할 수 있습니다.
Navigation SDK는 이동 중에 여러 중요한 순간을 감지할 수 있는 유용한 이벤트 리스너를 제공합니다. 기업에서는 특정 사용 사례에 맞게 맞춤 지오펜스가 필요한 경우가 많습니다. 이 문서에서는 이를 달성하는 방법을 보여주었지만 가능성은 무궁무진합니다. 어떤 프로젝트를 제출하실지 기대됩니다.
다음 작업
- Google Maps Platform으로 할 수 있는 작업 살펴보기, 학습하기, 아이디어 얻기 웹 세미나를 시청하세요.
추천 추가 자료: