이 문서에서는 클라이언트 측 지오펜싱의 정의, 사용 시기, 모바일 애플리케이션의 사용 사례에 적용하는 방법을 설명합니다. Google Navigation SDK를 사용하여 Android에서 예를 구현하는 방법도 보여줍니다.

기업에서는 휴대기기가 특정 영역에 진입하거나 영역을 벗어나는 시점을 알아야 하는 경우가 많습니다. 이는 가상 지리적 경계 또는 지오펜스를 유지하여 소프트웨어가 기기가 경계를 넘을 때 이벤트를 트리거할 수 있도록 함으로써 달성됩니다.
특정 차량이 경계를 통과하는 시점을 파악하는 것은 다음과 같은 여러 사용 사례에서 중요합니다.
- 고객 참여: 기업은 지오펜싱을 사용하여 특별 혜택, 이벤트 또는 신제품에 관한 푸시 알림을 최종 사용자에게 보낼 수 있습니다.
- 보안 및 안전: 기업은 지오펜싱을 사용하여 데이터 센터나 창고와 같은 민감한 영역 주변에 가상 경계를 만들고 누군가 해당 영역에 들어가거나 나갈 경우 보안 담당자에게 알릴 수 있습니다.
- 교통: 비즈니스에서 지오펜싱을 사용하여 차량의 위치를 추적하고 경로와 일정을 최적화할 수 있습니다.
따라서 클라이언트 대상 앱 내에서 이러한 영역 (다각형)을 표현하는 방법을 알아야 합니다. 이 앱은 기기 위치를 추적하고 특정 지오펜스를 위반했는지 확인해야 합니다.
범위
이 문서에서는 지오펜싱의 클라이언트 측 구현에 대해 중점적으로 설명합니다 . 즉, 클라이언트 앱에는 다음이 있어야 합니다.
- 침해 여부를 확인할 다각형
- 사용자의 실시간 위치
- 현재 위치가 다각형 내부에 있는지 외부에 있는지 확인하는 로직
이 가이드에는 Android의 예가 포함되어 있지만 iOS에서도 이와 동일한 방식으로 이를 달성할 수 있습니다. Android 위치 서비스에는 원형 지오펜스용 구현이 내장되어 있으며 여기에서 확인할 수 있습니다. 아래의 참조 코드와 설명은 더 복잡한 구현을 위한 시작점입니다.
Navigation SDK
Navigation SDK는 운전자 앱에 추가되는 네이티브 Android / iOS 라이브러리입니다. 다음을 담당합니다.
- 이를 실행하는 앱에서 도로에 스냅된 위치를 가져옵니다. Google의 도로 네트워크를 사용하여 위치를 가장 가까운 도로 구간에 스냅하므로 Android의 FusedLocationProvider (FLP)보다 정확하며 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
}
위치 업데이트 수신 대기
지오펜스를 정의한 후에는 Navigation SDK에서 RoadSnappedLocationProvider
라는 앞서 언급한 이벤트를 구독하는 위치 업데이트 리스너를 생성하기만 하면 됩니다. 이 리스너는 기기의 최신 위치를 반환합니다.
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는 여정 중에 발생하는 여러 중요한 순간을 감지할 수 있는 유용한 이벤트 리스너를 제공합니다. 기업에서는 특정 사용 사례에 맞게 맞춤 지오펜스를 요구하는 경우가 많습니다. 이 문서에서는 이를 달성하는 방법을 보여주었지만 가능성은 무궁무진합니다. 여러분의 멋진 아이디어가 기대됩니다.
다음 작업
추천 추가 자료: