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ırlamanın ne olduğu, ne zaman kullanılacağı ve mobil uygulamalardaki kullanım alanlarına nasıl uygulanacağı açıklanmaktadır. Ayrıca, Google Gezinme SDK'sı kullanılarak Android'de nasıl örneğin uygulanacağı gösterilmektedir.

Coğrafi sınır algılama özelliğine sahip Nav SDK'sı
Geofence algılamalı gezinme SDK'sı

Şirketlerin genellikle bir mobil cihazın belirli bir alana ne zaman girdiğini veya belirli bir alandan ayrıldığını bilmesi gerekir. Bu, bir cihaz sınırı geçtiğinde yazılımın etkinlikleri tetiklemesini sağlayan sanal coğrafi sınırlar (coğrafi sınırlar) korunarak sağlanır.

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 çizme özelliğini kullanabilir.
  • Güvenlik ve emniyet: İşletmeler, veri merkezleri veya ambarlar gibi hassas alanların etrafında sanal çevreler oluşturmak için coğrafi sınır çizmeyi kullanabilir ve alana biri girdiğinde veya alandan ayrıldığında güvenlik personelini uyarabilir.
  • Ulaşım: İşletmeler, araçların konumunu izlemek ve rotalar ile tarifeleri optimize etmek için coğrafi sınır çizme özelliğini kullanabilir.

Bu nedenle, istemciye dönük bir uygulamada bu bölgeleri (poligonları) nasıl göstereceğinizi bilmeniz önemlidir. Bu uygulama, cihaz konumunu izlemeli ve belirli bir coğrafi sınırı aşıp aşmadığını kontrol etmelidir.

Kapsam

Bu belge, istemci tarafında coğrafi sınır çizme uygulamasına odaklanmaktadır . Bu, istemci uygulamada şu özelliklere sahip olması 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. Mantık, mevcut konumun poligonların içinde mi yoksa dışında mı olduğunu kontrol eder.

Bu kılavuzda Android ile ilgili örnekler yer almaktadır ancak iOS'ta bunu yapmanın eşdeğer yolları da vardır. Android Konum Hizmeti, burada görebileceğiniz dairesel coğrafi çitler için yerleşik bir uygulamaya sahiptir. Aşağıdaki referans kodu ve açıklama, daha karmaşık uygulamalar için başlangıç noktasıdır.

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

  • Yolu çalıştıran uygulamadan yolla alınan konumları alma. Bu, Android'in FusedLocationProvider'dan (FLP) daha kesin sonuç verir. Çünkü Google'ın yol ağını kullanarak konumları en yakın yol segmentine tutturur. Böylece ETA'yı ve FLP'den alınan diğer bilgiler çok daha doğru olur.
  • Sürücülerin gerçek zamanlı trafik ve diğer rota kısıtlamalarını dikkate alarak A noktasından B noktasına verimli bir şekilde gidebilmelerini sağlayan adım adım deneyim.
  • Etkinlik işleyiciler ve kayıtlı geri çağırmalar aracılığıyla etkinlikleri tetikleme.

Dinleyiciler

Navigasyon SDK'sının kullanabileceğiniz birçok işleyicisi vardır. Birkaç örnek vermek gerekirse:

  • RoadSnappedLocation sağlayıcısı üzerinden yapılan konum değişiklikleri.
  • ReroutingListener aracılığıyla etkinlikleri yeniden yönlendirin (kullanıcı u dönüşünü, sola dönüşü vs. kaçırır ve önerilen rotadan sapır).
  • ArrivalListener aracılığıyla varış etkinlikleri (kullanıcı planlanan hedefe varır).
  • Kalan mesafe ve TVS etkinlikleri (sürücü hedefe varmak üzereyken bildirim alın (metrelere bağlı olarak, sürücü zamana dayalı olarak) hedefe varmak üzere olduğunda bildirim alın) her ikisi de .RemainingTimeOrDistanceChangedListener üzerinden sunulur.

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

İstemci Tarafı Coğrafi Sınırlama Çözümü

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

