Cenários de agregação geoespacial e de perímetro geográfico com o Azure Stream Analytics

Com as funções geoespaciais incorporadas, pode utilizar o Azure Stream Analytics para criar aplicações para cenários como a gestão de frotas, partilha de boleias, carros ligados e controlo de ativos.

Perímetro geográfico

O Azure Stream Analytics suporta cálculos geográficos de baixa latência em tempo real na cloud e no IoT Edge runtime.

Cenário de perímetro geográfico

Uma empresa fabril precisa de localizar activos nos seus edifícios. Equiparam todos os dispositivos com um GPS e querem receber notificações se um dispositivo sair de uma determinada área.

Os dados de referência utilizados neste exemplo têm as informações de georreplicação para os edifícios e os dispositivos permitidos em cada um dos edifícios. Lembre-se de que os dados de referência podem ser estáticos ou com alterações lentas. Os dados de referência estáticos são utilizados para este cenário. Um fluxo de dados emite continuamente o ID do dispositivo e a sua posição atual.

Definir geofences em dados de referência

É possível definir um perímetro geográfico com um objeto GeoJSON. Para tarefas com a versão de compatibilidade 1.2 e superior, os perímetros geográficos também podem ser definidos com o Texto Conhecido (WKT) como NVARCHAR(MAX). O WKT é um padrão OGC (Open Geospatial Consortium) que é utilizado para representar dados espaciais num formato textual.

As funções geoespaciais incorporadas podem utilizar perímetros geográficos definidos para descobrir se um elemento está dentro ou fora de um polígono de geofência específico.

A tabela seguinte é um exemplo de dados de referência de geoence que podem ser armazenados no armazenamento de blobs do Azure ou numa tabela de SQL do Azure. Cada site é representado por um polígono geoespacial e cada dispositivo está associado a um ID de site permitido.

ID do Site SiteName Perímetro geográfico AllowedDeviceID
1 "Edifício Redmond 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 "Edifício Redmond 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 "Edifício Redmond 22" "POLYGON((-122.1361660248233 47.63758544698554,-122.13635263687564 47.6374083293018,-122.13622389084293 47.6373603619712,-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"

Gerar alertas com geoence

Os dispositivos podem emitir o ID e a localização a cada minuto através de um fluxo chamado DeviceStreamInput. A tabela seguinte é um fluxo de entrada.

ID do Dispositivo Geoposição
"A" "POINT(-122.13292341559497 47.636318374032726)"
"B" "POINT(-122.13338475554553 47.63743531308874)"
"C" "POINT(-122.13354001095752 47.63627622505007)"

Pode escrever uma consulta que associe o fluxo do dispositivo aos dados de referência de georreplicação e gere um alerta sempre que um dispositivo estiver fora de um edifício permitido.

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

A imagem seguinte representa os perímetros geográficos. Pode ver onde os dispositivos estão de acordo com a entrada de dados de fluxo.

Criar perímetros geográficos

O dispositivo "C" está localizado no ID 2 do edifício, o que não é permitido de acordo com os dados de referência. Este dispositivo deve estar localizado no ID 3 do edifício. A execução desta tarefa irá gerar um alerta para esta violação específica.

Site com vários dispositivos permitidos

Se um site permitir vários dispositivos, pode ser definida uma matriz de IDs de dispositivo e AllowedDeviceID uma Função de User-Defined na WHERE cláusula para verificar se o ID do dispositivo de transmissão em fluxo corresponde a qualquer ID de dispositivo nessa lista. Para obter mais informações, veja o tutorial javaScript UDF para tarefas na cloud e o tutorial C# UDF para tarefas edge.

Agregação geoespacial

O Azure Stream Analytics suporta uma agregação geoespacial em tempo real de baixa latência na cloud e no IoT Edge runtime.

Cenário de agregação geoespacial

Uma empresa de táxis quer construir uma aplicação em tempo real para guiar os seus taxistas à procura de boleias para as áreas das cidades que atualmente sofrem de maior procura.

A empresa armazena regiões lógicas da cidade como dados de referência. Cada região é definida por um RegionID, RegionName e Geofence.

Definir os perímetros geográficos

A tabela seguinte é um exemplo de dados de referência de geoence que podem ser armazenados no armazenamento de blobs do Azure ou numa tabela de SQL do Azure. Cada região é representada por um polígono geoespacial, que é utilizado para correlacionar com os pedidos provenientes de dados de transmissão em fluxo.

Estes polígonos são apenas para referência e não representam separações lógicas ou físicas reais da cidade.

ID Da Região RegionName Perímetro geográfico
1 "SoHo" "POLYGON((-74.00279525078275 40.72833625216264,-74.005477459797 40.721929158663244,-74.00125029839018 40.7189368021899 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" "POLÍGONO((-74.01091641815208 40.72583120006787,-74.013384050445 78 40.71436586362705,-74.01370591552757 40.713617702123415,-74.00862044723533 40.711308107057235,-74.00194711120628 40.7194238654018,-74.01091641815208 40.72583120006787)"

Agregar dados numa janela de tempo

A tabela seguinte contém dados de transmissão em fluxo de "passeios".

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.979999843120539 40.73477895807408)" "2019-03-12T07:03:00Z"

A consulta seguinte associa o fluxo do dispositivo aos dados de referência de georreplicação e calcula o número de pedidos por região numa janela de tempo de 15 minutos a cada minuto.

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)

Esta consulta produz uma contagem de pedidos a cada minuto durante os últimos 15 minutos por cada região dentro da cidade. Estas informações podem ser apresentadas facilmente pelo dashboard do Power BI ou podem ser transmitidas a todos os controladores como mensagens sms através da integração com serviços como as funções do Azure.

A imagem abaixo ilustra a saída da consulta para o dashboard do Power BI.

Resultado no dashboard do Power BI

Passos seguintes