Bu belgede, istemci tarafı coğrafi sınırlama özelliğinin ne olduğu, ne zaman kullanılması gerektiği ve mobil uygulamalardaki kullanım alanlarına nasıl uygulanacağı açıklanmaktadır. Ayrıca, Google Navigasyon SDK'sı kullanılarak Android'de bir örneğin nasıl uygulanacağı da gösterilmektedir.
Şirketler genellikle bir mobil cihazın belirli bir alana ne zaman girdiğini veya bu alandan ne zaman çıktığını bilmek ister. Bu, sanal coğrafi sınırları (veya coğrafi çitleri) koruyarak gerçekleştirilir. Böylece, 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, özel teklifler, etkinlikler veya yeni ürünler hakkında son kullanıcılara anlık bildirimler göndermek için coğrafi sınırlama 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:
- İhlaller için kontrol etmesi gereken poligonlar,
- Kullanıcının gerçek zamanlı konumu
- Mevcut konumun poligonların içinde mi yoksa dışında mı olduğunu kontrol etme mantığı.
Bu rehberde Android ile ilgili örnekler yer alsa da iOS'te de benzer yöntemlerle bu işlemi gerçekleştirebilirsiniz. Android Konum Hizmeti'nde, burada görülebilen dairesel coğrafi sınırlar için yerleşik bir uygulama bulunur. Aşağıdaki referans kodu ve açıklaması, daha karmaşık uygulamalar için bir başlangıç noktasıdır.
Navigation SDK
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 oturtulmuş konumlar elde etme. Bu, konumları en yakın yol segmentine tutturmak için Google'ın yol ağını kullandığından Android'in FusedLocationProvider'ından (FLP) daha hassastır. Bu sayede TVS ç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 TVS 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 bir Navigasyon SDK'sı ve rotada tanımlanmış, coğrafi sınırlarımızı temsil eden bir poligon bulunmaktadır.
- Coğrafi sınırlar BigQuery'de depolanır ve arka uçunuz tarafından çekilir.
- Arka uç, coğrafi sınırları periyodik olarak sürücü uygulamalarına gönderir.
- Sürücü navigasyonu kullanır ve sürücü uygulaması, tetikleyici için coğrafi sınırlara düzenli olarak bakar.
- 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'sini kullanan çok çeşitli uygulamalar için yararlı 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 de içe aktarılmaktadır. Bunun nedeni, poligonu temsil etmek için kullanılan değerin ş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ı Navigasyon SDK'sındaki 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, alınan konumun önceden tanımlanmış poligonun içinde olup olmadığını kontrol etmek için PolyUtil.containsLocation işlevini kullanabilirsiniz. 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ırlama (çokgen) ihlalini 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 şekilde olabilir:
[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.
- Driver 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.
- Fleet Engine, bu güncellemeleri Cloud Logging veya Pub/Sub'a aktarır.
- Arka uç, bu konum sinyallerini toplar.
- Coğrafi sınırlar, arka uç tarafından analiz edilmek üzere BigQuery'de depolanır.
- Coğrafi sınırdan çıkıldığında 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 Pub/Sub 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 arayla, güncellemenin önemine bağlı olarak) arka uç, belirli bir aracın coğrafi sınırlı alanları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ıra girilmesi durumunda arka uç, dahili işlem hatlarını ya da 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, son kullanıcıları alakalı reklamlar ve promosyonlarla hedeflemek, konuma dayalı hizmetler sunmak, güvenliği ve emniyeti artırmak için coğrafi sınırlama kullanabilir.
Navigation SDK, 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ırlar gerektirir. Bu belgede, bunu başarmanın bir yolunu gösterdik ancak olasılıklar sınırsızdır. Hazırlayacağınız tasarımları sabırsızlıkla bekliyoruz.
Sonraki İşlemler
- Google Haritalar Platformu ile neler yapılabileceğini keşfedin, öğrenin ve bunlardan ilham alın başlıklı web seminerini izleyin.
Daha fazla bilgi için: