Выполнение сценариев геозон и геопространственного агрегирования с помощью Azure Stream Analytics

Благодаря встроенным геопространственным функциям вы можете использовать Azure Stream Analytics для создания приложений для таких сценариев, как управление транспортным парком, общий доступ к маршрутам, подключенные автомобили и отслеживание ресурсов.

Геозоны

Azure Stream Analytics поддерживает вычисления геозон в режиме реального времени с малой задержкой в облаке и в среде выполнения IoT Edge.

Сценарий геозон

Производственной компании необходимо отслеживать ресурсы в своих зданиях. Ее работники оборудовали каждое устройство службой GPS и хотят получать уведомления, если устройство покидает определенную область.

Справочные данные, используемые в этом примере, содержат информацию о геозонах для зданий и устройств, разрешенных в каждом из зданий. Помните, что эталонные данные могут быть либо статичными, либо медленно меняющимися. Для этого сценария используются статические эталонные данные. Поток данных постоянно выдает идентификатор устройства и его текущую позицию.

Определение геозон в эталонных данных

Геозоны можно определить с помощью объекта GeoJSON. Для заданий с версией совместимости 1.2 и более поздних геозоны также можно определить с помощью значения в формате WKT, например NVARCHAR(MAX). WKT — это стандарт Открытого геопространственного консорциума (OGC), который используется для представления пространственных данных в текстовом формате.

Встроенные геопространственные функции могут использовать определенные геозоны, чтобы выяснить, находится ли элемент внутри или вне определенного многоугольника геозоны.

В указанной ниже таблице приведен пример эталонных данных геозоны, которые могут храниться в хранилище BLOB-объектов Azure или в таблице Azure SQL. Каждый участок представлен геопространственным многоугольником, а каждое устройство связано с идентификатором разрешенного участка.

SiteID SiteName Геозона AllowedDeviceID
1 "Redmond Building 41" "POLYGON((-122.1337357922017 47.63782998329432,-122.13373042778369 47.637634793257305,-122.13346757130023 47.637642022530954,-122.13348902897235 47.637508280806806,-122.13361777500506 47.637508280806806,-122.13361241058703 47.63732393354484,-122.13265754417773 47.63730947490855,-122.13266290859576 47.637519124743164,-122.13302232460376 47.637515510097955,-122.13301696018573 47.63764925180358,-122.13272728161212 47.63764925180358,-122.13274873928424 47.63784082716388,-122.13373579220172 47.63782998329432))" "B"
2 "Redmond Building 40" "POLYGON((-122.1336154507967 47.6366745947009,-122.13361008637867 47.636483015064535,-122.13349206918201 47.636479400347675,-122.13349743360004 47.63636372927573,-122.13372810357532 47.63636372927573,-122.13373346799335 47.63617576323771,-122.13263912671528 47.63616491902258,-122.13264985555134 47.63635649982525,-122.13304682248554 47.636367344000604,-122.13305218690357 47.63650831807564,-122.13276250832996 47.636497473929516,-122.13277323716602 47.63668543881025,-122.1336154507967 47.6366745947009))" "A"
3 "Redmond Building 22" "POLYGON((-122.13611660248233 47.63758544698554,-122.13635263687564 47.6374083293018,-122.13622389084293 47.63733603619712,-122.13622389084293 47.63717699101473,-122.13581619507266 47.63692757827657,-122.13559625393344 47.637046862778135,-122.13569281345798 47.637144458985965,-122.13570890671207 47.637314348246214,-122.13611660248233 47.63758544698554))" "C"

Создание оповещений с помощью геозоны

Устройства могут выдавать свои идентификаторы и расположения каждую минуту через поток с именем DeviceStreamInput. Приведенная ниже таблица представляет собой поток входных данных.

DeviceID GeoPosition
"A" "POINT(-122.13292341559497 47.636318374032726)"
"B" "POINT(-122.13338475554553 47.63743531308874)"
"C" "POINT(-122.13354001095752 47.63627622505007)"

Вы можете написать запрос, который объединяет поток устройства с эталонными данными геозоны и создает предупреждение каждый раз, когда устройство находится за пределами разрешенного здания.

SELECT DeviceStreamInput.DeviceID, SiteReferenceInput.SiteID, SiteReferenceInput.SiteName 
INTO Output
FROM DeviceStreamInput 
JOIN SiteReferenceInput
ON st_within(DeviceStreamInput.GeoPosition, SiteReferenceInput.Geofence) = 0
WHERE DeviceStreamInput.DeviceID = SiteReferenceInput.AllowedDeviceID

На следующем изображении представлены геозоны. Вы можете увидеть, где находятся устройства в соответствии с потоком входных данных.

Создание геозон

Устройство "C" находится внутри здания ID 2, что не разрешено в соответствии с эталонными данными. Это устройство должно находиться внутри здания ID 3. При выполнении этого задания будет создано оповещение для этого конкретного нарушения.

Участок с несколькими разрешенными устройствами

Если на участке разрешено использование нескольких устройств, в AllowedDeviceID можно определить массив идентификаторов устройств, а в предложении WHERE можно использовать определяемую пользователем функцию, чтобы проверить, соответствует ли идентификатор потокового устройства идентификатору устройства в этом списке. Дополнительные сведения см. в руководстве по JavaScript UDF для облачных заданий и в руководстве по C# UDF для заданий Edge.

Геопространственное агрегирование

Azure Stream Analytics поддерживает геопространственное агрегирование в режиме реального времени с малой задержкой в облаке и в среде выполнения IoT Edge.

Сценарий геопространственной агрегации

Таксомоторная компания хочет создать приложение, работающее в режиме реального времени, чтобы направлять своих таксистов в районы городов с повышенный спросом.

Логические регионы города хранятся в компании в качестве эталонных данных. Каждый регион определяется с помощью RegionID, RegionName и геозоны.

Определение геозон

В указанной ниже таблице приведен пример эталонных данных геозоны, которые могут храниться в хранилище BLOB-объектов Azure или в таблице Azure SQL. Каждый регион представлен геопространственным многоугольником, который используется для сопоставления с запросами, поступающими из потоковых данных.

Эти многоугольники предназначены только для справки и не представляют фактическое логическое или физическое сегментирование города.

RegionID RegionName Геозона
1 "SoHo" "POLYGON((-74.00279525078275 40.72833625216264,-74.00547745979765 40.721929158663244,-74.00125029839018 40.71893680218994,-73.9957785919998 40.72521409075776,-73.9972377137039 40.72557184584898,-74.00279525078275 40.72833625216264))"
2 "Chinatown" "POLYGON((-73.99712367114876 40.71281582267133,-73.9901070123658 40.71336881907936,-73.99023575839851 40.71452359088633,-73.98976368961189 40.71554823078944,-73.99551434573982 40.717337246783735,-73.99480624255989 40.718491949759304,-73.99652285632942 40.719109951574,-73.99776740131233 40.7168005470334,-73.99903340396736 40.71727219249899,-74.00193018970344 40.71938642421256,-74.00409741458748 40.71688186545551,-74.00051398334358 40.71517415773184,-74.0004281526551 40.714377212470005,-73.99849696216438 40.713450141693166,-73.99748845157478 40.71405192594819,-73.99712367114876 40.71281582267133))"
3 "Tribeca" "POLYGON((-74.01091641815208 40.72583120006787,-74.01338405044578 40.71436586362705,-74.01370591552757 40.713617702123415,-74.00862044723533 40.711308107057235,-74.00194711120628 40.7194238654018,-74.01091641815208 40.72583120006787))"

Агрегирование данных за период времени

В следующей таблице содержатся потоковые данные "вызовов":

UserID FromLocation ToLocation TripRequestedTime
"A" "POINT(-74.00726861389182 40.71610611981975)" "POINT(-73.98615095917779 40.703107386025835)" "2019-03-12T07:00:00Z"
"B" "POINT(-74.00249841021645 40.723827238895666)" "POINT(-74.01160699942085 40.71378884930115)" "2019-03-12T07:01:00Z"
"C" "POINT(-73.99680120565864 40.716439898624024)" "POINT(-73.98289663412544 40.72582343969828)" "2019-03-12T07:02:00Z"
"D" "POINT(-74.00741090068288 40.71615626755086)" "POINT(-73.97999843120539 40.73477895807408)" "2019-03-12T07:03:00Z"

Следующий запрос объединяет поток устройства с эталонными данными геозоны и вычисляет количество запросов на регион во временном окне длительностью 15 минут каждую минуту.

SELECT count(*) as NumberOfRequests, RegionsRefDataInput.RegionName 
FROM UserRequestStreamDataInput
JOIN RegionsRefDataInput 
ON st_within(UserRequestStreamDataInput.FromLocation, RegionsRefDataInput.Geofence) = 1
GROUP BY RegionsRefDataInput.RegionName, hoppingwindow(minute, 15, 1)

Этот запрос выводит количество запросов каждую минуту за последние 15 минут по каждому региону в городе. Эти сведения можно легко отобразить на панели мониторинга Power BI или передать всем водителям в виде текстовых SMS-сообщений благодаря интеграции с такими службами, как Функции Azure.

На изображении ниже показан вывод запроса на панель мониторинга Power BI.

Выходные данные результатов на панели мониторинга Power BI

Дальнейшие действия