Tutorial: Creación de visualizaciones geoespaciales
Se aplica a: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Este tutorial es para aquellos que quieren usar Lenguaje de consulta Kusto (KQL) para la visualización geoespacial. La agrupación en clústeres geoespaciales es una manera de organizar y analizar datos en función de la ubicación geográfica. KQL ofrece varios métodos para realizar clústeres geoespaciales y herramientas para visualizaciones geoespaciales.
En este tutorial, aprenderá a:
- Trazado de puntos en un mapa
- Trazado de varias series de puntos
- Uso de valores de GeoJSON para trazar puntos en un mapa
- Representar puntos de datos con burbujas de tamaño variable
- Mostrar puntos dentro de un área específica
- Mostrar puntos cercanos en un LineString
- Mostrar puntos cercanos en un polígono
- Búsqueda de anomalías basadas en datos geoespaciales
Requisitos previos
Para ejecutar las siguientes consultas, necesita un entorno de consulta con acceso a los datos de ejemplo. Puede usar cualquiera de los siguientes medios:
- Una cuenta microsoft o una identidad de usuario de Microsoft Entra para iniciar sesión en el clúster de ayuda
- Una cuenta microsoft o una identidad de usuario de Microsoft Entra
- Un área de trabajo de Fabric con una capacidad habilitada para Microsoft Fabric
Trazado de puntos en un mapa
Para visualizar puntos en un mapa, use el proyecto para seleccionar la columna que contiene la longitud y, a continuación, la columna que contiene la latitud. A continuación, use render para ver los resultados en un gráfico de dispersión con kind
establecido en map
.
StormEvents
| take 100
| project BeginLon, BeginLat
| render scatterchart with (kind = map)
Trazado de varias series de puntos
Para visualizar varias series de puntos, use el proyecto para seleccionar la longitud y la latitud junto con una tercera columna, que define la serie.
En la consulta siguiente, la serie es EventType
. Los puntos se colorea de forma diferente según su EventType
y, cuando se selecciona, muestran el contenido de la EventType
columna.
StormEvents
| take 100
| project BeginLon, BeginLat, EventType
| render scatterchart with (kind = map)
También puede especificar xcolumn
explícitamente (Longitud), ycolumn
(Latitud) y series
al realizar .render
Esta especificación es necesaria cuando hay más columnas en el resultado que solo las columnas longitud, latitud y serie.
StormEvents
| take 100
| render scatterchart with (kind = map, xcolumn = BeginLon, ycolumns = BeginLat, series = EventType)
Uso de valores de GeoJSON para trazar puntos en un mapa
Un valor geoJSON dinámico puede cambiar o actualizarse y a menudo se usan para aplicaciones de asignación en tiempo real. Los puntos de asignación que usan valores GeoJSON dinámicos permiten mayor flexibilidad y control sobre la representación de los datos en el mapa que puede no ser posible con valores de latitud y longitud sin formato.
La consulta siguiente usa el geo_point_to_s2cell y geo_s2cell_to_central_point para asignar eventos de tormenta en un gráfico de dispersión.
StormEvents
| project BeginLon, BeginLat
| summarize by hash=geo_point_to_s2cell(BeginLon, BeginLat, 5)
| project point = geo_s2cell_to_central_point(hash)
| project lng = toreal(point.coordinates[0]), lat = toreal(point.coordinates[1])
| render scatterchart with (kind = map)
Representar puntos de datos con burbujas de tamaño variable
Visualice la distribución de puntos de datos realizando una agregación en cada clúster y, a continuación, trazando el punto central del clúster.
Por ejemplo, la consulta siguiente filtra todos los eventos de tormenta del tipo de evento "Tornado". A continuación, agrupa los eventos en clústeres en función de su longitud y latitud, cuenta el número de eventos de cada clúster y proyecta el punto central del clúster y representa un mapa para visualizar el resultado. Las regiones con la mayoría de los tornados se detectan claramente en función de su tamaño de burbuja grande.
StormEvents
| where EventType == "Tornado"
| project BeginLon, BeginLat
| where isnotnull(BeginLat) and isnotnull(BeginLon)
| summarize count_summary=count() by hash = geo_point_to_s2cell(BeginLon, BeginLat, 4)
| project geo_s2cell_to_central_point(hash), count_summary
| extend Events = "count"
| render piechart with (kind = map)
Mostrar puntos dentro de un área específica
Use un polígono para definir la región y la función geo_point_in_polygon para filtrar los eventos que se producen dentro de esa región.
La consulta siguiente define un polígono que representa la región sur de California y filtra los eventos de tormenta dentro de esta región. A continuación, agrupa los eventos en clústeres, cuenta el número de eventos de cada clúster, proyecta el punto central del clúster y representa un mapa para visualizar los clústeres.
let southern_california = dynamic({
"type": "Polygon",
"coordinates": [[[-119.5, 34.5], [-115.5, 34.5], [-115.5, 32.5], [-119.5, 32.5], [-119.5, 34.5]]
]});
StormEvents
| where geo_point_in_polygon(BeginLon, BeginLat, southern_california)
| project BeginLon, BeginLat
| summarize count_summary = count() by hash = geo_point_to_s2cell(BeginLon, BeginLat, 8)
| project geo_s2cell_to_central_point(hash), count_summary
| extend Events = "count"
| render piechart with (kind = map)
Mostrar puntos cercanos en un LineString
La consulta siguiente busca eventos de tormenta cercanos que se producen a lo largo de una lineString especificada, que representa una ruta de acceso definida. En este caso, LineString es un camino hacia Key West. La función geo_distance_point_to_line() se usa para filtrar los eventos de storm en función de su proximidad a lineString definido. Si un evento está a 500 metros de LineString, el evento se representa en un mapa.
let roadToKeyWest = dynamic({
"type":"linestring",
"coordinates":[
[
-81.79595947265625,
24.56461038017685
],
[
-81.595458984375,
24.627044746156027
],
[
-81.52130126953125,
24.666986385216273
],
[
-81.35650634765625,
24.66449040712424
],
[
-81.32354736328125,
24.647017162630366
],
[
-80.8099365234375,
24.821639356846607
],
[
-80.62042236328125,
24.93127614538456
],
[
-80.37872314453125,
25.175116531621764
],
[
-80.42266845703124,
25.19251511519153
],
[
-80.4803466796875,
25.46063471847754
]
]});
StormEvents
| where isnotempty(BeginLat) and isnotempty(BeginLon)
| project BeginLon, BeginLat, EventType
| where geo_distance_point_to_line(BeginLon, BeginLat, roadToKeyWest) < 500
| render scatterchart with (kind=map)
Mostrar puntos cercanos en un polígono
La consulta siguiente busca eventos de tormenta cercanos que se producen dentro de un polígono especificado. En este caso, el polígono es un camino a Key West. La función geo_distance_point_to_polygon() se usa para filtrar los eventos de storm en función de su proximidad al polígono definido. Si un evento está dentro de 500 metros del polígono, el evento se representa en un mapa.
let roadToKeyWest = dynamic({
"type":"polygon",
"coordinates":[
[
[
-80.08209228515625,
25.39117928167583
],
[
-80.4913330078125,
25.517657429994035
],
[
-80.57922363281249,
25.477992320574817
],
[
-82.188720703125,
24.632038149596895
],
[
-82.1942138671875,
24.53712939907993
],
[
-82.13104248046875,
24.412140070651528
],
[
-81.81243896484375,
24.43714786161562
],
[
-80.58746337890625,
24.794214972389486
],
[
-80.08209228515625,
25.39117928167583
]
]
]});
StormEvents
| where isnotempty(BeginLat) and isnotempty(BeginLon)
| project BeginLon, BeginLat, EventType
| where geo_distance_point_to_polygon(BeginLon, BeginLat, roadToKeyWest) < 500
| render scatterchart with (kind=map)
Búsqueda de anomalías basadas en datos geoespaciales
La consulta siguiente realiza un análisis de eventos de tormenta que se producen dentro de un estado determinado. La consulta usa celdas S2 y agregaciones temporales para investigar patrones de daño. El resultado es un gráfico de anomalías visuales que representa cualquier irregularidad o desviación en la destrucción provocada por tormentas a lo largo del tiempo, ofreciendo una perspectiva detallada sobre el efecto de las tormentas dentro de los límites de estado especificados.
let stateOfInterest = "Texas";
let statePolygon = materialize(
US_States
| extend name = tostring(features.properties.NAME)
| where name == stateOfInterest
| project geometry=features.geometry);
let stateCoveringS2cells = statePolygon
| project s2Cells = geo_polygon_to_s2cells(geometry, 9);
StormEvents
| extend s2Cell = geo_point_to_s2cell(BeginLon, BeginLat, 9)
| where s2Cell in (stateCoveringS2cells)
| where geo_point_in_polygon(BeginLon, BeginLat, toscalar(statePolygon))
| make-series damage = avg(DamageProperty + DamageCrops) default = double(0.0) on StartTime step 7d
| extend anomalies=series_decompose_anomalies(damage)
| render anomalychart with (anomalycolumns=anomalies)
Contenido relacionado
- Consulte un caso de uso para la agrupación en clústeres geoespaciales: Análisis de datos para flotas de pruebas automotrices
- Más información sobre la arquitectura de Azure para el procesamiento y el análisis de datos geoespaciales
- Obtenga una comprensión completa de Azure Data Explorer mediante la lectura de las notas del producto