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

As funções geoespaciais no Azure Stream Analytics permitem análises em tempo real sobre dados geoespaciais em streaming para cenários como partilha de boleias, gestão de frotas, rastreamento de ativos, geo-vedação e rastreamento telemóvel entre sites móveis. Com apenas algumas linhas de código de consulta, pode construir soluções que utilizam as sete funções incorporadas 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 exemplos de consultas para que possa aplicá-las aos seus próprios dados de streaming.

Tipos de geometria e ordem de coordenadas

As funções geoespaciais funcionam 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 limite retorna ao seu ponto de partida, como uma área de construção ou uma geo-cerca.

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

No GeoJSON, as coordenadas são ordenadas com a longitude primeiro e a latitude em segundo, pelo que os valores de latitude e longitude de entrada aparecem pela ordem inversa na geometria resultante. Compreender esta ordenação, juntamente 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 um objeto GeoJSON do tipo LineString, uma geometria que representa uma sequência ligada de pontos como uma linha num mapa. Aceita dois ou mais pontos e liga-os pela ordem em que os lista, o que torna uma forma natural de modelar rotas, caminhos e segmentos de estrada a partir de dados em fluxo.

O exemplo seguinte ilustra este comportamento combinando três pontos numa LineString. O primeiro ponto vem do streaming de dados de entrada, e defines 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, consulte a referência CreateLineString .

CreatePoint

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

O exemplo seguinte ilustra este 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, consulte a referência ao CreatePoint .

CreatePolygon

CreatePolygon é uma função construtora que devolve um polígono GeoJSON a partir de um conjunto de pontos. Um polígono representa uma área fechada num mapa, como a área de um edifício, o limite de um armazém ou uma geo-cerca. A ordem dos pontos segue a orientação do anel à direita, ou no sentido anti-horário: se imaginar caminhar de um ponto para o outro na ordem em que os declara, o centro do polígono mantém-se à sua esquerda o tempo todo.

O exemplo seguinte ilustra este comportamento criando um polígono a partir de três pontos. Define-se 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 devolve a distância entre duas geometrias em metros. Ajuda-o a perceber a proximidade ou distância de dois locais, o que é útil em cenários de proximidade, como alertas de veículos próximos e cálculos de áreas de serviço.

O exemplo seguinte mostra como usar esta 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, consulte a ST_DISTANCE referência.

ST_OVERLAPS

ST_OVERLAPS é uma função de relação que compara duas geometrias e reporta se partilham uma região comum. Devolve 1 quando as geometrias se sobrepõem e 0 quando não se sobrepõem. Esta função é útil para detetar conflitos espaciais, como uma zona de perigo a tocar uma área de interesse.

O exemplo seguinte mostra como usar esta função para identificar quando um edifício se encontra 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 exemplo seguinte também serve ST_OVERLAPS para detetar quando uma tempestade se dirige para um carro.

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

Para saber mais, consulte a referência ST_OVERLAPS .

ST_INTERSECTS

ST_INTERSECTS é uma função de relação que compara duas geometrias e reporta se se cruzam ou se tocam. Devolve 1 quando as geometrias se cruzam e 0 quando não o fazem. Esta função ajuda-te a detetar onde os caminhos ou regiões se encontram.

O exemplo seguinte mostra como usar esta 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 ST_INTERSECTS referência.

ST_WITHIN

ST_WITHIN é uma função de relação que indica se uma geometria está totalmente contida dentro de outra. Devolve 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 seguinte ilustra este comportamento ao determinar se um ponto de destino de entrega se encontra dentro de um dado polígono de armazém.

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

Exemplo de entrada

destino de entrega warehouse
{"type":"Point", "coordenadas": [76.6, 10.1]} {"tipo":"Polígono", "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 ST_WITHIN referência.