Compartir a través de


Tutorial: Creación de visualizaciones geoespaciales

Se aplica a: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft 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:

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

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)

Captura de pantalla de eventos de storm de ejemplo en un mapa.

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 EventTypey, cuando se selecciona, muestran el contenido de la EventType columna.

StormEvents
| take 100
| project BeginLon, BeginLat, EventType
| render scatterchart with (kind = map)

Captura de pantalla de eventos de storm de ejemplo en un mapa por tipo.

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)

Captura de pantalla de eventos de storm de ejemplo que se muestran mediante geojson.

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)

Captura de pantalla de la interfaz de usuario web de Azure Data Explorer que muestra un mapa geoespacial de tormentas de tornados.

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)

Captura de pantalla de la interfaz de usuario web de Azure Data Explorer que muestra un mapa geoespacial de las tormentas del sur de California.

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)

Captura de pantalla del resultado de la consulta KQL anterior para calcular eventos a lo largo de una lineString.

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)

Captura de pantalla del resultado de la consulta KQL anterior para calcular eventos a lo largo de un polígono.

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)

Captura de pantalla del gráfico de anomalías representado por la consulta KQL anterior.