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

Bu belgede, istemci tarafı coğrafi sınırlama nedir, ne zaman kullanılır ve mobil uygulamalardaki kullanım alanlarına nasıl uygulanır açıklanmaktadır. Ayrıca, Google Navigation SDK'sını kullanarak Android'de bir örneğin nasıl uygulanacağını da gösterir.

Coğrafi sınırlı alan algılama özellikli Nav SDK'sı
Coğrafi çit algılama özellikli Navigasyon SDK'sı

Şirketlerin genellikle bir mobil cihazın belirli bir alana girip girmediğini veya bu alandan çıkıp çıkmadığını bilmesi gerekir. Bu, sanal coğrafi sınırları (veya coğrafi çitleri) koruyarak gerçekleştirilir. Bu sayede, bir cihaz sınırı aştığında yazılımın etkinlikleri tetiklemesi sağlanır.

Belirli bir aracın bir sınırı ne zaman geçtiğini anlamak, aşağıdakiler gibi birçok 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ırlama özelliğini kullanabilir.
  • Güvenlik: İşletmeler, veri merkezleri veya depolar gibi hassas alanların etrafında sanal sınırlar oluşturmak ve birisi alana girerse veya alandan çıkarsa güvenlik personelini uyarmak için coğrafi sınırlama kullanabilir.
  • Ulaşım: İşletmeler, araçların konumunu takip etmek ve rotaları ile programları optimize etmek için coğrafi sınırlama kullanabilir.

Bu nedenle, bu bölgeleri (çokgenler) müşteriye yönelik bir uygulamada nasıl temsil edeceğinizi bilmeniz önemlidir. Bu uygulama, cihaz konumunu izlemeli ve belirli bir coğrafi sınıra girilip girilmediğini kontrol etmelidir.

Kapsam

Bu belgede, coğrafi sınırlama özelliğinin istemci tarafında uygulanması ele alınmaktadır . Bu nedenle, istemci uygulamasında şunlar bulunmalıdır:

  1. İhlaller için kontrol etmesi gereken poligonlar,
  2. Kullanıcının gerçek zamanlı konumu
  3. Mevcut konumun poligonların içinde mi yoksa dışında mı olduğunu kontrol etme mantığı.

Bu kılavuzda Android ile ilgili örnekler yer alsa da iOS'te de benzer yöntemler kullanılabilir. Android Konum Hizmeti'nde, burada görülebileceği gibi dairesel coğrafi sınırlar için yerleşik bir uygulama bulunur. Aşağıdaki referans kodu ve açıklama, daha karmaşık uygulamalar için bir başlangıç noktasıdır.

Navigasyon SDK'sı, sürücü uygulamasına eklenen yerel bir Android / iOS kitaplığıdır. Aşağıdakilerden sorumludur:

  • Uygulamayı çalıştıran cihazdan yola sabitlenmiş konumlar alma Bu, konumları en yakın yol segmentine sabitlemek için Google'ın yol ağını kullandığından Android'in FusedLocationProvider (FLP) hizmetinden daha hassastır. Bu sayede tahmini varış zamanı çok daha doğru olur ve FLP'den alınan diğer bilgiler de kullanılır.
  • 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 ulaşmasını sağlayan adım adım yol tarifi deneyimi.
  • Etkinlikleri, etkinlik işleyiciler ve kayıtlı geri çağırmalar aracılığıyla tetikleme.

Dinleyiciler

Navigation SDK'da kullanabileceğiniz birçok dinleyici vardır. Örneğin:

  • RoadSnappedLocation sağlayıcısı aracılığıyla konum değişiklikleri.
  • ReroutingListener aracılığıyla etkinlikleri yeniden yönlendirme (kullanıcı U dönüşünü, sol dönüşü vb. kaçırır ve önerilen rotadan sapar).
  • ArrivalListener aracılığıyla varış etkinlikleri (kullanıcı planlanan hedefe varır).
  • Kalan mesafe ve tahmini varış zamanı etkinlikleri (sürücü hedefe varmak üzereyken metreye göre bildirim alma, sürücü hedefe varmak üzereyken zamana göre bildirim alma) RemainingTimeOrDistanceChangedListener üzerinden kullanılabilir.

Bu kılavuzda yalnızca RoadSnappedLocationProvider ve LocationListener'ı kullanılır.

İstemci tarafı coğrafi sınırlama çözümü

Şimdi istemci tarafında coğrafi sınırlama özelliği oluşturma adımlarını inceleyelim. Aşağıdaki örnekte, adım adım modda çalışan Navigation SDK ve rotada tanımlanmış, coğrafi sınırlarımızı temsil eden bir poligon bulunmaktadır.

Fonksiyonel diyagram
İşlevsel diyagram

  1. Coğrafi sınırlar BigQuery'de depolanır ve arka uçunuz tarafından çekilir.
  2. Arka uç, coğrafi sınırlara ilişkin bilgileri düzenli olarak sürüş uygulamalarına gönderir.
  3. Sürücü navigasyonu kullanır ve sürücü uygulaması, tetikleyici için coğrafi sınırlı alanları düzenli olarak kontrol eder.
  4. Sürücü uygulaması, arka uca bir tetikleyici etkinlik hakkında bildirim gönderir. Böylece arka uç, gerekli işlemleri yapabilir.

Araç rotada ilerlerken uygulama, poligonun ihlal edilip edilmediğini düzenli olarak kontrol eder. Uygulama, coğrafi sınırın aşıldığını algıladığında kullanıcı arayüzünde Coğrafi sınır ihlal edildi mesajı gösterilir.

Android-Maps-Utils için Bağımlılıkları Yapılandırma

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

Bu kitaplık herkese açıktır, GitHub'da barındırılır ve ş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 belgenin kapsamı) build.gradle dosyanızı değiştirerek kitaplığı eklemeniz 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 öğesini 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ımlama

Burada PolygonOptions öğesinin de içe aktarıldığını unutmayın. Bunun nedeni, çokgeni temsil etmek için kullanılan şeklin şu olması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) 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 durumda, çokgenlerin uygulama tarafından anında oluşturulması gerekir.

PolygonOptions içinde neler belirtilebileceği hakkında daha fazla bilgi için lütfen burayı inceleyin.

Parçanızı veya Etkinliğinizi oluştururken poligonları tanımlamanız gerekir. Ö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 dinleme

Coğrafi çitlerinizi tanımladıktan sonra, cihazın en son konumunu döndüren RoadSnappedLocationProvider adlı Navigation SDK'daki yukarıda belirtilen etkinliğe abone olmak için bir konum güncelleme işleyicisi oluşturmanız yeterlidir.

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 PolyUtil.containsLocation kullanarak alınan konumun önceden tanımlanmış poligonun içinde olup olmadığını kontrol edebilirsiniz. Aşağıdaki örnekte, coğrafi sınırı temsil eden önceden tanımlanmış poligon kullanılmaktadır. Ancak uygulamada birden fazla poligonunuz olabilir ve bir döngü gerekebilir.

Alternatif Yaklaşım

Bu belgede, özel bir coğrafi sınırdaki (çokgen) ihlali kontrol eden, müşteriye yönelik bir uygulamaya odaklanılmaktadır. Ancak, arka uçta bu tür kontroller yapmak isteyebileceğiniz senaryolar vardır.

Bu, uygulamanın konum güncellemelerini bir arka uca bildireceği ve bu arka ucun da söz konusu aracın belirli bir poligonu ihlal edip etmediğini kontrol edeceği, dolayısıyla doğrulama için istemci uygulamasına bağlı olmayacağı anlamına gelir.

Olası çözüm şu şekildedir:

[Execution Environment] Sunucu tarafında coğrafi sınırlama mimarisi

Coğrafi sınırlama için 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ı, Fleet Engine'e konum güncellemeleri gönderir. Konum güncellemeleri ve uygulama içi navigasyon, Navigation SDK aracılığıyla gerçekleşir.
  2. Fleet Engine, bu güncellemeleri Cloud Logging veya Pub/Sub'a aktarır.
  3. Arka uç, bu konum sinyallerini toplar.
  4. Coğrafi sınırlar, arka uç tarafından analiz edilmek üzere BigQuery'de depolanır.
  5. Coğrafi sınırlama tetiklendiğinde sürücü uygulamasına uyarılar gönderilir.

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

Arka uç daha sonra PubSub kuyruğunu izleyebilir veya günlükleri okuyup araç güncellemelerini takip edebilir. Ardından, bir güncelleme olduğunda (veya birkaç saniye ya da dakika aralıklarla, güncellemenin önemine bağlı olarak) arka uç, belirli bir aracın coğrafi sınırlarda olup olmadığını belirlemek için BigQuery GIS işlevlerini çağırabilir. Bir veya daha fazla coğrafi sınıra girilmesi durumunda arka uç, dahili işlem hatlarını veya diğer ilgili iş akışlarını tetikleyebilir.

Sonuç

Coğrafi sınırlama, çeşitli amaçlarla kullanılabilecek güçlü bir araçtır. İşletmeler, coğrafi sınırlama kullanarak son kullanıcıları alakalı reklamlar ve promosyonlarla hedefleyebilir, konuma dayalı hizmetler sunabilir, güvenlik ve emniyeti artırabilir.

Navigation SDK, 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 sınırlar gerektirir. Bu belgede, bunu başarmanın bir yolunu gösterdik ancak olasılıklar sınırsızdır. Neler ortaya çıkaracağınızı görmek için sabırsızlanıyoruz.

Sonraki İşlemler

Önerilen Ek Okumalar: