Share via


Tutoriel : Créer des visualisations géospatiales

Ce tutoriel s’adresse à ceux qui souhaitent utiliser Langage de requête Kusto (KQL) pour la visualisation géospatiale. Les clustering géospatiales sont un moyen d’organiser et d’analyser des données en fonction de leur emplacement géographique. KQL offre plusieurs méthodes pour effectuer des clustering géospatiales et des outils pour les visualisations géospatiales.

Ce didacticiel vous montre comment effectuer les opérations suivantes :

Tracer des points sur une carte

Pour visualiser des points sur une carte, utilisez project pour sélectionner la colonne contenant la longitude, puis la colonne contenant la latitude. Ensuite, utilisez render pour afficher vos résultats dans un nuage de points avec kind défini sur map.

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

Capture d’écran d’exemples d’événements storm sur une carte.

Tracer plusieurs séries de points

Pour visualiser plusieurs séries de points, utilisez project pour sélectionner la longitude et la latitude ainsi qu’une troisième colonne, qui définit la série.

Dans la requête suivante, la série est EventType. Les points sont colorés différemment en fonction de leur EventType, et lorsqu’ils sont sélectionnés, affichent le contenu de la EventType colonne.

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

Capture d’écran d’exemples d’événements storm sur une carte par type.

Vous pouvez également spécifier explicitement ( xcolumn Longitude), ycolumn (Latitude) et series lors de l’exécution de render. Cette spécification est nécessaire lorsqu’il y a plus de colonnes dans le résultat que les colonnes de longitude, de latitude et de série.

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

Utiliser des valeurs GeoJSON pour tracer des points sur une carte

Une valeur GeoJSON dynamique peut changer ou être mise à jour et est souvent utilisée pour les applications de mappage en temps réel. Le mappage des points à l’aide de valeurs GeoJSON dynamiques offre plus de flexibilité et de contrôle sur la représentation des données sur la carte, ce qui peut ne pas être possible avec des valeurs de latitude et de longitude simples.

La requête suivante utilise les geo_point_to_s2cell et geo_s2cell_to_central_point pour mapper les événements de tempête dans un graphique à nuages de points.

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)

Capture d’écran des exemples d’événements storm affichés à l’aide de geojson.

Représenter des points de données avec des bulles de taille variable

Visualisez la distribution des points de données en effectuant une agrégation dans chaque cluster, puis en traquant le point central du cluster.

Par exemple, la requête suivante filtre tous les événements de tempête du type d’événement « Tornado ». Il regroupe ensuite les événements en clusters en fonction de leur longitude et de leur latitude, compte le nombre d’événements dans chaque cluster, projette le point central du cluster et affiche une carte pour visualiser le résultat. Les régions qui ont le plus de tornades sont clairement détectées en fonction de leur grande taille de bulles.

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)

Capture d’écran de l’interface utilisateur web d’Azure Data Explorer montrant une carte géospatiale des tempêtes de tornades.

Afficher des points dans une zone spécifique

Utilisez un polygone pour définir la région et la fonction geo_point_in_polygon afin de filtrer les événements qui se produisent dans cette région.

La requête suivante définit un polygone représentant la région du sud de la Californie et filtre les événements de tempête au sein de cette région. Il regroupe ensuite les événements en clusters, compte le nombre d’événements dans chaque cluster, projette le point central du cluster et affiche une carte pour visualiser les clusters.

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)

Capture d’écran de l’interface utilisateur web Azure Data Explorer montrant une carte géospatiale des tempêtes du sud de la Californie.

Afficher les points à proximité d’un LineString

La requête suivante recherche les événements storm à proximité qui se produisent le long d’un LineString spécifié, qui représente un chemin défini. Dans ce cas, le LineString est une route vers Key West. La fonction geo_distance_point_to_line() est utilisée pour filtrer les événements storm en fonction de leur proximité avec le LineString défini. Si un événement se trouve à moins de 500 mètres de LineString, l’événement est rendu sur une carte.

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)

Capture d’écran du résultat de la requête KQL précédente pour calculer les événements le long d’une LineString.

Afficher les points proches dans un polygone

La requête suivante recherche les événements storm à proximité qui se produisent dans un polygone spécifié. Dans ce cas, le polygone est une route vers Key West. La fonction geo_distance_point_to_polygon() est utilisée pour filtrer les événements storm en fonction de leur proximité avec le polygone défini. Si un événement se trouve à moins de 500 mètres du polygone, l’événement est rendu sur une carte.

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)

Capture d’écran du résultat de la requête KQL précédente pour calculer des événements le long d’un polygone.

Rechercher des anomalies basées sur des données géospatiales

La requête suivante effectue une analyse des événements de tempête qui se produisent dans un état particulier. La requête utilise des cellules S2 et l’agrégation temporelle pour examiner les modèles de dommages. Le résultat est un graphique d’anomalies visuelles qui représente les irrégularités ou les écarts dans les destructions provoquées par une tempête au fil du temps, offrant une perspective détaillée sur l’effet des tempêtes dans les limites d’état spécifiées.

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)

Capture d’écran du graphique d’anomalie rendu par la requête KQL précédente.