|
4 weeks ago | |
---|---|---|
.. | ||
README.md | 4 weeks ago | |
assignment.md | 4 weeks ago |
README.md
Геозоне
Скица од Нитије Нарасимхан. Кликните на слику за већу верзију.
Овај видео пружа преглед геозона и како их користити у Azure Maps-у, теме које ће бити обрађене у овој лекцији:
🎥 Кликните на слику изнад да бисте погледали видео
Квиз пре предавања
Увод
У последње три лекције користили сте IoT за праћење камиона који превозе ваше производе са фарме до центра за обраду. Сакупљали сте GPS податке, слали их у облак ради чувања и визуализовали их на мапи. Следећи корак у повећању ефикасности вашег ланца снабдевања је добијање обавештења када је камион близу доласка у центар за обраду, како би екипа за истовар била спремна са виљушкарима и другом опремом чим возило стигне. На овај начин могу брзо истоварити, а ви не плаћате за чекање камиона и возача.
У овој лекцији ћете научити о геозонама - дефинисаним геопросторним регионима, као што је подручје унутар 2 км вожње од центра за обраду, и како тестирати да ли су GPS координате унутар или ван геозоне, како бисте могли да видите да ли је ваш GPS сензор стигао или напустио одређено подручје.
У овој лекцији ћемо обрадити:
- Шта су геозоне
- Дефинисање геозоне
- Тестирање тачака у односу на геозону
- Коришћење геозона из серверлес кода
🗑 Ово је последња лекција у овом пројекту, па након што завршите ову лекцију и задатак, не заборавите да очистите своје облачне услуге. Биће вам потребне услуге за завршетак задатка, па се уверите да сте прво завршили задатак.
Погледајте водич за чишћење пројекта ако су вам потребна упутства како то да урадите.
Шта су геозоне
Геозона је виртуелни периметар за стварни географски регион. Геозоне могу бити кругови дефинисани као тачка и радијус (на пример круг ширине 100м око зграде), или полигони који покривају подручје као што је школска зона, границе града или универзитетски или пословни кампус.
💁 Можда сте већ користили геозоне, а да тога нисте били свесни. Ако сте поставили подсетник у апликацији iOS Reminders или Google Keep на основу локације, користили сте геозону. Ове апликације постављају геозону на основу дате локације и обавештавају вас када ваш телефон уђе у геозону.
Постоји много разлога зашто бисте желели да знате да ли је возило унутар или ван геозоне:
- Припрема за истовар - добијање обавештења да је возило стигло на локацију омогућава екипи да се припреми за истовар возила, чиме се смањује време чекања возила. Ово омогућава возачу да обави више испорука у току дана са мање времена чекања.
- Пореска усклађеност - неке земље, као што је Нови Зеланд, наплаћују путарину за дизел возила на основу тежине возила само када се возе јавним путевима. Коришћење геозона омогућава вам да пратите пређену километражу на јавним путевима у односу на приватне путеве на локацијама као што су фарме или шумска подручја.
- Надзор крађе - ако возило треба да остане само у одређеном подручју, као што је фарма, а напусти геозону, можда је украдено.
- Усклађеност са локацијом - неки делови радилишта, фарме или фабрике могу бити забрањени за одређена возила, као што је држање возила која превозе вештачка ђубрива и пестициде даље од поља са органским производима. Ако се уђе у геозону, возило је ван усклађености и возач може бити обавештен.
✅ Можете ли смислити друге начине коришћења геозона?
Azure Maps, услуга коју сте користили у претходној лекцији за визуализацију GPS података, омогућава вам да дефинишете геозоне, а затим тестирате да ли је тачка унутар или ван геозоне.
Дефинисање геозоне
Геозоне се дефинишу помоћу GeoJSON-а, исто као и тачке које су додате на мапу у претходној лекцији. У овом случају, уместо да буду FeatureCollection
са Point
вредностима, то је FeatureCollection
који садржи Polygon
.
{
"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
је био низ који садржи 2 вредности, ширину и дужину, док је за Polygon
то низ низова који садрже 2 вредности, дужину и ширину.
💁 Запамтите, GeoJSON користи
дужина, ширина
за тачке, а неширина, дужина
Низ координата полигона увек има 1 унос више од броја тачака на полигону, при чему је последњи унос исти као и први, затварајући полигон. На пример, за правоугаоник би било 5 тачака.
На слици изнад налази се правоугаоник. Координате полигона почињу у горњем левом углу на 47,-122, затим се крећу десно до 47,-121, затим доле до 46,-121, затим лево до 46,-122, а затим назад горе до почетне тачке на 47,-122. Ово даје полигону 5 тачака - горњи леви, горњи десни, доњи десни, доњи леви, а затим горњи леви да га затвори.
✅ Покушајте да направите GeoJSON полигон око свог дома или школе. Користите алат као што је GeoJSON.io.
Задатак - дефинисање геозоне
Да бисте користили геозону у Azure Maps-у, прво је морате отпремити на свој Azure Maps налог. Када се отпреми, добићете јединствени ID који можете користити за тестирање тачке у односу на геозону. Да бисте отпремили геозоне на Azure Maps, потребно је да користите веб API за мапе. Можете позвати Azure Maps веб API помоћу алата као што је curl.
🎓 Curl је алат командне линије за прављење захтева према веб крајњим тачкама
-
Ако користите Linux, macOS или новију верзију Windows 10, вероватно већ имате инсталиран curl. Покрените следеће из свог терминала или командне линије да бисте проверили:
curl --version
Ако не видите информације о верзији за curl, мораћете да га инсталирате са curl странице за преузимање.
💁 Ако сте искусни са Postman-ом, можете га користити уместо тога ако вам је лакше.
-
Направите GeoJSON датотеку која садржи полигон. Тестираћете ово помоћу свог GPS сензора, па направите полигон око своје тренутне локације. Можете га направити ручно уређивањем GeoJSON примера датог изнад или користити алат као што је GeoJSON.io.
GeoJSON мора да садржи
FeatureCollection
, који садржиFeature
саgeometry
типаPolygon
.Такође МОРА да додате елемент
properties
на истом нивоу као и елементgeometry
, а он мора да садржиgeometryId
:"properties": { "geometryId": "1" }
Ако користите GeoJSON.io, мораћете ручно да додате овај елемент у празан
properties
, било након преузимања JSON датотеке или у JSON уређивачу у апликацији.Овај
geometryId
мора бити јединствен у овој датотеци. Можете отпремити више геозона као вишеFeatures
уFeatureCollection
у истој GeoJSON датотеци, све док свака има другачијиgeometryId
. Полигони могу имати истиgeometryId
ако су отпремљени из различитих датотека у различито време. -
Сачувајте ову датотеку као
geofence.json
и идите до места где је сачувана у вашем терминалу или конзоли. -
Покрените следећу curl команду да бисте креирали геозону:
curl --request POST 'https://atlas.microsoft.com/mapData/upload?api-version=1.0&dataFormat=geojson&subscription-key=<subscription_key>' \ --header 'Content-Type: application/json' \ --include \ --data @geofence.json
Замените
<subscription_key>
у URL-у са API кључем за ваш Azure Maps налог.URL се користи за отпремање података о мапама преко API-ја
https://atlas.microsoft.com/mapData/upload
. Позив укључује параметарapi-version
да би се одредило који Azure Maps API да се користи, што омогућава API-ју да се мења током времена уз одржавање уназад компатибилности. Формат података који се отпрема је постављен наgeojson
.Ово ће покренути POST захтев за API за отпремање и вратити листу заглавља одговора која укључују заглавље под називом
location
.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
, раздвајајући парове кључ-вредност са&
. -
Azure Maps не обрађује ово одмах, па ћете морати да проверите да ли је захтев за отпремање завршен коришћењем URL-а датог у заглављу
location
. Направите GET захтев на ову локацију да бисте видели статус. Мораћете да додате свој кључ претплате на крајlocation
URL-а додавањем&subscription-key=<subscription_key>
на крај, замењујући<subscription_key>
са API кључем за ваш Azure Maps налог. Покрените следећу команду:curl --request GET '<location>&subscription-key=<subscription_key>'
Замените
<location>
са вредношћу заглављаlocation
, и<subscription_key>
са API кључем за ваш Azure Maps налог. -
Проверите вредност
status
у одговору. Ако нијеSucceeded
, сачекајте минут и покушајте поново. -
Када статус буде
Succeeded
, погледајтеresourceLocation
из одговора. Ово садржи детаље о јединственом ID-у (познатом као UDID) за GeoJSON објекат. UDID је вредност наконmetadata/
, а не укључујућиapi-version
. На пример, ако јеresourceLocation
био:{ "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
је 50м, али можете подесити вредности од 0м до 500м.
Када се резултати врате из API позива, један од делова резултата је distance
измерена до најближе тачке на ивици геозоне, са позитивном вредношћу ако је тачка ван геозоне, и негативном ако је унутар геозоне. Ако је ова удаљеност мања од searchBuffer
, стварна удаљеност се враћа у метрима, иначе је вредност 999 или -999. 999 значи да је тачка ван геозоне за више од searchBuffer
, -999 значи да је унутар геозоне за више од searchBuffer
.
На слици изнад, геозона има searchBuffer
од 50м.
- Тачка у центру геозоне, далеко унутар
searchBuffer
, има удаљеност од -999 - Тачка далеко ван
searchBuffer
има удаљеност од 999 - Тачка унутар геозоне и унутар
searchBuffer
, удаљена 6м од геозоне, има удаљеност од 6м - Тачка ван геозоне и унутар
searchBuffer
, удаљена 39м од геозоне, има удаљеност од 39м
Важно је знати удаљеност до ивице геозоне и комбиновати ово са другим информацијама као што су други GPS подаци, брзина и подаци о путевима приликом доношења одлука на основу локације возила.
На пример, замислите GPS податке који показују да се возило кретало путем који пролази поред геозоне. Ако је једна GPS вредност нетачна и постави возило унутар геозоне, иако нема приступа возилом, та вредност се може игнорисати.
На слици изнад, приказан је геофенс преко дела кампуса Microsoft-а. Црвена линија показује кретање камиона дуж пута 520, са круговима који представљају GPS очитавања. Већина ових очитавања је тачна и налази се дуж пута 520, али једно нетачно очитавање је унутар геофенса. Нема начина да то очитавање буде исправно - не постоје путеви који би омогућили камиону да изненада скрене са пута 520 на кампус, а затим се врати на пут 520. Код који проверава овај геофенс мора узети у обзир претходна очитавања пре него што реагује на резултате теста геофенса.
✅ Који додатни подаци би вам били потребни да проверите да ли се GPS очитавање може сматрати исправним?
Задатак - тестирање тачака у односу на геофенс
-
Почните са креирањем URL-а за упит веб API-ја. Формат је:
https://atlas.microsoft.com/spatial/geofence/json?api-version=1.0&deviceId=gps-sensor&subscription-key=<subscription-key>&udid=<UDID>&lat=<lat>&lon=<lon>
Замените
<subscription_key>
са API кључем за ваш Azure Maps налог.Замените
<UDID>
са UDID-ом геофенса из претходног задатка.Замените
<lat>
и<lon>
са географском ширином и дужином коју желите да тестирате.Овај URL користи
https://atlas.microsoft.com/spatial/geofence/json
API за упит геофенса дефинисаног помоћу GeoJSON-а. Циља1.0
верзију API-ја. ПараметарdeviceId
је обавезан и треба да буде име уређаја са којег долазе географска ширина и дужина.Подразумевани претраживачки радијус је 50м, а можете га променити додавањем додатног параметра
searchBuffer=<distance>
, где<distance>
представља радијус претраге у метрима, од 0 до 500. -
Користите curl за прављење GET захтева на овај URL:
curl --request GET '<URL>'
💁 Ако добијете одговорни код
BadRequest
, са грешком:Invalid GeoJSON: All feature properties should contain a geometryId, which is used for identifying the geofence.
онда вашем GeoJSON-у недостаје секција
properties
саgeometryId
. Мораћете да исправите ваш GeoJSON, а затим поновите горе наведене кораке да бисте поново отпремили и добили нови UDID. -
Одговор ће садржати листу
geometries
, једну за сваки полигон дефинисан у GeoJSON-у који је коришћен за креирање геофенса. Свака геометрија има 3 поља од интереса:distance
,nearestLat
иnearestLon
.{ "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
је удаљеност од локације која се тестира до најближе тачке на ивици геофенса. Негативни бројеви значе да је унутар геофенса, позитивни ван. Ова вредност ће бити мања од 50 (подразумевани радијус претраге), или 999.
-
-
Поновите ово више пута са локацијама унутар и ван геофенса.
Коришћење геофенса из серверлес кода
Сада можете додати нови тригер у вашу Functions апликацију за тестирање IoT Hub GPS података о догађајима у односу на геофенс.
Потрошачке групе
Као што се сећате из претходних лекција, IoT Hub вам омогућава да поново репродукујете догађаје који су примљени од хаба, али нису обрађени. Али шта би се десило ако се повежу више тригера? Како ће знати који је обрадио које догађаје?
Одговор је да не може! Уместо тога, можете дефинисати више одвојених конекција за читање догађаја, и свака може управљати репродукцијом непрочитаних порука. Ове се називају потрошачке групе. Када се повежете на крајњу тачку, можете специфицирати коју потрошачку групу желите да користите. Свака компонента ваше апликације ће се повезати на различиту потрошачку групу.
Теоретски, до 5 апликација може се повезати на сваку потрошачку групу, и све ће примати поруке када стигну. Најбоља пракса је да само једна апликација приступа свакој потрошачкој групи како би се избегла дуплирана обрада порука и осигурало да се приликом поновног покретања све поруке у реду правилно обраде. На пример, ако покренете вашу Functions апликацију локално, као и у облаку, обе би обрађивале поруке, што би довело до дуплираних блобова ускладиштених у складишном налогу.
Ако прегледате function.json
датотеку за IoT Hub тригер који сте креирали у ранијој лекцији, видећете потрошачку групу у секцији за повезивање тригера догађаја:
"consumerGroup": "$Default"
Када креирате IoT Hub, добијате подразумевану потрошачку групу $Default
. Ако желите да додате додатни тригер, можете га додати користећи нову потрошачку групу.
💁 У овој лекцији, користићете другачију функцију за тестирање геофенса од оне која се користи за чување GPS података. Ово је да се покаже како се користе потрошачке групе и раздваја код ради лакшег читања и разумевања. У производној апликацији постоји много начина на које можете архитектонски решити ово - стављањем оба у једну функцију, коришћењем тригера на складишном налогу за покретање функције за проверу геофенса, или коришћењем више функција. Не постоји "прави начин", све зависи од остатка ваше апликације и ваших потреба.
Задатак - креирање нове потрошачке групе
-
Покрените следећу команду за креирање нове потрошачке групе назване
geofence
за ваш IoT Hub:az iot hub consumer-group create --name geofence \ --hub-name <hub_name>
Замените
<hub_name>
са именом које сте користили за ваш IoT Hub. -
Ако желите да видите све потрошачке групе за IoT Hub, покрените следећу команду:
az iot hub consumer-group list --output table \ --hub-name <hub_name>
Замените
<hub_name>
са именом које сте користили за ваш IoT Hub. Ово ће приказати све потрошачке групе.Name ResourceGroup -------- --------------- $Default gps-sensor geofence gps-sensor
💁 Када сте покренули монитор догађаја IoT Hub у ранијој лекцији, он се повезао на подразумевану потрошачку групу
$Default
. Због тога не можете покренути монитор догађаја и тригер догађаја истовремено. Ако желите да покренете оба, онда можете користити друге потрошачке групе за све ваше Functions апликације, и задржати$Default
за монитор догађаја.
Задатак - креирање новог IoT Hub тригера
-
Додајте нови IoT Hub тригер догађаја у вашу
gps-trigger
Functions апликацију коју сте креирали у ранијој лекцији. Назовите ову функцијуgeofence-trigger
.⚠️ Можете се позвати на упутства за креирање IoT Hub тригера догађаја из пројекта 2, лекција 5 ако је потребно.
-
Конфигуришите IoT Hub конекцијски стринг у
function.json
датотеци.local.settings.json
је заједнички за све тригере у Functions апликацији. -
Ажурирајте вредност
consumerGroup
уfunction.json
датотеци да референцира нову потрошачку групуgeofence
:"consumerGroup": "geofence"
-
Биће вам потребан кључ претплате за ваш Azure Maps налог у овом тригеру, па додајте нови унос у
local.settings.json
датотеку названMAPS_KEY
. -
Покрените Functions апликацију да бисте се уверили да се повезује и обрађује поруке.
iot-hub-trigger
из раније лекције ће такође радити и отпремати блобове у складиште.Да бисте избегли дуплирана GPS очитавања у блоб складишту, можете зауставити Functions апликацију коју имате покренуту у облаку. Да бисте то урадили, користите следећу команду:
az functionapp stop --resource-group gps-sensor \ --name <functions_app_name>
Замените
<functions_app_name>
са именом које сте користили за вашу Functions апликацију.Можете је поново покренути касније помоћу следеће команде:
az functionapp start --resource-group gps-sensor \ --name <functions_app_name>
Замените
<functions_app_name>
са именом које сте користили за вашу Functions апликацију.
Задатак - тестирање геофенса из тригера
Раније у овој лекцији користили сте curl за упит геофенса да бисте видели да ли се тачка налази унутар или ван. Можете направити сличан веб захтев из вашег тригера.
-
Да бисте упитали геофенс, потребан вам је његов UDID. Додајте нови унос у
local.settings.json
датотеку названGEOFENCE_UDID
са овом вредношћу. -
Отворите
__init__.py
датотеку из новог тригераgeofence-trigger
. -
Додајте следећи импорт на врх датотеке:
import json import os import requests
Пакет
requests
омогућава вам да правите веб API позиве. Azure Maps нема Python SDK, потребно је да правите веб API позиве да бисте га користили из Python кода. -
Додајте следеће 2 линије на почетак
main
методе да бисте добили кључ претплате за Maps:maps_key = os.environ['MAPS_KEY'] geofence_udid = os.environ['GEOFENCE_UDID']
-
Унутар
for event in events
петље, додајте следеће да бисте добили географску ширину и дужину из сваког догађаја:event_body = json.loads(event.get_body().decode('utf-8')) lat = event_body['gps']['lat'] lon = event_body['gps']['lon']
Овај код конвертује JSON из тела догађаја у речник, а затим извлачи
lat
иlon
изgps
поља. -
Када користите
requests
, уместо да градите дугачак URL као што сте радили са curl-ом, можете користити само део URL-а и проследити параметре као речник. Додајте следећи код да дефинишете URL за позив и конфигуришете параметре: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
ће одговарати паровима кључ-вредност које сте користили приликом позива веб API-ја преко curl-а. -
Додајте следеће линије кода за позив веб API-ја:
response = requests.get(url, params=params) response_body = json.loads(response.text)
Ово позива URL са параметрима и добија назад објекат одговора.
-
Додајте следећи код испод овога:
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')
Овај код претпоставља једну геометрију и извлачи удаљеност из те једне геометрије. Затим бележи различите поруке на основу удаљености.
-
Покрените овај код. У излазним логовима ћете видети да ли су GPS координате унутар или ван геофенса, са удаљеношћу ако је тачка унутар 50м. Пробајте овај код са различитим геофенсима на основу локације вашег GPS сензора, пробајте да померите сензор (на пример повезан на WiFi са мобилног телефона, или са различитим координатама на виртуелном IoT уређају) да бисте видели ову промену.
-
Када будете спремни, отпремите овај код у вашу Functions апликацију у облаку. Не заборавите да отпремите нова подешавања апликације.
⚠️ Можете се позвати на упутства за отпремање подешавања апликације из пројекта 2, лекција 5 ако је потребно.
⚠️ Можете се позвати на упутства за отпремање ваше Functions апликације из пројекта 2, лекција 5 ако је потребно.
💁 Овај код можете пронаћи у code/functions фолдеру.
🚀 Изазов
У овој лекцији додали сте један геофенс користећи GeoJSON датотеку са једним полигоном. Можете отпремити више полигона истовремено, све док имају различите geometryId
вредности у секцији properties
.
Пробајте да отпремите GeoJSON датотеку са више полигона и прилагодите ваш код да пронађе који полигон је најближи GPS координатама или унутар њих.
Квиз након предавања
Преглед и самостално учење
- Прочитајте више о геофенсима и неким њиховим случајевима употребе на страници о геофенсима на Википедији.
- Прочитајте више о Azure Maps геофенс API-ју на Microsoft Azure Maps Spatial - Get Geofence документацији.
- Прочитајте више о потрошачким групама у Функције и терминологија у Azure Event Hubs - документација о потрошачима догађаја на Microsoft docs.
Задатак
Пошаљите обавештења користећи Twilio
Одрицање од одговорности:
Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције Co-op Translator. Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода.