# জিওফেন্স ![এই পাঠের একটি স্কেচনোট সংক্ষিপ্ত বিবরণ](../../../../../translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.bn.jpg) > স্কেচনোট: [নিত্য নারাসিমহান](https://github.com/nitya)। বড় সংস্করণের জন্য ছবিতে ক্লিক করুন। এই ভিডিওটি জিওফেন্স এবং Azure Maps-এ সেগুলি কীভাবে ব্যবহার করা যায় তার একটি সংক্ষিপ্ত বিবরণ দেয়, যা এই পাঠে আলোচনা করা হবে: [![Microsoft Developer IoT শো থেকে Azure Maps-এ জিওফেন্সিং](https://img.youtube.com/vi/nsrgYhaYNVY/0.jpg)](https://www.youtube.com/watch?v=nsrgYhaYNVY) > 🎥 উপরের ছবিতে ক্লিক করে ভিডিওটি দেখুন ## প্রাক-পাঠ কুইজ [প্রাক-পাঠ কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/27) ## ভূমিকা শেষ তিনটি পাঠে, আপনি IoT ব্যবহার করে আপনার খামার থেকে প্রক্রিয়াকরণ কেন্দ্রে পণ্যবাহী ট্রাকগুলির অবস্থান নির্ধারণ করেছেন। আপনি GPS ডেটা সংগ্রহ করেছেন, এটি ক্লাউডে সংরক্ষণ করেছেন এবং মানচিত্রে প্রদর্শন করেছেন। আপনার সরবরাহ শৃঙ্খলার দক্ষতা বাড়ানোর পরবর্তী ধাপটি হল একটি ট্রাক প্রক্রিয়াকরণ কেন্দ্রে পৌঁছানোর আগে একটি সতর্কতা পাওয়া, যাতে আনলোড করার জন্য প্রয়োজনীয় দলটি ফর্কলিফট এবং অন্যান্য সরঞ্জাম নিয়ে প্রস্তুত থাকতে পারে। এভাবে তারা দ্রুত আনলোড করতে পারে, এবং আপনাকে ট্রাক এবং চালকের অপেক্ষার জন্য অতিরিক্ত অর্থ দিতে হবে না। এই পাঠে আপনি জিওফেন্স সম্পর্কে শিখবেন - সংজ্ঞায়িত ভূ-স্থানীয় অঞ্চল যেমন প্রক্রিয়াকরণ কেন্দ্রের ২ কিমি ড্রাইভের মধ্যে একটি এলাকা, এবং GPS কোঅর্ডিনেটস জিওফেন্সের ভিতরে বা বাইরে রয়েছে কিনা তা পরীক্ষা করার পদ্ধতি, যাতে আপনি দেখতে পারেন আপনার GPS সেন্সর একটি এলাকায় প্রবেশ করেছে বা তা ছেড়েছে। এই পাঠে আমরা আলোচনা করব: * [জিওফেন্স কী](../../../../../3-transport/lessons/4-geofences) * [জিওফেন্স সংজ্ঞায়িত করা](../../../../../3-transport/lessons/4-geofences) * [জিওফেন্সের বিরুদ্ধে পয়েন্ট পরীক্ষা করা](../../../../../3-transport/lessons/4-geofences) * [সার্ভারলেস কোড থেকে জিওফেন্স ব্যবহার করা](../../../../../3-transport/lessons/4-geofences) > 🗑 এটি এই প্রকল্পের শেষ পাঠ, তাই এই পাঠ এবং অ্যাসাইনমেন্ট সম্পন্ন করার পরে, আপনার ক্লাউড পরিষেবাগুলি পরিষ্কার করতে ভুলবেন না। অ্যাসাইনমেন্ট সম্পন্ন করার জন্য পরিষেবাগুলি প্রয়োজন হবে, তাই প্রথমে এটি সম্পন্ন করুন। > > প্রয়োজন হলে [আপনার প্রকল্প পরিষ্কার করার নির্দেশিকা](../../../clean-up.md) দেখুন। ## জিওফেন্স কী জিওফেন্স হল একটি বাস্তব-জগতের ভৌগোলিক অঞ্চলের জন্য একটি ভার্চুয়াল পরিধি। জিওফেন্সগুলি বৃত্তাকার হতে পারে যা একটি পয়েন্ট এবং একটি ব্যাসার্ধ দ্বারা সংজ্ঞায়িত (যেমন একটি বিল্ডিংয়ের চারপাশে ১০০ মিটার চওড়া একটি বৃত্ত), অথবা একটি বহুভুজ হতে পারে যা একটি এলাকা যেমন স্কুল জোন, শহরের সীমানা, বা বিশ্ববিদ্যালয় বা অফিস ক্যাম্পাসকে কভার করে। ![Microsoft কোম্পানি স্টোরের চারপাশে একটি বৃত্তাকার জিওফেন্স এবং Microsoft পশ্চিম ক্যাম্পাসের চারপাশে একটি বহুভুজ জিওফেন্সের কিছু উদাহরণ](../../../../../translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.bn.png) > 💁 আপনি হয়তো আগে জিওফেন্স ব্যবহার করেছেন কিন্তু তা জানেননি। যদি আপনি iOS রিমাইন্ডার অ্যাপ বা Google Keep-এ একটি অবস্থানের উপর ভিত্তি করে একটি রিমাইন্ডার সেট করেন, তবে আপনি একটি জিওফেন্স ব্যবহার করেছেন। এই অ্যাপগুলি প্রদত্ত অবস্থানের উপর ভিত্তি করে একটি জিওফেন্স সেট আপ করে এবং আপনার ফোন জিওফেন্সে প্রবেশ করলে আপনাকে সতর্ক করে। জিওফেন্সের ভিতরে বা বাইরে একটি যানবাহন রয়েছে তা জানার অনেক কারণ থাকতে পারে: * আনলোডের প্রস্তুতি - একটি যানবাহন সাইটে পৌঁছেছে এমন একটি বিজ্ঞপ্তি পাওয়া একটি দলকে যানবাহন আনলোড করার জন্য প্রস্তুত হতে দেয়, যানবাহনের অপেক্ষার সময় কমায়। এটি একটি চালককে কম অপেক্ষার সময়ে দিনে আরও বেশি ডেলিভারি করতে সাহায্য করতে পারে। * করের সম্মতি - কিছু দেশ, যেমন নিউজিল্যান্ড, শুধুমাত্র পাবলিক রোডে ডিজেল যানবাহনের ওজনের উপর ভিত্তি করে রোড ট্যাক্স ধার্য করে। জিওফেন্স ব্যবহার করে আপনি পাবলিক রোডে চালিত মাইলেজ ট্র্যাক করতে পারেন, যা খামার বা লগিং এলাকার মতো সাইটে ব্যক্তিগত রোডে চালিত মাইলেজ থেকে আলাদা। * চুরির পর্যবেক্ষণ - যদি একটি যানবাহন শুধুমাত্র একটি নির্দিষ্ট এলাকায় থাকা উচিত যেমন একটি খামারে, এবং এটি জিওফেন্স ছেড়ে যায়, তবে এটি চুরি হয়ে থাকতে পারে। * অবস্থানের সম্মতি - কাজের সাইট, খামার বা কারখানার কিছু অংশ নির্দিষ্ট যানবাহনের জন্য সীমাবদ্ধ হতে পারে, যেমন কৃত্রিম সার এবং কীটনাশক বহনকারী যানবাহনকে জৈব পণ্য উৎপাদনকারী ক্ষেত্র থেকে দূরে রাখা। যদি একটি জিওফেন্স প্রবেশ করা হয়, তবে একটি যানবাহন সম্মতির বাইরে থাকে এবং চালককে সতর্ক করা যেতে পারে। ✅ আপনি কি জিওফেন্সের অন্য কোনো ব্যবহার ভাবতে পারেন? Azure Maps, যা আপনি আগের পাঠে GPS ডেটা প্রদর্শনের জন্য ব্যবহার করেছেন, আপনাকে জিওফেন্স সংজ্ঞায়িত করতে এবং তারপর একটি পয়েন্ট জিওফেন্সের ভিতরে বা বাইরে রয়েছে কিনা তা পরীক্ষা করতে দেয়। ## জিওফেন্স সংজ্ঞায়িত করা জিওফেন্সগুলি GeoJSON ব্যবহার করে সংজ্ঞায়িত করা হয়, যা আগের পাঠে মানচিত্রে যোগ করা পয়েন্টগুলির মতো। এই ক্ষেত্রে, এটি `Point` মানগুলির একটি `FeatureCollection` নয়, এটি একটি `Polygon` ধারণকারী একটি `FeatureCollection`। ```json { "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.13393688201903, 47.63829579223815 ], [ -122.13389128446579, 47.63782047131512 ], [ -122.13240802288054, 47.63783312249837 ], [ -122.13238388299942, 47.63829037035086 ], [ -122.13393688201903, 47.63829579223815 ] ] ] }, "properties": { "geometryId": "1" } } ] } ``` বহুভুজের প্রতিটি পয়েন্ট একটি লংগিচিউড, ল্যাটিচিউড জোড়া হিসাবে একটি অ্যারেতে সংজ্ঞায়িত করা হয়, এবং এই পয়েন্টগুলি একটি অ্যারেতে থাকে যা `coordinates` হিসাবে সেট করা হয়। আগের পাঠে একটি `Point`-এ, `coordinates` একটি অ্যারে ছিল যা ২টি মান, ল্যাটিচিউড এবং লংগিচিউড ধারণ করত, একটি `Polygon`-এর জন্য এটি একটি অ্যারে যা ২টি মান, লংগিচিউড, ল্যাটিচিউড ধারণকারী অ্যারেগুলির অ্যারে। > 💁 মনে রাখবেন, GeoJSON পয়েন্টের জন্য `longitude, latitude` ব্যবহার করে, `latitude, longitude` নয়। বহুভুজের কোঅর্ডিনেটস অ্যারে সর্বদা বহুভুজের পয়েন্টের সংখ্যার চেয়ে ১টি বেশি এন্ট্রি থাকে, যেখানে শেষ এন্ট্রি প্রথমটির মতো হয়, বহুভুজটি বন্ধ করে। উদাহরণস্বরূপ, একটি আয়তক্ষেত্রের জন্য ৫টি পয়েন্ট থাকবে। ![কোঅর্ডিনেটস সহ একটি আয়তক্ষেত্র](../../../../../translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.bn.png) উপরের ছবিতে একটি আয়তক্ষেত্র রয়েছে। বহুভুজের কোঅর্ডিনেটস উপরের-বাম থেকে শুরু হয় ৪৭,-১২২-এ, তারপর ডানদিকে চলে ৪৭,-১২১-এ, তারপর নিচে চলে ৪৬,-১২১-এ, তারপর ডানদিকে চলে ৪৬,-১২২-এ, তারপর শুরু পয়েন্টে ফিরে যায় ৪৭,-১২২-এ। এটি বহুভুজটিকে ৫টি পয়েন্ট দেয় - উপরের-বাম, উপরের-ডান, নিচের-ডান, নিচের-বাম, তারপর উপরের-বাম এটি বন্ধ করতে। ✅ আপনার বাড়ি বা স্কুলের চারপাশে একটি GeoJSON বহুভুজ তৈরি করার চেষ্টা করুন। [GeoJSON.io](https://geojson.io) এর মতো একটি টুল ব্যবহার করুন। ### কাজ - জিওফেন্স সংজ্ঞায়িত করা Azure Maps-এ একটি জিওফেন্স ব্যবহার করতে, প্রথমে এটি আপনার Azure Maps অ্যাকাউন্টে আপলোড করতে হবে। একবার আপলোড হয়ে গেলে, আপনি একটি অনন্য ID পাবেন যা আপনি জিওফেন্সের বিরুদ্ধে একটি পয়েন্ট পরীক্ষা করতে ব্যবহার করতে পারেন। Azure Maps-এ জিওফেন্স আপলোড করতে, আপনাকে ম্যাপের ওয়েব API ব্যবহার করতে হবে। আপনি [curl](https://curl.se) নামক একটি টুল ব্যবহার করে Azure Maps ওয়েব API কল করতে পারেন। > 🎓 Curl হল একটি কমান্ড লাইন টুল যা ওয়েব এন্ডপয়েন্টের বিরুদ্ধে অনুরোধ করতে ব্যবহৃত হয়। 1. যদি আপনি Linux, macOS, বা Windows 10-এর একটি সাম্প্রতিক সংস্করণ ব্যবহার করেন তবে সম্ভবত আপনার curl ইতিমধ্যেই ইনস্টল করা আছে। আপনার টার্মিনাল বা কমান্ড লাইনে নিম্নলিখিতটি চালান: ```sh curl --version ``` যদি curl-এর সংস্করণ তথ্য না দেখায়, তবে আপনাকে এটি [curl ডাউনলোড পৃষ্ঠা](https://curl.se/download.html) থেকে ইনস্টল করতে হবে। > 💁 যদি আপনি Postman-এ অভিজ্ঞ হন, তবে আপনি এটি ব্যবহার করতে পারেন যদি আপনি চান। 1. একটি GeoJSON ফাইল তৈরি করুন যাতে একটি বহুভুজ থাকে। আপনি এটি আপনার GPS সেন্সর ব্যবহার করে পরীক্ষা করবেন, তাই আপনার বর্তমান অবস্থানের চারপাশে একটি বহুভুজ তৈরি করুন। আপনি এটি ম্যানুয়ালি তৈরি করতে পারেন উপরের GeoJSON উদাহরণটি সম্পাদনা করে, অথবা [GeoJSON.io](https://geojson.io) এর মতো একটি টুল ব্যবহার করতে পারেন। GeoJSON-এ একটি `FeatureCollection` থাকতে হবে, যাতে একটি `Feature` থাকবে যার `geometry` টাইপ `Polygon`। আপনাকে **অবশ্যই** `geometry` উপাদানের একই স্তরে একটি `properties` উপাদান যোগ করতে হবে, এবং এতে একটি `geometryId` থাকতে হবে: ```json "properties": { "geometryId": "1" } ``` যদি আপনি [GeoJSON.io](https://geojson.io) ব্যবহার করেন, তবে আপনাকে এই আইটেমটি খালি `properties` উপাদানে ম্যানুয়ালি যোগ করতে হবে, হয় JSON ফাইলটি ডাউনলোড করার পরে, অথবা অ্যাপের JSON সম্পাদক ব্যবহার করে। এই `geometryId` অবশ্যই এই ফাইলের মধ্যে অনন্য হতে হবে। আপনি একই GeoJSON ফাইলের `FeatureCollection`-এ একাধিক `Features` হিসাবে একাধিক জিওফেন্স আপলোড করতে পারেন, যতক্ষণ না প্রতিটি একটির একটি ভিন্ন `geometryId` থাকে। যদি বহুভুজগুলি একটি ভিন্ন সময়ে একটি ভিন্ন ফাইল থেকে আপলোড করা হয় তবে তাদের একই `geometryId` থাকতে পারে। 1. এই ফাইলটি `geofence.json` নামে সংরক্ষণ করুন এবং আপনার টার্মিনাল বা কনসোলে যেখানে এটি সংরক্ষিত হয়েছে সেখানে যান। 1. নিম্নলিখিত curl কমান্ডটি চালান GeoFence তৈরি করতে: ```sh curl --request POST 'https://atlas.microsoft.com/mapData/upload?api-version=1.0&dataFormat=geojson&subscription-key=' \ --header 'Content-Type: application/json' \ --include \ --data @geofence.json ``` URL-এ ``-এর জায়গায় আপনার Azure Maps অ্যাকাউন্টের API কীটি প্রতিস্থাপন করুন। URLটি `https://atlas.microsoft.com/mapData/upload` API-এর মাধ্যমে মানচিত্রের ডেটা আপলোড করতে ব্যবহৃত হয়। কলটিতে একটি `api-version` প্যারামিটার রয়েছে যা কোন Azure Maps API ব্যবহার করতে হবে তা নির্দিষ্ট করে, এটি API সময়ের সাথে পরিবর্তন করতে দেয় কিন্তু পিছনের সামঞ্জস্য বজায় রাখে। আপলোড করা ডেটার ফরম্যাট `geojson` হিসাবে সেট করা হয়। এটি POST অনুরোধটি আপলোড API-তে চালাবে এবং প্রতিক্রিয়া হেডারের একটি তালিকা ফেরত দেবে যার মধ্যে একটি হেডার `location` নামে থাকবে। ```output content-type: application/json location: https://us.atlas.microsoft.com/mapData/operations/1560ced6-3a80-46f2-84b2-5b1531820eab?api-version=1.0 x-ms-azuremaps-region: West US 2 x-content-type-options: nosniff strict-transport-security: max-age=31536000; includeSubDomains x-cache: CONFIG_NOCACHE date: Sat, 22 May 2021 21:34:57 GMT content-length: 0 ``` > 🎓 একটি ওয়েব এন্ডপয়েন্ট কল করার সময়, আপনি কলটিতে প্যারামিটার পাস করতে পারেন একটি `?` যোগ করে এবং কী মান জোড়া হিসাবে `key=value` লিখে, কী মান জোড়াগুলিকে একটি `&` দিয়ে আলাদা করে। 1. Azure Maps এটি অবিলম্বে প্রক্রিয়া করে না, তাই আপনাকে আপলোড অনুরোধটি শেষ হয়েছে কিনা তা দেখতে `location` হেডারে দেওয়া URL ব্যবহার করে পরীক্ষা করতে হবে। এই অবস্থান URL-এ একটি GET অনুরোধ করুন স্ট্যাটাস দেখতে। আপনাকে আপনার সাবস্ক্রিপশন কীটি `location` URL-এর শেষে যোগ করতে হবে `&subscription-key=` যোগ করে, ``-এর জায়গায় আপনার Azure Maps অ্যাকাউন্টের API কীটি প্রতিস্থাপন করে। নিম্নলিখিত কমান্ডটি চালান: ```sh curl --request GET '&subscription-key=' ``` ``-এর জায়গায় `location` হেডারের মান এবং ``-এর জায়গায় আপনার Azure Maps অ্যাকাউন্টের API কীটি প্রতিস্থাপন করুন। 1. প্রতিক্রিয়ায় `status` এর মান পরীক্ষা করুন। যদি এটি `Succeeded` না হয়, তবে এক মিনিট অপেক্ষা করুন এবং আবার চেষ্টা করুন। 1. একবার স্ট্যাটাস `Succeeded` ফিরে এলে, প্রতিক্রিয়ার `resourceLocation` দেখুন। এটি GeoJSON অবজেক্টের অনন্য ID (UDID) এর বিশদ ধারণ করে। UDID হল `metadata/`-এর পরে এবং `api-version` অন্তর্ভুক্ত না করে মান। উদাহরণস্বরূপ, যদি `resourceLocation` হয়: ```json { "resourceLocation": "https://us.atlas.microsoft.com/mapData/metadata/7c3776eb-da87-4c52-ae83-caadf980323a?api-version=1.0" } ``` তাহলে UDID হবে `7c3776eb-da87-4c52-ae83-caadf980323a`। এই UDID-এর একটি কপি রাখুন কারণ আপনি এটি জিওফেন্স পরীক্ষা করতে ব্যবহার করবেন। ## জিওফেন্সের বিরুদ্ধে পয়েন্ট পরীক্ষা করা একবার বহুভুজটি Azure Maps-এ আপলোড হয়ে গেলে, আপনি একটি পয়েন্ট পরীক্ষা করতে পারেন এটি জিওফেন্সের ভিতরে বা বাইরে রয়েছে কিনা তা দেখতে। আপনি এটি একটি ওয়েব API অনুরোধ করে করেন, জিওফেন্সের UDID এবং পরীক্ষা করার জন্য পয়েন্টের ল্যাটিচিউড এবং লংগিচিউড পাস করে। এই অনুরোধটি করার সময়, আপনি একটি `searchBuffer` নামক একটি মানও পাস করতে পারেন। এটি Maps API-কে কতটা সঠিক হতে হবে তা বলে যখন ফলাফল ফেরত দেয়। এর কারণ হল GPS পুরোপুরি সঠিক নয়, এবং কখনও কখনও অবস্থান মিটার বা তার বেশি দ্বারা ভুল হতে পারে। `searchBuffer`-এর ডিফল্ট মান ৫০ মিটার, তবে আপনি ০ মিটার থেকে ৫০০ মিটার পর্যন্ত মান সেট করতে পারেন। API কল থেকে ফলাফল ফেরত দেওয়ার সময়, ফলাফলের একটি অংশ হল `distance`, যা জিওফেন্সের প্রান্তের নিকটতম পয়েন্টে পরিমাপ করা হয়, একটি ধনাত্মক মান যদি পয়েন্টটি জিওফেন্সের বাইরে থাকে, এবং ঋণাত্মক যদি এটি জিওফেন্সের ভিতরে থাকে। যদি এই দূরত্বটি `searchBuffer`-এর চেয়ে কম হয়, তবে প্রকৃত দূরত্ব মিটারে ফেরত দেওয়া হয়, অন্যথায় মানটি ৯৯৯ বা -৯৯৯ হয়। ৯৯৯ মানে পয়েন্টটি জিওফেন্সের বাইরে `searchBuffer`-এর চেয়ে বেশি, -৯৯৯ মানে এটি জিওফেন্সের ভিতরে `searchBuffer`-এর চেয়ে বেশি। ![জিওফেন্সের চারপাশে ৫০ মিটার সার্চ বাফার](../../../../../translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.bn.png) উপরের ছবিতে, জিওফেন্সের চারপাশে একটি ৫০ মিটার সার্চ বাফার রয়েছে। * জিওফেন্সের কেন্দ্রে একটি পয়েন্ট, সার্চ বাফারের ভিতরে ভালভাবে, **-৯৯৯** দূরত্ব রয়েছে। * সার্চ বাফারের বাইরে একটি পয়েন্টের দূরত্ব **৯৯৯**। * জিওফেন্সের ভিতরে এবং সার্চ বাফারের ভিতরে একটি পয়েন্ট, জিওফেন্স থেকে ৬ মিটার দূরে, **৬ মিটার** দূরত্ব রয়েছে। * জিওফেন্সের বাইরে এবং সার্চ বাফারের ভিতরে একটি পয়েন্ট, জিওফেন্স থেকে ৩৯ মিটার দূরে, **৩৯ মিটার** দূরত্ব রয়েছে। জিওফেন্সের প্রান্তের দূরত্ব জানা গুরুত্বপূর্ণ, এবং যানবাহনের অবস্থানের উপর ভিত্তি করে সিদ্ধান্ত নেওয়ার সময় অন্যান্য তথ্য যেমন অন্যান্য GPS রিডিং, গতি এবং রাস্তার ডেটার সাথে এটি একত্রিত করা গুরুত্বপূর্ণ। উদাহরণস্বরূপ, কল্পনা করুন GPS রিডিংগুলি দেখাচ্ছে যে একটি যানবাহন একটি রাস্তা ধরে চলছিল যা শেষ পর্যন্ত একটি জিওফেন্সের পাশে চলে। যদি একটি একক GPS মান ভুল হয় এবং যানবাহনটিকে জিওফেন্সের ভিতরে রাখে, যদিও সেখানে কোনো যানবাহন প্রবেশের পথ নেই, তবে এটি উপেক্ষা করা যেতে পারে। ![Microsoft ক্যাম্পাসের পাশ দিয়ে ৫২০-এ একটি যানবাহন পাস করার একটি GPS ট্রেইল, রাস্তার সাথে GPS রিডিংগুলি ছাড়া একটি ক্যাম্পাসে, একটি জিওফেন্সের ভিতরে](../../../../../translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.bn.png) উপরে চিত্রে, মাইক্রোসফট ক্যাম্পাসের একটি অংশে একটি জিওফেন্স দেখানো হয়েছে। লাল রেখাটি ৫২০ বরাবর একটি ট্রাকের চলাচল নির্দেশ করে, যেখানে বৃত্তগুলি GPS রিডিংস দেখায়। বেশিরভাগ রিডিং সঠিক এবং ৫২০ বরাবর রয়েছে, তবে একটি ভুল রিডিং জিওফেন্সের ভিতরে রয়েছে। এই রিডিংটি সঠিক হওয়ার কোনো উপায় নেই - ট্রাকটি হঠাৎ করে ৫২০ থেকে ক্যাম্পাসে প্রবেশ করে আবার ৫২০-তে ফিরে যেতে পারে না। জিওফেন্স পরীক্ষা করার কোডটি ফলাফলের উপর কাজ করার আগে পূর্ববর্তী রিডিংস বিবেচনা করতে হবে। ✅ GPS রিডিং সঠিক বলে বিবেচনা করা যেতে পারে কিনা তা পরীক্ষা করার জন্য আপনার কী অতিরিক্ত ডেটা প্রয়োজন? ### টাস্ক - জিওফেন্সের বিরুদ্ধে পয়েন্ট পরীক্ষা করুন 1. ওয়েব API কুয়েরির জন্য URL তৈরি করে শুরু করুন। ফরম্যাটটি হলো: ```output https://atlas.microsoft.com/spatial/geofence/json?api-version=1.0&deviceId=gps-sensor&subscription-key=&udid=&lat=&lon= ``` ``-এর জায়গায় আপনার Azure Maps অ্যাকাউন্টের API কী বসান। ``-এর জায়গায় পূর্ববর্তী টাস্ক থেকে জিওফেন্সের UDID বসান। `` এবং ``-এর জায়গায় আপনি যে অক্ষাংশ এবং দ্রাঘিমাংশ পরীক্ষা করতে চান তা বসান। এই URL `https://atlas.microsoft.com/spatial/geofence/json` API ব্যবহার করে GeoJSON দিয়ে সংজ্ঞায়িত একটি জিওফেন্স কুয়েরি করে। এটি `1.0` API ভার্সনকে লক্ষ্য করে। `deviceId` প্যারামিটারটি প্রয়োজনীয় এবং এটি সেই ডিভাইসের নাম হওয়া উচিত যেখান থেকে অক্ষাংশ এবং দ্রাঘিমাংশ এসেছে। ডিফল্ট সার্চ বাফার ৫০ মিটার, এবং আপনি `searchBuffer=` প্যারামিটার যোগ করে এটি পরিবর্তন করতে পারেন, যেখানে `` মিটারে সার্চ বাফার দূরত্ব সেট করুন, ০ থেকে ৫০০ পর্যন্ত। 1. এই URL-এ GET অনুরোধ করতে curl ব্যবহার করুন: ```sh curl --request GET '' ``` > 💁 যদি আপনি `BadRequest` রেসপন্স কোড পান, এবং ত্রুটি হয়: > > ```output > Invalid GeoJSON: All feature properties should contain a geometryId, which is used for identifying the geofence. > ``` > > তাহলে আপনার GeoJSON-এ `properties` সেকশনটি `geometryId` সহ অনুপস্থিত। আপনাকে আপনার GeoJSON ঠিক করতে হবে, তারপর উপরের ধাপগুলি পুনরায় সম্পাদন করে নতুন UDID পেতে হবে। 1. রেসপন্সে `geometries`-এর একটি তালিকা থাকবে, GeoJSON ব্যবহার করে তৈরি জিওফেন্সে সংজ্ঞায়িত প্রতিটি পলিগনের জন্য একটি। প্রতিটি জিওমেট্রির ৩টি গুরুত্বপূর্ণ ক্ষেত্র রয়েছে: `distance`, `nearestLat` এবং `nearestLon`। ```output { "geometries": [ { "deviceId": "gps-sensor", "udId": "7c3776eb-da87-4c52-ae83-caadf980323a", "geometryId": "1", "distance": 999.0, "nearestLat": 47.645875, "nearestLon": -122.142713 } ], "expiredGeofenceGeometryId": [], "invalidPeriodGeofenceGeometryId": [] } ``` * `nearestLat` এবং `nearestLon` হলো জিওফেন্সের প্রান্তে একটি পয়েন্টের অক্ষাংশ এবং দ্রাঘিমাংশ যা পরীক্ষিত অবস্থানের সবচেয়ে কাছাকাছি। * `distance` হলো পরীক্ষিত অবস্থান থেকে জিওফেন্সের প্রান্তের সবচেয়ে কাছাকাছি পয়েন্ট পর্যন্ত দূরত্ব। নেতিবাচক সংখ্যা মানে জিওফেন্সের ভিতরে, ইতিবাচক মানে বাইরে। এই মানটি ৫০ (ডিফল্ট সার্চ বাফার) বা ৯৯৯-এর কম হবে। 1. জিওফেন্সের ভিতরে এবং বাইরে অবস্থান নিয়ে এটি একাধিকবার পুনরাবৃত্তি করুন। ## সার্ভারলেস কোড থেকে জিওফেন্স ব্যবহার করুন আপনি এখন আপনার Functions অ্যাপে একটি নতুন ট্রিগার যোগ করতে পারেন যা IoT Hub GPS ইভেন্ট ডেটাকে জিওফেন্সের বিরুদ্ধে পরীক্ষা করবে। ### কনজিউমার গ্রুপ পূর্ববর্তী পাঠ থেকে আপনি মনে করতে পারেন, IoT Hub আপনাকে হাবে প্রাপ্ত কিন্তু প্রক্রিয়াকৃত না হওয়া ইভেন্টগুলি পুনরায় চালানোর অনুমতি দেয়। কিন্তু যদি একাধিক ট্রিগার সংযুক্ত হয়, তখন কী হবে? এটি কীভাবে জানবে কোনটি কোন ইভেন্ট প্রক্রিয়াকরণ করেছে? উত্তর হলো এটি জানে না! পরিবর্তে আপনি ইভেন্টগুলি পড়ার জন্য একাধিক পৃথক সংযোগ সংজ্ঞায়িত করতে পারেন, এবং প্রতিটি অপ্রক্রিয়াকৃত বার্তাগুলির পুনরায় চালানোর পরিচালনা করতে পারে। এগুলিকে *কনজিউমার গ্রুপ* বলা হয়। যখন আপনি এন্ডপয়েন্টে সংযোগ করেন, তখন আপনি কোন কনজিউমার গ্রুপে সংযোগ করতে চান তা নির্দিষ্ট করতে পারেন। আপনার অ্যাপ্লিকেশনের প্রতিটি কম্পোনেন্ট একটি ভিন্ন কনজিউমার গ্রুপে সংযোগ করবে। ![একটি IoT Hub যেখানে ৩টি কনজিউমার গ্রুপ একই বার্তাগুলি ৩টি ভিন্ন ফাংশন অ্যাপে বিতরণ করছে](../../../../../translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.bn.png) তত্ত্বগতভাবে প্রতিটি কনজিউমার গ্রুপে ৫টি অ্যাপ্লিকেশন সংযোগ করতে পারে, এবং তারা বার্তাগুলি পৌঁছানোর সময় বার্তাগুলি পাবে। প্রতিটি কনজিউমার গ্রুপে শুধুমাত্র একটি অ্যাপ্লিকেশন অ্যাক্সেস করা সর্বোত্তম অনুশীলন যাতে ডুপ্লিকেট বার্তা প্রক্রিয়াকরণ এড়ানো যায় এবং পুনরায় চালানোর সময় সমস্ত কিউ করা বার্তা সঠিকভাবে প্রক্রিয়াকৃত হয়। উদাহরণস্বরূপ, যদি আপনি আপনার Functions অ্যাপটি লোকালভাবে চালু করেন এবং এটি ক্লাউডে চালাচ্ছেন, তারা উভয়ই বার্তাগুলি প্রক্রিয়াকরণ করবে, যার ফলে স্টোরেজ অ্যাকাউন্টে ডুপ্লিকেট ব্লব সংরক্ষণ হবে। আপনি যদি পূর্ববর্তী পাঠে তৈরি IoT Hub ট্রিগারের `function.json` ফাইলটি পর্যালোচনা করেন, তাহলে আপনি ইভেন্ট হাব ট্রিগার বাইন্ডিং সেকশনে কনজিউমার গ্রুপটি দেখতে পাবেন: ```json "consumerGroup": "$Default" ``` যখন আপনি একটি IoT Hub তৈরি করেন, তখন আপনি ডিফল্টভাবে `$Default` কনজিউমার গ্রুপটি পান। যদি আপনি একটি অতিরিক্ত ট্রিগার যোগ করতে চান, তাহলে আপনি এটি একটি নতুন কনজিউমার গ্রুপ ব্যবহার করে যোগ করতে পারেন। > 💁 এই পাঠে, আপনি GPS ডেটা সংরক্ষণ করতে ব্যবহৃত ফাংশন থেকে আলাদা একটি ফাংশন ব্যবহার করবেন জিওফেন্স পরীক্ষা করার জন্য। এটি কনজিউমার গ্রুপ ব্যবহার করার এবং কোডটি আলাদা করার উপায় দেখানোর জন্য যাতে এটি পড়া এবং বোঝা সহজ হয়। একটি প্রোডাকশন অ্যাপ্লিকেশনে আপনি এটি অনেকভাবে স্থাপত্য করতে পারেন - উভয়কে একটি ফাংশনে রাখা, স্টোরেজ অ্যাকাউন্টে একটি ট্রিগার ব্যবহার করে জিওফেন্স পরীক্ষা করার জন্য একটি ফাংশন চালানো, বা একাধিক ফাংশন ব্যবহার করা। এখানে কোনো 'সঠিক উপায়' নেই, এটি আপনার অ্যাপ্লিকেশনের বাকি অংশ এবং আপনার প্রয়োজনের উপর নির্ভর করে। ### টাস্ক - একটি নতুন কনজিউমার গ্রুপ তৈরি করুন 1. আপনার IoT Hub-এর জন্য `geofence` নামে একটি নতুন কনজিউমার গ্রুপ তৈরি করতে নিম্নলিখিত কমান্ডটি চালান: ```sh az iot hub consumer-group create --name geofence \ --hub-name ``` ``-এর জায়গায় আপনার IoT Hub-এর নাম বসান। 1. যদি আপনি একটি IoT Hub-এর সমস্ত কনজিউমার গ্রুপ দেখতে চান, তাহলে নিম্নলিখিত কমান্ডটি চালান: ```sh az iot hub consumer-group list --output table \ --hub-name ``` ``-এর জায়গায় আপনার IoT Hub-এর নাম বসান। এটি সমস্ত কনজিউমার গ্রুপের তালিকা দেখাবে। ```output Name ResourceGroup -------- --------------- $Default gps-sensor geofence gps-sensor ``` > 💁 আপনি যদি পূর্ববর্তী পাঠে IoT Hub ইভেন্ট মনিটর চালান, এটি `$Default` কনজিউমার গ্রুপে সংযুক্ত হয়েছিল। এ কারণেই আপনি ইভেন্ট মনিটর এবং একটি ইভেন্ট ট্রিগার চালাতে পারেন না। যদি আপনি উভয় চালাতে চান, তাহলে আপনি আপনার সমস্ত ফাংশন অ্যাপের জন্য অন্যান্য কনজিউমার গ্রুপ ব্যবহার করতে পারেন এবং `$Default` ইভেন্ট মনিটরের জন্য রেখে দিতে পারেন। ### টাস্ক - একটি নতুন IoT Hub ট্রিগার তৈরি করুন 1. পূর্ববর্তী পাঠে তৈরি `gps-trigger` ফাংশন অ্যাপে একটি নতুন IoT Hub ইভেন্ট ট্রিগার যোগ করুন। এই ফাংশনটির নাম দিন `geofence-trigger`। > ⚠️ [প্রজেক্ট ২, পাঠ ৫ থেকে IoT Hub ইভেন্ট ট্রিগার তৈরি করার নির্দেশনা প্রয়োজন হলে](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-an-iot-hub-event-trigger) আপনি এটি দেখতে পারেন। 1. `function.json` ফাইলে IoT Hub সংযোগ স্ট্রিং কনফিগার করুন। `local.settings.json` সমস্ত ট্রিগারের মধ্যে শেয়ার করা হয়। 1. `function.json` ফাইলে `consumerGroup`-এর মান আপডেট করুন যাতে এটি নতুন `geofence` কনজিউমার গ্রুপকে উল্লেখ করে: ```json "consumerGroup": "geofence" ``` 1. এই ট্রিগারে আপনার Azure Maps অ্যাকাউন্টের সাবস্ক্রিপশন কী ব্যবহার করতে হবে, তাই `local.settings.json` ফাইলে `MAPS_KEY` নামে একটি নতুন এন্ট্রি যোগ করুন। 1. নিশ্চিত করুন যে এটি সংযোগ করছে এবং বার্তাগুলি প্রক্রিয়াকরণ করছে তা নিশ্চিত করতে Functions অ্যাপ চালান। পূর্ববর্তী পাঠের `iot-hub-trigger`-ও চলবে এবং স্টোরেজে ব্লব আপলোড করবে। > ব্লব স্টোরেজে ডুপ্লিকেট GPS রিডিং এড়াতে, আপনি ক্লাউডে চলমান Functions অ্যাপটি বন্ধ করতে পারেন। এটি করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন: > > ```sh > az functionapp stop --resource-group gps-sensor \ > --name > ``` > > ``-এর জায়গায় আপনার Functions অ্যাপের নাম বসান। > > আপনি পরে এটি নিম্নলিখিত কমান্ডটি ব্যবহার করে পুনরায় চালু করতে পারেন: > > ```sh > az functionapp start --resource-group gps-sensor \ > --name > ``` > > ``-এর জায়গায় আপনার Functions অ্যাপের নাম বসান। ### টাস্ক - ট্রিগার থেকে জিওফেন্স পরীক্ষা করুন এই পাঠের শুরুতে আপনি একটি পয়েন্ট জিওফেন্সের ভিতরে বা বাইরে রয়েছে কিনা তা দেখতে curl ব্যবহার করে একটি জিওফেন্স কুয়েরি করেছিলেন। আপনি আপনার ট্রিগারের ভিতর থেকে অনুরূপ ওয়েব অনুরোধ করতে পারেন। 1. জিওফেন্স কুয়েরি করতে, এর UDID প্রয়োজন। `local.settings.json` ফাইলে `GEOFENCE_UDID` নামে একটি নতুন এন্ট্রি যোগ করুন। 1. নতুন `geofence-trigger` ট্রিগারের `__init__.py` ফাইলটি খুলুন। 1. ফাইলের শীর্ষে নিম্নলিখিত ইমপোর্ট যোগ করুন: ```python import json import os import requests ``` `requests` প্যাকেজটি আপনাকে ওয়েব API কল করতে দেয়। Azure Maps-এর কোনো Python SDK নেই, আপনাকে Python কোড থেকে এটি ব্যবহার করতে ওয়েব API কল করতে হবে। 1. Maps সাবস্ক্রিপশন কী পেতে `main` মেথডের শুরুতে নিম্নলিখিত ২টি লাইন যোগ করুন: ```python maps_key = os.environ['MAPS_KEY'] geofence_udid = os.environ['GEOFENCE_UDID'] ``` 1. `for event in events` লুপের ভিতরে, প্রতিটি ইভেন্ট থেকে অক্ষাংশ এবং দ্রাঘিমাংশ পেতে নিম্নলিখিত কোড যোগ করুন: ```python event_body = json.loads(event.get_body().decode('utf-8')) lat = event_body['gps']['lat'] lon = event_body['gps']['lon'] ``` এই কোডটি ইভেন্ট বডি থেকে JSON-কে একটি ডিকশনারিতে রূপান্তর করে, তারপর `gps` ফিল্ড থেকে `lat` এবং `lon` বের করে। 1. `requests` ব্যবহার করার সময়, curl দিয়ে দীর্ঘ URL তৈরি করার পরিবর্তে, আপনি শুধুমাত্র URL অংশটি ব্যবহার করতে পারেন এবং প্যারামিটারগুলি একটি ডিকশনারি হিসাবে পাস করতে পারেন। কল করার URL সংজ্ঞায়িত করতে এবং প্যারামিটারগুলি কনফিগার করতে নিম্নলিখিত কোড যোগ করুন: ```python url = 'https://atlas.microsoft.com/spatial/geofence/json' params = { 'api-version': 1.0, 'deviceId': 'gps-sensor', 'subscription-key': maps_key, 'udid' : geofence_udid, 'lat' : lat, 'lon' : lon } ``` `params` ডিকশনারির আইটেমগুলি সেই কী-ভ্যালু পেয়ারগুলির সাথে মিলে যাবে যা আপনি curl ব্যবহার করে ওয়েব API কল করার সময় ব্যবহার করেছিলেন। 1. ওয়েব API কল করতে নিম্নলিখিত লাইনগুলি যোগ করুন: ```python response = requests.get(url, params=params) response_body = json.loads(response.text) ``` এটি প্যারামিটার সহ URL-এ কল করে এবং একটি রেসপন্স অবজেক্ট ফেরত পায়। 1. এর নিচে নিম্নলিখিত কোড যোগ করুন: ```python distance = response_body['geometries'][0]['distance'] if distance == 999: logging.info('Point is outside geofence') elif distance > 0: logging.info(f'Point is just outside geofence by a distance of {distance}m') elif distance == -999: logging.info(f'Point is inside geofence') else: logging.info(f'Point is just inside geofence by a distance of {distance}m') ``` এই কোডটি ১টি জিওমেট্রি ধরে এবং সেই একক জিওমেট্রি থেকে দূরত্ব বের করে। এটি দূরত্বের উপর ভিত্তি করে বিভিন্ন বার্তা লগ করে। 1. এই কোডটি চালান। লগিং আউটপুটে আপনি দেখতে পাবেন GPS কোঅর্ডিনেটস জিওফেন্সের ভিতরে বা বাইরে রয়েছে কিনা, এবং যদি পয়েন্টটি ৫০ মিটারের মধ্যে থাকে তবে একটি দূরত্ব দেখাবে। আপনার GPS সেন্সরের অবস্থানের উপর ভিত্তি করে বিভিন্ন জিওফেন্স দিয়ে এই কোডটি চেষ্টা করুন, সেন্সরটি সরানোর চেষ্টা করুন (যেমন মোবাইল ফোন থেকে WiFi-তে সংযুক্ত বা ভার্চুয়াল IoT ডিভাইসে বিভিন্ন কোঅর্ডিনেটস দিয়ে) এটি পরিবর্তন দেখতে। 1. যখন আপনি প্রস্তুত, এই কোডটি ক্লাউডে আপনার Functions অ্যাপে ডিপ্লয় করুন। নতুন অ্যাপ্লিকেশন সেটিংস আপলোড করতে ভুলবেন না। > ⚠️ [প্রজেক্ট ২, পাঠ ৫ থেকে অ্যাপ্লিকেশন সেটিংস আপলোড করার নির্দেশনা প্রয়োজন হলে](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#task---upload-your-application-settings) আপনি এটি দেখতে পারেন। > ⚠️ [প্রজেক্ট ২, পাঠ ৫ থেকে Functions অ্যাপ ডিপ্লয় করার নির্দেশনা প্রয়োজন হলে](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#task---deploy-your-functions-app-to-the-cloud) আপনি এটি দেখতে পারেন। > 💁 আপনি এই কোডটি [code/functions](../../../../../3-transport/lessons/4-geofences/code/functions) ফোল্ডারে খুঁজে পেতে পারেন। --- ## 🚀 চ্যালেঞ্জ এই পাঠে আপনি একটি পলিগন সহ একটি GeoJSON ফাইল ব্যবহার করে একটি জিওফেন্স যোগ করেছেন। আপনি একাধিক পলিগন একই সময়ে আপলোড করতে পারেন, যতক্ষণ না তাদের `properties` সেকশনে `geometryId` মানগুলি আলাদা থাকে। একাধিক পলিগন সহ একটি GeoJSON ফাইল আপলোড করার চেষ্টা করুন এবং GPS কোঅর্ডিনেটস কোন পলিগনের সবচেয়ে কাছাকাছি বা ভিতরে রয়েছে তা খুঁজে বের করতে আপনার কোডটি সামঞ্জস্য করুন। ## পোস্ট-লেকচার কুইজ [পোস্ট-লেকচার কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/28) ## পর্যালোচনা ও স্ব-অধ্যয়ন * জিওফেন্স এবং এর কিছু ব্যবহার সম্পর্কে আরও পড়ুন [উইকিপিডিয়ার জিওফেন্সিং পেজে](https://en.wikipedia.org/wiki/Geo-fence)। * Azure Maps জিওফেন্সিং API সম্পর্কে আরও পড়ুন [Microsoft Azure Maps Spatial - Get Geofence ডকুমেন্টেশনে](https://docs.microsoft.com/rest/api/maps/spatial/getgeofence?WT.mc_id=academic-17441-jabenn)। * কনজিউমার গ্রুপ সম্পর্কে আরও পড়ুন [Microsoft ডকসের Azure Event Hubs-এর বৈশিষ্ট্য এবং পরিভাষা - ইভেন্ট কনজিউমার ডকুমেন্টেশনে](https://docs.microsoft.com/azure/event-hubs/event-hubs-features?WT.mc_id=academic-17441-jabenn#event-consumers)। ## অ্যাসাইনমেন্ট [Twilio ব্যবহার করে নোটিফিকেশন পাঠান](assignment.md) --- **দাবিত্যাগ**: এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতা নিশ্চিত করার চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।