Share via


Tutorial: Erstellen von räumlichen Visualisierungen

Dieses Tutorial richtet sich an diejenigen, die Kusto-Abfragesprache (KQL) für die räumliche Visualisierung verwenden möchten. Geodatenclustering ist eine Möglichkeit, Daten basierend auf dem geografischen Standort zu organisieren und zu analysieren. KQL bietet mehrere Methoden zum Durchführen von Geoclustering und Tools für räumliche Visualisierungen.

In diesem Tutorial lernen Sie Folgendes:

Plotpunkte auf einer Karte

Um Punkte auf einer Karte zu visualisieren, verwenden Sie project , um die Spalte auszuwählen, die den Längengrad und dann die Spalte mit dem Breitengrad enthält. Verwenden Sie dann rendern , um Ihre Ergebnisse in einem Punktdiagramm mit kind festgelegt auf anzuzeigen map.

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

Screenshot: Beispielsturmereignisse auf einer Karte

Zeichnen mehrerer Punktreihen

Um mehrere Punktreihen zu visualisieren, verwenden Sie project , um den Längen- und Breitengrad zusammen mit einer dritten Spalte auszuwählen, die die Reihe definiert.

In der folgenden Abfrage ist EventTypedie Reihe . Die Punkte sind je nach ihrem EventTypeFarbton unterschiedlich gefärbt, und bei Auswahl wird der Inhalt der EventType Spalte angezeigt.

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

Screenshot: Beispielsturmereignisse auf einer Karte nach Typ.

Sie können auch explizit ( xcolumn Längengrad), ycolumn (Breitengrad) und series beim Ausführen von renderangeben. Diese Spezifikation ist erforderlich, wenn im Ergebnis mehr Spalten enthalten sind als nur die Spalten Längengrad, Breitengrad und Reihen.

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

Verwenden von GeoJSON-Werten zum Zeichnen von Punkten auf einer Karte

Ein dynamischer GeoJSON-Wert kann geändert oder aktualisiert werden und wird häufig für Echtzeitzuordnungsanwendungen verwendet. Die Zuordnung von Punkten mit dynamischen GeoJSON-Werten ermöglicht mehr Flexibilität und Kontrolle über die Darstellung der Daten auf der Karte, die mit einfachen Breiten- und Längengradwerten möglicherweise nicht möglich ist.

Die folgende Abfrage verwendet die geo_point_to_s2cell und geo_s2cell_to_central_point , um Sturmereignisse in einem Punktdiagramm zuzuordnen.

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)

Screenshot: Beispielsturmereignisse, die mithilfe von geojson angezeigt werden

Darstellen von Datenpunkten mit Blasen variabler Größe

Visualisieren Sie die Verteilung von Datenpunkten, indem Sie eine Aggregation in jedem Cluster ausführen und dann den zentralen Punkt des Clusters zeichnen.

Beispielsweise filtert die folgende Abfrage nach allen Sturmereignissen des Ereignistyps "Tornado". Anschließend werden die Ereignisse basierend auf ihrem Längen- und Breitengrad in Clustern gruppiert, die Anzahl der Ereignisse in jedem Cluster gezählt und der zentrale Punkt des Clusters projiziert und eine Zuordnung gerendert, um das Ergebnis zu visualisieren. Die Regionen mit den meisten Tornados werden anhand ihrer großen Blasengröße eindeutig erkannt.

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)

Screenshot: Azure Data Explorer-Weboberfläche mit einer geografischen Karte von Tornadostürmen

Anzeigen von Punkten innerhalb eines bestimmten Bereichs

Verwenden Sie ein Polygon, um die Region und die geo_point_in_polygon Funktion zu definieren, um nach Ereignissen zu filtern, die innerhalb dieser Region auftreten.

Die folgende Abfrage definiert ein Polygon, das die Region Südkalifornien darstellt, und filtert nach Sturmereignissen in dieser Region. Anschließend gruppiert er die Ereignisse in Clustern, zählt die Anzahl der Ereignisse in jedem Cluster, projiziert den zentralen Punkt des Clusters und rendert eine Zuordnung, um die Cluster zu visualisieren.

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)

Screenshot: Azure Data Explorer-Weboberfläche mit einer geografischen Karte von Stürmen in Südkalifornien

Anzeigen nahe gelegener Punkte auf einem LineString

Die folgende Abfrage findet storm-Ereignisse in der Nähe, die entlang einer angegebenen LineString auftreten, die einen definierten Pfad darstellt. In diesem Fall ist der LineString eine Straße nach Key West. Die funktion geo_distance_point_to_line() wird verwendet, um die Stormereignisse basierend auf ihrer Nähe zum definierten LineString zu filtern. Wenn sich ein Ereignis innerhalb von 500 Metern von LineString entfernt befindet, wird das Ereignis auf einer Karte gerendert.

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)

Screenshot: Ergebnis der vorherigen KQL-Abfrage zum Berechnen von Ereignissen entlang einer LineString

Anzeigen nahe gelegener Punkte in einem Polygon

Die folgende Abfrage findet In der Nähe von Sturmereignissen, die innerhalb eines angegebenen Polygons auftreten. In diesem Fall ist das Polygon eine Straße nach Key West. Die funktion geo_distance_point_to_polygon() wird verwendet, um die Sturmereignisse basierend auf ihrer Nähe zum definierten Polygon zu filtern. Wenn sich ein Ereignis innerhalb von 500 Metern um das Polygon befindet, wird das Ereignis auf einer Karte gerendert.

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)

Screenshot: Ergebnis der vorherigen KQL-Abfrage zum Berechnen von Ereignissen entlang eines Polygons

Suchen von Anomalien basierend auf Geodaten

Die folgende Abfrage führt eine Analyse von Sturmereignissen durch, die in einem bestimmten Zustand auftreten. Die Abfrage verwendet S2-Zellen und temporale Aggregation, um Schadensmuster zu untersuchen. Das Ergebnis ist ein visuelles Anomaliediagramm, das Unregelmäßigkeiten oder Abweichungen bei sturmbedingter Zerstörung im Laufe der Zeit darstellt und eine detaillierte Perspektive auf die Auswirkungen von Stürmen innerhalb der angegebenen Zustandsgrenzen bietet.

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)

Screenshot des Anomaliediagramms, das von der vorherigen KQL-Abfrage gerendert wurde.