İşlevsel diyagram
İşlevsel diyagram

  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 aralıklarla sürücü uygulamalarına iter.
  3. Sürücü rotayı izliyor ve sürücü uygulaması, coğrafi çitleri düzenli olarak tetikleyip kontrol ediyor.
  4. Sürücü Uygulaması, bir tetikleyici etkinliğin arka ucuna, işlem yapabilmesi için bildirim gönderir.

Araç rota boyunca hareket ederken uygulama, poligonun aşınmış olup olmadığını düzenli olarak kontrol eder. Uygulama, coğrafi sınırı aştığını algıladığında kullanıcı arayüzünde Geofence ihlali oluştu şeklinde bir mesaj görüntüleniyor.

Android-Haritalar-Utils İçin Bağımlılıkları Yapılandırma

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

Herkese açık olan ve GitHub'da barındırılan bu kitaplığa ş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 dahil etmek için (bu dokümanın kapsamı) 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üle (uygulama) yönelik 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'
}

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

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

Coğrafi Sınırlarınızı Belirleyin

Burada PolygonOptions etiketinin de içe aktarıldığını unutmayın. Bunun nedeni, poligonu göstermek için şunun kullanılmasıdır:

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ş koordinatlara (enlem, boylam) çiftleri sahip sabit bir poligon 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 getirilir. Bu, poligonların uygulama tarafından anında oluşturulması gerektiği anlamına gelir.

PolygonOptions politikasında nelerin belirtilebileceği hakkında daha fazla ayrıntı için lütfen burayı inceleyin.

Çokgenleri, Parça 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 Dinleyin

Coğrafi çitlerinizi tanımladıktan sonra, Navigasyon SDK'sında yukarıda bahsedilen RoadSnappedLocationProvider adlı etkinliğe abone olmak için bir konum güncelleme işleyicisi 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-maps-Utils ile alınan konumun önceden tanımlanmış poligonun içinde olup olmadığını kontrol etmek için PolyUtil.containsLocation uygulamasını kullanabilirsiniz. Aşağıdaki örnekte coğrafi sınırı temsil eden önceden tanımlanmış poligon kullanılmıştır, ancak pratikte birden fazla poligonunuz olabilir ve bir döngü gerekebilir.

Alternatif Yaklaşım

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

Bu, uygulamanın konum güncellemelerini bir arka uca bildireceği ve bu arka ucun, aracın belirli bir poligonu aşıp aşmadığını kontrol edeceği, dolayısıyla doğrulamayı yapacak istemci uygulamasına bağlı olmadığı anlamına gelir.

Olası bir çözüm şu şekilde olabilir:

[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 mimari.

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

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

Bu mimaride Driver 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 izliyor olabilir. Ardından, bir güncelleme gerçekleştiğinde (veya önem düzeyine bağlı olarak birkaç saniyede, 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 Coğrafi Bilgi Sistemi işlevlerini çağırabilir. Bir veya daha fazla coğrafi sınır ihlal edilirse arka uç, dahili ardışık düzenler veya diğer ilgili iş akışlarını tetikleyebilir ve tetikleyebilir.

Sonuç

Coğrafi sınır çizme, çeşitli amaçlar için kullanılabilecek güçlü bir araçtır. İşletmeler, alakalı reklamlar ve promosyonlarla son kullanıcıları hedeflemek, konuma dayalı hizmetler sunmak ve güvenlik ile emniyeti artırmak için coğrafi sınır çizme özelliğini kullanabilir.

Gezinme SDK'sı, bir yolculuk sırasında birçok önemli anı algılayabilen faydalı etkinlik işleyiciler sağlar. Şirketler genellikle belirli kullanım alanları için özel coğrafi çitler kullanılmasını gerektirir. Bu belgede, bunu başarmanın bir yolunu gösterdik ancak olanaklar sonsuzdur. Nasıl bir proje hazırlayacağınızı öğrenmek için sabırsızlanıyoruz.

Sonraki İşlemler

Önerilen Ek Kaynaklar: