Выполнение сценариев геозон и геопространственного агрегирования с помощью 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.