Introducción a las funciones geoespaciales de Stream Analytics

Las funciones geoespaciales en Azure Stream Analytics permiten análisis en tiempo real sobre datos geoespaciales en streaming para escenarios como el transporte compartido, la gestión de flotas, el seguimiento de activos, la geovallación y el seguimiento telefónico entre sitios móviles. Con solo unas pocas líneas de código de consulta, puedes construir soluciones que utilicen las siete funciones integradas en Stream Analytics Query Language (CreateLineString, CreatePoint, CreatePolygon, ST_DISTANCE, ST_OVERLAPS, ST_INTERSECTS, y ST_WITHIN), que soportan todos los tipos WKT y GeoJSON point, polygon y LineString. Este artículo describe cada función y muestra consultas de ejemplo para que puedas aplicarlas a tus propios datos de streaming.

Tipos de geometría y orden de coordenadas

Las funciones geoespaciales trabajan con tres tipos de geometría GeoJSON. Un punto es una única ubicación definida por una longitud y una latitud. Una Línea String es un conjunto ordenado de dos o más puntos que forman una línea conectada, como una ruta o una carretera. Un polígono es una forma cerrada cuyo límite vuelve a su punto de inicio, como la huella de un edificio o una geovalla.

Las funciones se dividen en dos grupos. Las funciones constructoras (CreatePoint, CreateLineString, y CreatePolygon) construyen geometrías a partir de valores de coordenadas en tus datos de eventos. Las funciones de relación (ST_DISTANCE, ST_OVERLAPS, ST_INTERSECTS, y ST_WITHIN) comparan dos geometrías y describen cómo se relacionan en el espacio.

En GeoJSON, las coordenadas se ordenan primero como longitud y segunda latitud, por lo que una latitud y longitud de entrada aparecen en orden inverso en la geometría resultante. Entender este orden, junto con la orientación en anillo en sentido antihorario que requieren los polígonos, te ayuda a predecir la salida de cada función.

CreateLineString

CreateLineString es una función constructora que devuelve una LineString de GeoJSON, una geometría que representa una serie conectada de puntos como una línea en un mapa. Acepta dos o más puntos y los conecta en el orden en que los listas, lo que lo convierte en una forma natural de modelar rutas, caminos y tramos de carretera a partir de datos en streaming.

El siguiente ejemplo ilustra este comportamiento combinando tres puntos en una LineString. El primer punto viene de transmitir datos de entrada, y defines los otros dos manualmente.

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

Ejemplo de entrada

latitud longitude
3.0 -10.2
-87.33 20.2321

Ejemplo de salida

{"type" : "LineString", "coordinates" : [ [-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 más, consulta la referencia CreateLineString .

CreatePoint

CreatePoint es una función constructora que devuelve un punto GeoJSON desde una latitud y longitud. Un punto es la geometría más básica y representa una ubicación única en un mapa, como la posición actual de un vehículo o un activo. Los valores de latitud y longitud deben ser un tipo de float dato.

El siguiente ejemplo ilustra este comportamiento creando un punto a partir de los valores de latitud y longitud en los datos de entrada en streaming.

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

Ejemplo de entrada

latitud longitude
3.0 -10.2
-87.33 20.2321

Ejemplo de salida

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

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

Para saber más, consulta la referencia de CreatePoint .

CreatePolygon

CreatePolygon es una función constructora que devuelve un polígono GeoJSON de un conjunto de puntos. Un polígono representa un área delimitada en un mapa, como la huella de un edificio, el límite de un almacén o una geovalla. El orden de los puntos sigue la orientación del anillo a la derecha, o en sentido antihorario: si imaginas caminar de un punto a otro en el orden en que los declaras, el centro del polígono permanece a tu izquierda todo el tiempo.

El siguiente ejemplo ilustra este comportamiento creando un polígono a partir de tres puntos. Defines los dos primeros puntos manualmente, y el último punto proviene de los datos 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  

Ejemplo de entrada

latitud longitude
3.0 -10.2
-87.33 20.2321

Ejemplo de salida

{"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 más información, visite la referencia de CreatePolygon .

ST_DISTANCE

ST_DISTANCE es una función de relación que devuelve la distancia entre dos geometrías en metros. Te ayuda a entender qué tan cerca o lejos están dos ubicaciones, lo cual es útil para escenarios de proximidad como alertas de vehículos cercanos y cálculos de áreas de servicio.

El siguiente ejemplo muestra cómo usar esta función para identificar cuándo una gasolinera está a menos de 10 km de un coche.

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

Para saber más, consulta la referencia ST_DISTANCE .

ST_OVERLAPS

ST_OVERLAPS es una función de relación que compara dos geometrías e informa si comparten una región común. Devuelve 1 cuando las geometrías se solapan y 0 cuando no. Esta función es útil para detectar conflictos espaciales, como una zona de peligro que toca un área de interés.

El siguiente ejemplo muestra cómo usar esta función para identificar cuándo un edificio se encuentra dentro de una posible zona de inundación.

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

El siguiente ejemplo también usa ST_OVERLAPS para detectar cuándo una tormenta se acerca a un coche.

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

Para saber más, consulta la referencia ST_OVERLAPS .

ST_INTERSECTS

ST_INTERSECTS es una función de relación que compara dos geometrías e informa si se cruzan o se tocan. Devuelve 1 cuando las geometrías se intersectan y 0 cuando no lo hacen. Esta función te ayuda a detectar dónde se encuentran los caminos o las regiones.

El siguiente ejemplo muestra cómo usar esta función para determinar si una carretera asfaltada intersecta una carretera de tierra.

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

Ejemplo de entrada

Carretera asfaltada Camino de tierra
{"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", "coordinates": [ [-10.0, 10.0], [0.0, 10.0], [10.0, 10.0] ]}

Ejemplo de salida

1

0

Para obtener más información, visite la guía de referencia ST_INTERSECTS.

ST_WITHIN

ST_WITHIN es una función de relación que informa si una geometría está completamente contenida dentro de otra. Devuelve 1 cuando la primera geometría está dentro de la segunda y 0 cuando no lo está, lo que es la base para escenarios de contención como el geovallado y las comprobaciones de zonas de entrega.

El siguiente ejemplo ilustra este comportamiento determinando si un punto de destino de entrega se encuentra dentro de un polígono de almacén dado.

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

Ejemplo de entrada

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

Ejemplo de salida

0

1

Para obtener más información, visite la referencia ST_WITHIN.