Introdução às funções geoespaciais do Stream Analytics
As funções geoespaciais no Azure Stream Analytics permitem análises em tempo real em dados geoespaciais de streaming. Com apenas algumas linhas de código, é possível desenvolver uma solução de nível de produção para cenários complexos. Essas funções suportam todos os tipos WKT e ponto, polígono e LineString GeoJSON.
Exemplos de cenários que podem se beneficiar de funções geoespaciais incluem:
- Compartilhamento de percurso
- Gerenciamento de frota
- Acompanhamento de ativos
- Isolamento geográfico
- Rastreamento por telefone em sites de celular
A Linguagem de Consulta do Stream Analytics tem sete funções geoespaciais internas: CreateLineString, CreatePoint, CreatePolygon, ST_DISTANCE, ST_OVERLAPS, ST_INTERSECTS e ST_WITHIN.
CreateLineString
A função CreateLineString
aceita pontos e retorna um LineString GeoJSON, que pode ser plotado como uma linha em um mapa. É necessário ter pelo menos dois pontos para criar um LineString. Os pontos de LineString serão conectados em ordem.
A consulta a seguir usa CreateLineString
para criar um LineString usando três pontos. O primeiro ponto é criado a partir dos dados de entrada de streaming, enquanto os outros dois são criados 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", "coordinates" : [ [-10.2, 3.0], [10.0, 10.0], [10.5, 10.5] ]}
{"type" : "LineString", "coordinates" : [ [20.2321, -87.33], [10.0, 10.0], [10.5, 10.5] ]}
Para saber mais, visite a referência CreateLineString.
CreatePoint
A função CreatePoint
aceita uma latitude e longitude e retorna um ponto GeoJSON, que pode ser plotado em um mapa. As latitudes e longitudes devem ser um tipo de dados float.
A consulta de exemplo a seguir usa CreatePoint
para criar um ponto usando latitudes e longitudes dos dados de entrada de streaming.
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
{"type" : "Point", "coordinates" : [-10.2, 3.0]}
{"type" : "Point", "coordinates" : [20.2321, -87.33]}
Para saber mais, visite a referência CreatePoint.
CreatePolygon
A função CreatePolygon
aceita pontos e retorna um registro de polígono GeoJSON. A ordem dos pontos deve seguir a orientação do polígono direito ou sentido anti-horário. Imagine andar de um ponto a outro na ordem em que foram declarados. O centro do polígono estaria à esquerda o tempo todo.
A consulta de exemplo a seguir usa CreatePolygon
para criar um polígono a partir de três pontos. Os dois primeiros pontos são criados manualmente e o último ponto é criado a partir 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
{"type" : "Polygon", "coordinates" : [[ [-10.2, 3.0], [10.0, 10.0], [10.5, 10.5], [-10.2, 3.0] ]]}
{"type" : "Polygon", "coordinates" : [[ [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
A função ST_DISTANCE
retorna a distância entre dois polígonos, em metros.
A consulta a seguir usa ST_DISTANCE
para gerar um evento quando um posto de gasolina está a menos de 10 km do carro.
SELECT Cars.Location, Station.Location
FROM Cars c
JOIN Station s ON ST_DISTANCE(c.Location, s.Location) < 10 * 1000
Para saber mais, visite a referência ST_DISTANCE.
ST_OVERLAPS
A função ST_OVERLAPS
compara dois polígonos. Se os polígonos se sobrepuserem, a função retornará 1. A função retornará 0, se os polígonos não se sobrepuserem.
A consulta a seguir usa ST_OVERLAPS
para gerar um evento quando uma construção estiver dentro de uma possível zona de inundação.
SELECT Building.Polygon, Building.Polygon
FROM Building b
JOIN Flooding f ON ST_OVERLAPS(b.Polygon, b.Polygon)
A consulta de exemplo a seguir gera um evento quando uma tempestade indo em direção a um carro.
SELECT Cars.Location, Storm.Course
FROM Cars c, Storm s
JOIN Storm s ON ST_OVERLAPS(c.Location, s.Course)
Para saber mais, visite a referência ST_OVERLAPS.
ST_INTERSECTS
A função ST_INTERSECTS
compara dois polígonos. Se houver intersecção entre os polígonos, a função retornará 1. Se não houver, a função retornará 0.
A consulta de exemplo a seguir usa ST_INTERSECTS
para determinar se uma estrada pavimentada intersecciona uma estrada de terra.
SELECT
ST_INTERSECTS(input.pavedRoad, input.dirtRoad)
FROM input
Exemplo de entrada
datacenterArea | stormArea |
---|---|
{"tipo":"LineString", "coordenadas": [ [-10.0, 0.0], [0.0, 0.0], [10.0, 0.0] ]} | {"tipo":"LineString", "coordenadas": [ [0.0, 10.0], [0.0, 0.0], [0.0, -10.0] ]} |
{"tipo":"LineString", "coordenadas": [ [-10.0, 0.0], [0.0, 0.0], [10.0, 0.0] ]} | {"tipo":"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ênciaST_INTERSECTS.
ST_WITHIN
A função ST_WITHIN
determina se um polígono está dentro de outro. Se o primeiro estiver contido no segundo, a função retornará 1. Se não estiver, a função retornará 0.
A consulta de exemplo a seguir usa ST_WITHIN
para determinar se o ponto de destino de entrega está dentro do polígono do depósito especificado.
SELECT
ST_WITHIN(input.deliveryDestination, input.warehouse)
FROM input
Exemplo de entrada
deliveryDestination | depósito |
---|---|
{"tipo":"Ponto", "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] ]} |
{"tipo":"Ponto", "coordenadas": [15.0, 15.0]} | {"tipo":"Polígono", "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.