Introdução às funções geoespaciais do Stream Analytics

As funções geoespaciais do Azure Stream Analytics permitem análises em tempo real de dados geoespaciais de streaming para cenários como compartilhamento de viagens, gerenciamento de frotas, rastreamento de ativos, delimitação geográfica e rastreamento de telefones entre sites de celular. Com apenas algumas linhas de código de consulta, você pode construir soluções que usem as sete funções embutidas na Stream Analytics Query Language (CreateLineString, CreatePoint, CreatePolygon, ST_DISTANCE, ST_OVERLAPS, ST_INTERSECTS, e ST_WITHIN), que suportam todos os tipos WKT e GeoJSON point, polygon e LineString. Este artigo descreve cada função e mostra consultas de exemplo para que você possa aplicá-las aos seus próprios dados de streaming.

Tipos de geometria e ordem de coordenadas

As funções geoespaciais trabalham com três tipos de geometria GeoJSON. Um ponto é um único local definido por uma longitude e latitude. Um LineString é um conjunto ordenado de dois ou mais pontos que forma uma linha contínua, como uma rota ou uma estrada. Um polígono é uma forma fechada cujo contorno volta ao ponto inicial, como a projeção de uma edificação ou uma cerca geográfica.

As funções se dividem em dois grupos. Funções construtoras (CreatePoint, CreateLineString, e CreatePolygon) constroem geometrias a partir dos valores de coordenadas nos seus dados de evento. Funções de relação (ST_DISTANCE, ST_OVERLAPS, ST_INTERSECTS, e ST_WITHIN) comparam duas geometrias e descrevem como elas se relacionam no espaço.

No GeoJSON, as coordenadas são ordenadas com a longitude primeiro e a latitude depois, de modo que os valores de latitude e longitude informados aparecem na ordem inversa na geometria resultante. Entender essa ordenação, junto com a orientação em anel no sentido anti-horário que os polígonos exigem, ajuda a prever a saída de cada função.

CreateLineString

CreateLineString é uma função construtora que retorna uma GeoJSON LineString, uma geometria que representa uma série conexa de pontos como uma linha em um mapa. Ele aceita dois ou mais pontos e os conecta na ordem em que você os lista, o que torna uma forma natural de modelar rotas, caminhos e trechos de estrada a partir de dados em fluxo.

O exemplo a seguir ilustra esse comportamento combinando três pontos em uma LineString. O primeiro ponto vem do streaming de dados de entrada, e você define os outros dois manualmente.

SELECT  
     CreateLineString(CreatePoint(input.latitude, input.longitude), CreatePoint(10.0, 10.0), CreatePoint(10.5, 10.5))  
FROM input  

Exemplo de entrada

latitude longitude
3.0 -10.2
-87.33 20.2321

Exemplo de saída

{"type" : "LineString", "coordenadas" : [ [-10.2, 3.0], [10.0, 10.0], [10.5, 10.5] ]}

{"type" : "LineString", "coordenadas" : [ [20.2321, -87.33], [10.0, 10.0], [10.5, 10.5] ]}

Para saber mais, veja a referência CreateLineString .

CreatePoint

CreatePoint é uma função construtora que retorna um ponto GeoJSON de uma latitude e longitude. Um ponto é a geometria mais básica e representa um único local em um mapa, como a posição atual de um veículo ou de um ativo. Os valores de latitude e longitude devem ser um float tipo de dado.

O exemplo a seguir ilustra esse comportamento criando um ponto a partir dos valores de latitude e longitude nos dados de entrada em fluxo.

SELECT  
     CreatePoint(input.latitude, input.longitude)  
FROM input 

Exemplo de entrada

latitude longitude
3.0 -10.2
-87.33 20.2321

Exemplo de saída

{"tipo" : "Ponto", "coordenadas" : [-10.2, 3.0]}

{"tipo" : "Ponto", "coordenadas" : [20.2321, -87.33]}

Para saber mais, veja a referência ao CreatePoint .

CreatePolygon

CreatePolygon é uma função construtora que retorna um polígono GeoJSON de um conjunto de pontos. Um polígono representa uma área delimitada em um mapa, como a planta de uma edificação, o limite de um armazém ou uma geocerca. A ordem dos pontos segue a orientação do anel à direita, ou no sentido anti-horário: se você imaginar caminhar de um ponto ao outro na ordem em que os declara, o centro do polígono permanece à sua esquerda o tempo todo.

O exemplo a seguir ilustra esse comportamento criando um polígono a partir de três pontos. Você define os dois primeiros pontos manualmente, e o último ponto vem dos dados de entrada.

SELECT  
     CreatePolygon(CreatePoint(input.latitude, input.longitude), CreatePoint(10.0, 10.0), CreatePoint(10.5, 10.5), CreatePoint(input.latitude, input.longitude))  
FROM input  

Exemplo de entrada

latitude longitude
3.0 -10.2
-87.33 20.2321

Exemplo de saída

{"tipo" : "Polígono", "coordenadas" : [[ [-10.2, 3.0], [10.0, 10.0], [10.5, 10.5], [-10.2, 3.0] ]]}

{"tipo" : "Polígono", "coordenadas" : [[ [20.2321, -87.33], [10.0, 10.0], [10.5, 10.5], [20.2321, -87.33] ]]}

Para saber mais, visite a referência CreatePolygon .

ST_DISTANCE

ST_DISTANCE é uma função de relação que retorna a distância entre duas geometrias em metros. Ele ajuda a entender a proximidade ou distância de dois locais, o que é útil para cenários de proximidade, como alertas de veículos próximos e cálculos de áreas de serviço.

O exemplo a seguir mostra como usar essa função para identificar quando um posto de gasolina está a menos de 10 km de um carro.

SELECT Cars.Location, Station.Location 
FROM Cars c  
JOIN Station s ON ST_DISTANCE(c.Location, s.Location) < 10 * 1000

Para saber mais, veja a referência ST_DISTANCE .

ST_OVERLAPS

ST_OVERLAPS é uma função de relacionamento que compara duas geometrias e informa se elas compartilham uma região comum. Ele retorna 1 quando as geometrias se sobrepõem e 0 quando não se sobrepõem. Essa função é útil para detectar conflitos espaciais, como uma zona de risco tocando uma área de interesse.

O exemplo a seguir mostra como usar essa função para identificar quando um edifício está dentro de uma possível zona de inundação.

SELECT Building.Polygon, Flooding.Polygon
FROM Building b 
JOIN Flooding f ON ST_OVERLAPS(b.Polygon, f.Polygon)

O próximo exemplo também usa ST_OVERLAPS para detectar quando uma tempestade vai em direção a um carro.

SELECT Cars.Location, Storm.Course
FROM Cars c
JOIN Storm s ON ST_OVERLAPS(c.Location, s.Course)

Para saber mais, veja a referência ST_OVERLAPS .

ST_INTERSECTS

ST_INTERSECTS é uma função de relacionamento que compara duas geometrias e informa se elas se cruzam ou se tocam. Ele retorna 1 quando as geometrias se cruzam e 0 quando não se cruzam. Essa função ajuda você a detectar onde caminhos ou regiões se encontram.

O exemplo a seguir mostra como usar essa função para determinar se uma estrada pavimentada cruza uma estrada de terra.

SELECT  
     ST_INTERSECTS(input.pavedRoad, input.dirtRoad)  
FROM input  

Exemplo de entrada

Estrada pavimentada Estrada de terra
{"type":"LineString", "coordenadas": [ [-10.0, 0.0], [0.0, 0.0], [10.0, 0.0] ]} {"type":"LineString", "coordenadas": [ [0.0, 10.0], [0.0, 0.0], [0.0, -10.0] ]}
{"type":"LineString", "coordenadas": [ [-10.0, 0.0], [0.0, 0.0], [10.0, 0.0] ]} {"type":"LineString", "coordenadas": [ [-10.0, 10.0], [0.0, 10.0], [10.0, 10.0] ]}

Exemplo de saída

1

0

Para saber mais, visite a referência ST_INTERSECTS .

ST_WITHIN

ST_WITHIN é uma função de relacionamento que informa se uma geometria está totalmente contida dentro de outra. Ele retorna 1 quando a primeira geometria está dentro da segunda e 0 quando não está, que é a base para cenários de contenção como geo-fencing e verificações de zonas de entrega.

O exemplo a seguir ilustra esse comportamento determinando se um ponto de destino de entrega está dentro de um determinado polígono de depósito.

SELECT  
     ST_WITHIN(input.deliveryDestination, input.warehouse)  
FROM input 

Exemplo de entrada

destinoDeEntrega warehouse
{"type":"Point", "coordenadas": [76.6, 10.1]} {"type":"Polygon", "coordenadas": [ [0.0, 0.0], [10.0, 0.0], [10.0, 10.0], [0.0, 10.0], [0.0, 0.0] ]}
{"type":"Point", "coordenadas": [15.0, 15.0]} {"type":"Polygon", "coordenadas": [ [10.0, 10.0], [20.0, 10.0], [20.0, 20.0], [10.0, 20.0], [10.0, 10.0] ]}

Exemplo de saída

0

1

Para saber mais, visite a referência ST_WITHIN.