Nav SDK ile mobil öğeleri izlemek için istemci tarafı coğrafi sınırları belirleme

Bu dokümanda, istemci tarafı coğrafi sınır belirlemenin ne olduğu, ne zaman kullanılacağı ve mobil uygulamadaki kullanım alanlarına nasıl uygulanacağı açıklanmaktadır. Ayrıca, Google Gezinme SDK'sı kullanılarak Android'de bir örneğin nasıl uygulanacağı gösterilmektedir.

Geofence algılama özellikli Nav SDK'sı
Coğrafi sınır algılama özellikli Nav SDK'sı

Şirketlerin genellikle bir mobil cihaz belirli bir alana girdiğinde veya oradan ayrıldığında bunu bilmesi gerekir. Bu işlem, sanal coğrafi sınırlar veya coğrafi sınırlar korunarak elde edilir ve yazılım, bir cihaz sınırı aştığında etkinlikleri tetiklemez.

Belirli bir aracın bir sınırdan ne zaman geçtiğini anlamak, aşağıdakiler gibi birden fazla kullanım alanı için önemlidir:

  • Müşteri etkileşimi: İşletmeler, son kullanıcılara özel teklifler, etkinlikler veya yeni ürünler hakkında push bildirimleri göndermek için coğrafi sınır belirlemeyi kullanabilir.
  • Güvenlik ve emniyet: İşletmeler, coğrafi sınır belirlemeyi kullanarak veri merkezleri veya depolar gibi hassas alanların etrafında sanal çevreler oluşturabilir ve birileri alana girerse veya oradan ayrıldığında güvenlik personelini uyarabilir.
  • Ulaşım: İşletmeler, taşıtların konumunu izlemek ve rotalar ile programlarını optimize etmek için coğrafi sınır çizmeyi kullanabilir.

Dolayısıyla, istemciye yönelik bir uygulamada bu bölgelerin (poligonlar) nasıl gösterileceğini bilmeniz önemlidir. Bu uygulama, cihaz konumunu izlemeli ve belirli coğrafi sınırları ihlal edip etmediğini kontrol etmelidir.

Kapsam

Bu belgede, coğrafi sınır çizmenin istemci tarafında uygulanmasına odaklanılmaktadır . Bu, istemci uygulamasında şunların bulunması gerektiği anlamına gelir:

  1. Güvenlik ihlali olup olmadığını kontrol etmesi gereken poligonlar;
  2. Kullanıcının gerçek zamanlı konumu
  3. Geçerli konumun poligonlardan herhangi birinin içinde mi yoksa dışında mı olduğunu kontrol etmek için mantıksal mantığa sahiptir.

Bu kılavuz, Android'de örnekler içerir, ancak iOS'te bunu yapmanın eşdeğer yolları vardır. Android Konum Hizmeti, dairesel coğrafi çitler için yerleşik bir uygulamaya sahiptir. Bu uygulamayı buradan inceleyebilirsiniz. Aşağıdaki referans kodu ve açıklama, daha karmaşık uygulamalar için başlangıç noktasıdır.

Gezinme SDK'sı, sürücü uygulamasına eklenen yerel bir Android / iOS kitaplığıdır. Şunlardan sorumludur:

  • Uygulamayı çalıştıran uygulamadan yolun tutturulan konumları elde etme. Bu, Android'in FusedLocationProvider (FLP) aracından daha kesindir. Bunun nedeni, Google'ın yol ağını kullanarak konumları en yakın yol segmentine tutturmanın, TVS'nin çok daha doğru olmasını ve FLP'den alınan diğer bilgilerin artmasını sağlamaktır.
  • Sürücülerin gerçek zamanlı trafiği ve diğer rota kısıtlamalarını dikkate alarak A noktasından B noktasına verimli bir şekilde ulaşmasına olanak tanıyan adım adım deneyim.
  • Etkinlik işleyiciler ve kayıtlı geri aramalar aracılığıyla etkinlikleri tetikleme.

Dinleyiciler

Gezinme SDK'sında kullanabileceğiniz birçok dinleyici bulunur. Birkaç örnek vermek gerekirse:

  • RoadSnappedLocation sağlayıcısı aracılığıyla konum değişiklikleri
  • Etkinlikleri (kullanıcı u dönüşünü kaçırdığında, sola döndüğünde vb. ve önerilen rotadan saptığında) ReroutingListener üzerinden yeniden yönlendirin.
  • ArrivalListener üzerinden gelen varış etkinlikleri (kullanıcı planlanan hedefe ulaşır).
  • Kalan mesafe ve TVS etkinlikleri (sürücü, hedefe varmak üzere olduğu zaman (sürücü sayacına göre, hedefe varmak üzere olduğunda bildirim alın) bildirim alın; bunların her ikisi de RemainingTimeOrDistanceChangedListener üzerinden mevcut.

Bu kılavuzda yalnızca RoadSnappedLocationProvider ve LocationListener kullanılmıştır.

İstemci Tarafı Coğrafi Sınır Oluşturma Çözümü

Şimdi, istemci tarafında coğrafi sınır çizme özelliği oluşturmada adım adım ilerleyelim. Aşağıdaki örnekte, adım adım modda çalışan Navigasyon SDK'sı ve coğrafi sınırı temsil eden rotada tanımlanmış bir poligon bulunmaktadır.

Fonksiyon şeması
Fonksiyon şeması

  1. Coğrafi sınırlar BigQuery'de depolanır ve arka ucunuz tarafından çekilir.
  2. Arka uç, coğrafi sınırları düzenli olarak Drive uygulamalarına aktarır.
  3. Sürücü rotayı izliyor ve sürücü uygulaması, coğrafi sınırda tetikleyici olup olmadığını düzenli olarak kontrol ediyor.
  4. Sürücü Uygulaması, işlem yapılabilmesi için tetikleyici etkinliğin arka ucunu bilgilendirir.

Araç rota üzerinde ilerlerken uygulama, poligonun ihlal edilip edilmediğini düzenli olarak kontrol eder. Uygulama coğrafi sınırı aştığını algılarsa kullanıcı arayüzünde Geofence ihlal edildi yazan bir mesaj gösterilir.

Android Haritalar Yardımcı Programları için Bağımlılıkları Yapılandırma

Bu çözüm, Google Haritalar Android API'sını kullanan çok çeşitli uygulamalar için yararlı yardımcı programlar içeren açık kaynak bir kitaplık olan Android-Haritalar-Utils'i kullanır.

Bu kitaplık herkese açıktır, GitHub'da barındırılır. Şu adresten erişilebilir:

  • Android: https://github.com/googlemaps/android-maps-utils
  • iOS: https://github.com/googlemaps/google-maps-ios-utils

Bu kitaplığı Android uygulamanıza (bu dokümanın kapsamı) dahil etmek için build.gradle dosyanızı içerecek şekilde değiştirmeniz gerekir. Bu build.gradle dosyasının proje düzeyinde değil, oluşturduğunuz modül (uygulama) için olduğunu unutmayın.

dependencies {
   ...
   // Utilities for Maps SDK for Android (requires Google Play Services)
   implementation 'com.google.maps.android:android-maps-utils:2.3.0'
}

Ardından, Gradle'ı en son build.gradle dosyanızla senkronize ettikten sonra Java dosyanıza com.google.maps.android.PolyUtil dosyasını içe aktarabilirsiniz:

import com.google.android.gms.maps.model.PolygonOptions;
import com.google.maps.android.PolyUtil;

Coğrafi Sınırlarınızı Tanımlayın

Burada PolygonOptions öğesinin de içe aktarıldığını unutmayın. Bunun nedeni, çokgeni göstermek için kullanılan ifadenin şudur:

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);

Yukarıda görebileceğiniz gibi, burada önceden belirlenmiş koordinat - (enlem, boylam) çiftlerine sahip sabit bir çokgen tanımlıyoruz. Ancak gerçek senaryolarda, bu koordinatlar ve poligon tanımları çoğu zaman bir arka uç uç noktasından gelir ve muhtemelen uzaktan getirilecektir. Bu, poligonların uygulama tarafından anında oluşturulması gerektiği anlamına gelir.

PolygonOptions öğesinde belirtilebilecek öğeler hakkında daha fazla bilgi için lütfen buraya göz atın.

Çokgenleri, Parçanızı veya Etkinliğinizi oluştururken tanımlamalısınız. Örneğin:

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
}

Konum Güncellemelerini Dinle

Coğrafi sınırlarınızı tanımladıktan sonra, söz konusu Navigasyon SDK'sında sözü edilen RoadSnappedLocationProvider adlı etkinliğe abone olmak için bir konum güncelleme dinleyicisi oluşturmanız yeterlidir. Bu etkinlik, cihazın en son konumunu döndürür.

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-Haritalar-Utils ile, alınan konumun önceden tanımlanmış poligon içinde olup olmadığını kontrol etmek için PolyUtil.containsLocation öğesini kullanabilirsiniz. Aşağıdaki örnekte coğrafi sınırı temsil eden önceden tanımlanmış poligon kullanılmıştır ancak pratikte birden çok poligonunuz olabilir ve bir döngü gerekecektir.

Alternatif Bir Yaklaşım

Bu belge, özel coğrafi sınır (poligon) ihlali olup olmadığını kontrol eden, istemciye yönelik bir uygulamaya odaklanmaktadır. Yine de arka ucunuzda bu tür kontrolleri yapmak isteyebileceğiniz senaryolar vardır.

Yani uygulama, konum güncellemelerini bir arka uca bildirecek ve daha sonra bu arka uç, söz konusu aracın belirli bir poligonu ihlal edip etmediğini kontrol edecektir. Dolayısıyla, doğrulamayı yapmak için istemci uygulamasına bağlı değildir.

Bu sorunu çözmek için aşağıdaki adımları uygulayabilirsiniz:

[Yürütme Ortamı] Sunucu tarafı coğrafi sınır çizme mimarisi

Coğrafi sınır çizmeye sunucu tarafı yaklaşımını gösteren örnek bir mimari.

Sunucu tarafı çözüm
Sunucu tarafı çözüm

  1. Sürücü SDK'sı kullanan sürücü uygulaması, konum güncellemelerini Fleet Engine'e gönderir. Konum güncellemeleri ve uygulama içi gezinme, Gezinme SDK'sı aracılığıyla gerçekleştirilir.
  2. Fleet Engine, bu güncellemeleri Cloud Logging veya Pub/Sub'a gönderir.
  3. Arka uç bu konum sinyallerini toplar.
  4. Geofence'lar, arka uç tarafından analiz edilmeleri için BigQuery'de depolanır.
  5. Coğrafi sınır tetiklendikten sonra, Sürücü uygulamasına uyarılar gönderilir.

Bu mimaride, Sürücü SDK'sı ve Fleet Engine kullanılır. Fleet Engine, PubSub güncellemeleri yayınlayabilir ve Cloud Logging'de günlük girişleri oluşturabilir. Her iki durumda da araç konumu alınabilir.

Bu durumda arka uç, PubSub sırasını veya günlükleri okuyup araç güncellemelerini izleyebilir. Daha sonra, bir güncelleme olduğunda (veya kritikliğine bağlı olarak birkaç saniyede bir dakikada bir) arka uç, belirli bir aracın coğrafi sınırların içinde mi yoksa dışında mı olduğunu belirlemek için BigQuery GIS işlevlerini çağırabilir. Bir veya daha fazla coğrafi sınır ihlal edilirse arka uç, dahili ardışık düzenleri ya da diğer ilgili iş akışlarını harekete geçirip tetikleyebilir.

Sonuç

Coğrafi sınır çizme, çeşitli amaçlar için kullanılabilen güçlü bir araçtır. İşletmeler, alakalı reklamlar ve tanıtımlarla son kullanıcıları hedeflemek, konuma dayalı hizmetler sunmak, ayrıca güvenlik düzeyini artırmak için coğrafi sınır belirlemeyi kullanabilir.

Gezinme SDK'sı, bir yolculuk sırasında birçok önemli anı algılayabilen yararlı etkinlik işleyiciler sağlar. Şirketler genellikle belirli kullanım alanları için özel coğrafi sınırlara ihtiyaç duyar. Bu dokümanda, bunu başarmanın bir yolunu gösterdik, ancak olasılıklar sonsuz. Nasıl bir proje hazırlayacağınızı öğrenmek için sabırsızlanıyoruz.

Sonraki İşlemler

Önerilen Ek Okuma: