এই ডকুমেন্টে ক্লায়েন্ট-সাইড জিওফেন্সিং কী, কখন এটি ব্যবহার করতে হবে এবং মোবাইল অ্যাপ্লিকেশনে কেস ব্যবহারের জন্য এটি কীভাবে প্রয়োগ করতে হবে তা বর্ণনা করা হয়েছে। এটি গুগল নেভিগেশন SDK ব্যবহার করে অ্যান্ড্রয়েডে একটি উদাহরণ কীভাবে বাস্তবায়ন করতে হয় তাও দেখায়।

কোম্পানিগুলিকে প্রায়শই জানতে হয় কখন একটি মোবাইল ডিভাইস একটি নির্দিষ্ট এলাকায় প্রবেশ করে বা ছেড়ে যায়। এটি ভার্চুয়াল ভৌগোলিক সীমানা বা জিওফেন্স বজায় রেখে সম্পন্ন করা হয়, যা সফ্টওয়্যারকে একটি ডিভাইস যখন একটি সীমানা অতিক্রম করে তখন ইভেন্টগুলি ট্রিগার করতে সক্ষম করে।
একটি নির্দিষ্ট যানবাহন কখন একটি সীমানা অতিক্রম করে তা বোঝা একাধিক ব্যবহারের ক্ষেত্রে গুরুত্বপূর্ণ, যেমন:
- গ্রাহক সম্পৃক্ততা : ব্যবসাগুলি জিওফেন্সিং ব্যবহার করে শেষ ব্যবহারকারীদের বিশেষ অফার, ইভেন্ট বা নতুন পণ্য সম্পর্কে পুশ বিজ্ঞপ্তি পাঠাতে পারে।
- নিরাপত্তা এবং সুরক্ষা : ব্যবসা প্রতিষ্ঠানগুলি জিওফেন্সিং ব্যবহার করে ডেটা সেন্টার বা গুদামের মতো সংবেদনশীল এলাকাগুলির চারপাশে ভার্চুয়াল পরিধি তৈরি করতে পারে এবং কেউ যদি এলাকায় প্রবেশ করে বা বেরিয়ে যায় তবে নিরাপত্তা কর্মীদের সতর্ক করতে পারে।
- পরিবহন : ব্যবসা প্রতিষ্ঠানগুলি যানবাহনের অবস্থান ট্র্যাক করতে এবং রুট এবং সময়সূচী অপ্টিমাইজ করতে জিওফেন্সিং ব্যবহার করতে পারে।
অতএব, ক্লায়েন্ট-ফেসিং অ্যাপের ভিতরে সেই অঞ্চলগুলি (বহুভুজ) কীভাবে উপস্থাপন করতে হয় তা জানা আপনার জন্য গুরুত্বপূর্ণ। এই অ্যাপটি ডিভাইসের অবস্থান ট্র্যাক করবে এবং এটি কোনও নির্দিষ্ট জিওফেন্স লঙ্ঘন করেছে কিনা তা পরীক্ষা করবে।
ব্যাপ্তি
এই ডকুমেন্টটি জিওফেন্সিং এর ক্লায়েন্ট-সাইড বাস্তবায়নের উপর আলোকপাত করে। এর অর্থ হল ক্লায়েন্ট অ্যাপটিতে অবশ্যই থাকতে হবে:
- যেসব বহুভুজ লঙ্ঘনের জন্য পরীক্ষা করা প্রয়োজন;
- ব্যবহারকারীর রিয়েল-টাইম অবস্থান
- বর্তমান অবস্থানটি বহুভুজের ভিতরে না বাইরে তা পরীক্ষা করার যুক্তি।
এই নির্দেশিকাটিতে অ্যান্ড্রয়েডের উদাহরণ রয়েছে কিন্তু iOS-এ এটি সম্পন্ন করার জন্য সমতুল্য উপায় রয়েছে। অ্যান্ড্রয়েড লোকেশন সার্ভিসে বৃত্তাকার জিওফেন্সের জন্য একটি অন্তর্নির্মিত বাস্তবায়ন রয়েছে যা এখানে দেখা যাবে। নীচের রেফারেন্স কোড এবং বর্ণনাটি আরও জটিল বাস্তবায়নের জন্য একটি সূচনা বিন্দু।
নেভিগেশন SDK
নেভিগেশন SDK হল একটি নেটিভ অ্যান্ড্রয়েড / iOS লাইব্রেরি যা ড্রাইভার অ্যাপে যোগ করা হয়েছে। এটি নিম্নলিখিতগুলির জন্য দায়ী:
- অ্যাপটি চালানোর মাধ্যমে রাস্তার স্ন্যাপ করা লোকেশনগুলি পাওয়া। এটি অ্যান্ড্রয়েডের ফিউজডলোকেশন প্রোভাইডার (FLP) এর চেয়ে বেশি নির্ভুল কারণ এটি নিকটতম রাস্তার অংশে অবস্থানগুলি স্ন্যাপ করার জন্য গুগলের রোড নেটওয়ার্ক ব্যবহার করে যা ETA এবং FLP থেকে অন্যান্য তথ্য অনেক বেশি নির্ভুল করে তোলে।
- টার্ন-বাই-টার্ন অভিজ্ঞতা যা ড্রাইভারদের রিয়েল-টাইম ট্র্যাফিক এবং অন্যান্য রুট বিধিনিষেধ বিবেচনা করে পয়েন্ট A থেকে পয়েন্ট B তে দক্ষতার সাথে যেতে দেয়।
- ইভেন্ট লিসেনার্স এবং নিবন্ধিত কলব্যাকের মাধ্যমে ইভেন্টগুলি পরিচালনা করা।
শ্রোতা
নেভিগেশন SDK-তে অনেক লিসেনারের ব্যবহার আছে যা আপনি ব্যবহার করতে পারেন। কয়েকটির নাম বলতে চাই:
- RoadSnappedLocation প্রদানকারীর মাধ্যমে অবস্থান পরিবর্তন করা হয়।
- ReroutingListener এর মাধ্যমে ইভেন্টগুলি পুনঃরুট করুন (ব্যবহারকারী ইউ-টার্ন, বাম দিকে মোড় ইত্যাদি মিস করেন এবং প্রস্তাবিত রুট থেকে বিচ্যুত হন)।
- ArrivalListener এর মাধ্যমে আগমনের ইভেন্ট (ব্যবহারকারী পরিকল্পিত গন্তব্যে পৌঁছান)।
- অবশিষ্ট দূরত্ব এবং ETA ইভেন্ট (ড্রাইভার যখন গন্তব্যে পৌঁছাতে চলেছে তখন বিজ্ঞপ্তি পান - মিটারের উপর ভিত্তি করে, ড্রাইভার যখন গন্তব্যে পৌঁছাতে চলেছে তখন বিজ্ঞপ্তি পান - সময়ের উপর ভিত্তি করে) উভয়ই এর মাধ্যমে উপলব্ধ। RemainingTimeOrDistanceChangedListener
এই নির্দেশিকায় শুধুমাত্র RoadSnappedLocation Provider এবং এর LocationListener ব্যবহার করা হয়েছে।
ক্লায়েন্ট সাইড জিওফেন্সিং সমাধান
এবার আসুন ক্লায়েন্ট সাইড জিওফেন্সিং ক্ষমতা তৈরির দিকে এগিয়ে যাই। নীচের উদাহরণে আমাদের কাছে নেভিগেশন SDK টার্ন-বাই-টার্ন মোডে কাজ করছে এবং রুটে একটি বহুভুজ সংজ্ঞায়িত করা হয়েছে যা আমাদের জিওফেন্সকে প্রতিনিধিত্ব করে।
- জিওফেন্সগুলি BigQuery-তে সংরক্ষণ করা হয় এবং আপনার ব্যাকএন্ড দ্বারা টানা হয়।
- ব্যাকএন্ড পর্যায়ক্রমে জিওফেন্সগুলিকে ড্রাইভ অ্যাপগুলিতে ঠেলে দেয়।
- ড্রাইভার নেভিগেট করে এবং ড্রাইভার অ্যাপ নিয়মিতভাবে জিওফেন্সগুলি পরীক্ষা করে দেখে যে কোনও ট্রিগার আছে কিনা।
- ড্রাইভার অ্যাপটি একটি ট্রিগার ইভেন্টের ব্যাকএন্ডকে অবহিত করে যাতে এটি কাজ করতে পারে।
যখন গাড়িটি রুট ধরে চলাচল করে, অ্যাপটি নিয়মিতভাবে পরীক্ষা করে যে বহুভুজটি ভেঙে গেছে কিনা। যখন অ্যাপটি সনাক্ত করে যে এটি একটি জিওফেন্স অতিক্রম করেছে তখন UI তে একটি বার্তা প্রদর্শিত হয় যেখানে লেখা থাকে: জিওফেন্স ভেঙে গেছে ।
অ্যান্ড্রয়েড-ম্যাপ-ইউটিলের জন্য নির্ভরতা কনফিগার করুন
এই সমাধানটি Android-Maps-Utils ব্যবহার করে, একটি ওপেন-সোর্স লাইব্রেরি যাতে এমন ইউটিলিটি রয়েছে যা Google Maps Android API ব্যবহার করে বিস্তৃত অ্যাপ্লিকেশনের জন্য উপযোগী।
এই লাইব্রেরিটি সর্বজনীন এবং Github-এ হোস্ট করা হয়েছে এবং এখানে অ্যাক্সেস করা যেতে পারে:
- অ্যান্ড্রয়েড : https://github.com/googlemaps/android-maps-utils
- আইওএস : https://github.com/googlemaps/google-maps-ios-utils
আপনার অ্যান্ড্রয়েড অ্যাপে (এই ডকুমেন্টের পরিধি) এই লাইব্রেরিটি অন্তর্ভুক্ত করতে, আপনার 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'
}
তারপর, আপনার সর্বশেষ build.gradle ফাইলের সাথে Gradle সিঙ্ক করার পরে, আপনি আপনার জাভা ফাইলে 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 এ কী নির্দিষ্ট করা যেতে পারে সে সম্পর্কে আরও তথ্যের জন্য অনুগ্রহ করে এখানে দেখুন।
তোমার Fragment বা Activity তৈরির সময় বহুভুজ(গুলি) নির্ধারণ করা উচিত। উদাহরণস্বরূপ:
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
}
লোকেশন আপডেটের জন্য শুনুন
আপনার জিওফেন্সগুলি সংজ্ঞায়িত করার পরে, আপনাকে কেবল একটি লোকেশন আপডেট লিসেনার তৈরি করতে হবে যাতে আপনি নেভিগেশন 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 ব্যবহার করে পরীক্ষা করতে পারেন যে প্রাপ্ত অবস্থানটি পূর্বনির্ধারিত বহুভুজের ভিতরে আছে কিনা। নীচের উদাহরণে, জিওফেন্স প্রতিনিধিত্বকারী পূর্বনির্ধারিত বহুভুজ ব্যবহার করা হয়েছে, তবে বাস্তবে আপনার একাধিক বহুভুজ থাকতে পারে এবং একটি লুপের প্রয়োজন হবে।
একটি বিকল্প পদ্ধতি
এই ডকুমেন্টটি এমন একটি ক্লায়েন্ট-ফেসিং অ্যাপ্লিকেশনের উপর আলোকপাত করে যা একটি কাস্টম জিওফেন্স (বহুভুজ) লঙ্ঘনের জন্য পরীক্ষা করে। তবে এমন কিছু পরিস্থিতি রয়েছে যেখানে আপনি আপনার ব্যাকএন্ডে এই ধরনের পরীক্ষা করতে চাইতে পারেন।
এর মানে হল যে অ্যাপটি একটি ব্যাকএন্ডে অবস্থান আপডেট রিপোর্ট করবে এবং এই ব্যাকএন্ডটি তখন পরীক্ষা করবে যে গাড়িটি একটি নির্দিষ্ট বহুভুজ লঙ্ঘন করেছে কিনা, এইভাবে যাচাইকরণের জন্য ক্লায়েন্ট অ্যাপের উপর নির্ভর করবে না।
একটি সম্ভাব্য সমাধান নিম্নরূপ হতে পারে:
[এক্সিকিউশন এনভায়রনমেন্ট] সার্ভার সাইড জিওফেন্সিং আর্কিটেকচার
জিওফেন্সিংয়ের জন্য সার্ভার-সাইড পদ্ধতির একটি উদাহরণ স্থাপত্য।

- ড্রাইভার অ্যাপ, ড্রাইভার SDK ব্যবহার করে, ফ্লিট ইঞ্জিনে অবস্থান আপডেট পাঠায়। অবস্থান আপডেট এবং ইন-অ্যাপ নেভিগেশন নেভিগেশন SDK এর মাধ্যমে ঘটে।
- ফ্লিট ইঞ্জিন সেই আপডেটগুলিকে ক্লাউড লগিং বা পাব/সাব-এ আউটপুট করে।
- ব্যাকএন্ড সেই অবস্থান সংকেত সংগ্রহ করে।
- ব্যাকএন্ড দ্বারা বিশ্লেষণের জন্য জিওফেন্সগুলি বিগ কোয়েরিতে সংরক্ষণ করা হয়।
- জিওফেন্স চালু করার পর, ড্রাইভার অ্যাপে সতর্কতা পাঠানো হয়।
এই স্থাপত্যে, ড্রাইভার SDK এবং ফ্লিট ইঞ্জিন ব্যবহার করা হয়। ফ্লিট ইঞ্জিন PubSub আপডেট নির্গত করতে পারে এবং ক্লাউড লগিংয়ে লগ এন্ট্রি তৈরি করতে পারে। উভয় ক্ষেত্রেই, গাড়ির অবস্থান পুনরুদ্ধার করা যেতে পারে।
এরপর ব্যাকএন্ডটি PubSub কিউ পর্যবেক্ষণ করতে পারে অথবা লগ পড়তে পারে এবং যানবাহনের আপডেটের জন্য নজর রাখতে পারে। তারপর, যখনই কোনও আপডেট ঘটে (অথবা প্রতি কয়েক সেকেন্ড, মিনিটে, এর গুরুত্বের উপর নির্ভর করে), ব্যাকএন্ডটি BigQuery GIS ফাংশনগুলিকে কল করতে পারে যাতে নির্ধারণ করা যায় যে কোনও যানবাহন জিওফেন্সের ভিতরে আছে নাকি বাইরে। যদি এক বা একাধিক জিওফেন্স লঙ্ঘন করা হয়, তাহলে ব্যাকএন্ডটি অভ্যন্তরীণ পাইপলাইন বা অন্যান্য প্রাসঙ্গিক কর্মপ্রবাহকে সক্রিয় করতে পারে।
উপসংহার
জিওফেন্সিং একটি শক্তিশালী হাতিয়ার যা বিভিন্ন উদ্দেশ্যে ব্যবহার করা যেতে পারে। ব্যবসাগুলি প্রাসঙ্গিক বিজ্ঞাপন এবং প্রচারের মাধ্যমে শেষ ব্যবহারকারীদের লক্ষ্য করতে, অবস্থান-ভিত্তিক পরিষেবা প্রদান করতে এবং নিরাপত্তা ও সুরক্ষা উন্নত করতে জিওফেন্সিং ব্যবহার করতে পারে।
নেভিগেশন SDK কার্যকর ইভেন্ট লিসেনারের সুবিধা প্রদান করে যা ভ্রমণের সময় অনেক গুরুত্বপূর্ণ মুহূর্ত সনাক্ত করতে পারে। কোম্পানিগুলি প্রায়শই নির্দিষ্ট ব্যবহারের ক্ষেত্রে কাস্টম জিওফেন্সের প্রয়োজন করে। এই নথিতে আমরা এটি অর্জনের একটি উপায় দেখিয়েছি, তবে সম্ভাবনাগুলি অফুরন্ত। আপনি কী নিয়ে আসেন তা দেখার জন্য আমরা অধীর আগ্রহে অপেক্ষা করছি।
পরবর্তী পদক্ষেপ
আরও পড়ার জন্য প্রস্তাবিত: